From 92931aeeb8ecae0cb3767206380d135130477693 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 5 May 2022 13:44:33 +0530 Subject: [PATCH] schema,server,api: events improvement (#127) Add resource ID and resource type to event. In UI, adds Events tab in resource view for the supporting resources. Following SQL changes needed to support events with resource details in DB, ``` -- Alter event table to add resource_id and resource_type ALTER TABLE `cloud`.`event` ADD COLUMN `resource_id` bigint unsigned COMMENT 'ID of the resource associated with the even' AFTER `domain_id`, ADD COLUMN `resource_type` varchar(32) COMMENT 'Account role in the project (Owner or Regular)' AFTER `resource_id`; DROP VIEW IF EXISTS `cloud`.`event_view`; CREATE VIEW `cloud`.`event_view` AS SELECT event.id, event.uuid, event.type, event.state, event.description, event.resource_id, event.resource_type, event.created, event.level, event.parameters, event.start_id, eve.uuid start_uuid, event.user_id, event.archived, event.display, user.username user_name, account.id account_id, account.uuid account_uuid, account.account_name account_name, account.type account_type, domain.id domain_id, domain.uuid domain_uuid, domain.name domain_name, domain.path domain_path, projects.id project_id, projects.uuid project_uuid, projects.name project_name FROM `cloud`.`event` INNER JOIN `cloud`.`account` ON event.account_id = account.id INNER JOIN `cloud`.`domain` ON event.domain_id = domain.id INNER JOIN `cloud`.`user` ON event.user_id = user.id LEFT JOIN `cloud`.`projects` ON projects.project_account_id = event.account_id LEFT JOIN `cloud`.`event` eve ON event.start_id = eve.id; ``` Signed-off-by: Abhishek Kumar --- .../java/com/cloud/event/ActionEvent.java | 4 + api/src/main/java/com/cloud/event/Event.java | 4 + .../main/java/com/cloud/event/EventTypes.java | 13 +- .../network/vpn/Site2SiteVpnService.java | 2 + .../cloudstack/api/ApiCommandJobType.java | 58 ---- .../api/ApiCommandResourceType.java | 118 +++++++ .../apache/cloudstack/api/ApiConstants.java | 1 + .../apache/cloudstack/api/BaseAsyncCmd.java | 15 - .../org/apache/cloudstack/api/BaseCmd.java | 27 +- .../apache/cloudstack/api/BaseListCmd.java | 5 - .../apache/cloudstack/api/IBaseListCmd.java | 2 - .../admin/account/CreateAccountCmd.java | 11 +- .../admin/account/DeleteAccountCmd.java | 8 +- .../admin/account/DisableAccountCmd.java | 11 +- .../admin/account/EnableAccountCmd.java | 11 + .../admin/account/UpdateAccountCmd.java | 11 + .../api/command/admin/acl/CreateRoleCmd.java | 9 +- .../api/command/admin/acl/DeleteRoleCmd.java | 16 +- .../api/command/admin/acl/UpdateRoleCmd.java | 14 +- .../admin/autoscale/CreateCounterCmd.java | 6 +- .../admin/autoscale/DeleteCounterCmd.java | 6 +- .../admin/backup/UpdateBackupOfferingCmd.java | 11 + .../admin/ca/ProvisionCertificateCmd.java | 6 +- .../command/admin/cluster/AddClusterCmd.java | 6 + .../admin/cluster/DeleteClusterCmd.java | 11 + .../admin/cluster/UpdateClusterCmd.java | 11 + .../diagnostics/GetDiagnosticsDataCmd.java | 20 +- .../admin/diagnostics/RunDiagnosticsCmd.java | 21 +- .../command/admin/domain/CreateDomainCmd.java | 6 + .../command/admin/domain/DeleteDomainCmd.java | 11 + .../command/admin/domain/UpdateDomainCmd.java | 11 + .../command/admin/guest/AddGuestOsCmd.java | 6 +- .../admin/guest/AddGuestOsMappingCmd.java | 6 +- .../command/admin/guest/RemoveGuestOsCmd.java | 6 +- .../admin/guest/RemoveGuestOsMappingCmd.java | 6 +- .../command/admin/guest/UpdateGuestOsCmd.java | 6 +- .../admin/guest/UpdateGuestOsMappingCmd.java | 6 +- .../admin/host/CancelHostAsDegradedCmd.java | 8 +- .../admin/host/CancelMaintenanceCmd.java | 8 +- .../admin/host/DeclareHostAsDegradedCmd.java | 8 +- .../command/admin/host/ListHostTagsCmd.java | 6 +- .../api/command/admin/host/ListHostsCmd.java | 6 +- .../admin/host/PrepareForMaintenanceCmd.java | 8 +- .../command/admin/host/ReconnectHostCmd.java | 8 +- .../admin/host/ReleaseHostReservationCmd.java | 8 +- .../internallb/ListInternalLBVMsCmd.java | 6 +- .../internallb/StartInternalLBVMCmd.java | 8 +- .../admin/internallb/StopInternalLBVMCmd.java | 8 +- .../admin/management/ListMgmtsCmd.java | 6 +- .../network/AddNetworkServiceProviderCmd.java | 6 +- .../network/CreatePhysicalNetworkCmd.java | 6 +- .../DeleteNetworkServiceProviderCmd.java | 6 +- .../network/DeletePhysicalNetworkCmd.java | 11 +- .../ReleaseDedicatedGuestVlanRangeCmd.java | 6 +- .../network/UpdateNetworkOfferingCmd.java | 11 + .../UpdateNetworkServiceProviderCmd.java | 6 +- .../network/UpdatePhysicalNetworkCmd.java | 6 +- .../admin/offering/CreateDiskOfferingCmd.java | 6 + .../admin/offering/UpdateDiskOfferingCmd.java | 11 + .../offering/UpdateServiceOfferingCmd.java | 11 + ...ssueOutOfBandManagementPowerActionCmd.java | 6 +- .../api/command/admin/pod/CreatePodCmd.java | 8 + .../api/command/admin/pod/DeletePodCmd.java | 11 + .../api/command/admin/pod/UpdatePodCmd.java | 11 + .../region/CreatePortableIpRangeCmd.java | 6 +- .../region/DeletePortableIpRangeCmd.java | 6 +- .../resource/StartRollingMaintenanceCmd.java | 57 +++- .../admin/router/ConfigureOvsElementCmd.java | 8 +- .../ConfigureVirtualRouterElementCmd.java | 8 +- .../admin/router/DestroyRouterCmd.java | 8 +- .../command/admin/router/ListRoutersCmd.java | 6 +- .../command/admin/router/RebootRouterCmd.java | 8 +- .../command/admin/router/StartRouterCmd.java | 8 +- .../command/admin/router/StopRouterCmd.java | 8 +- .../router/UpgradeRouterTemplateCmd.java | 6 +- .../CancelPrimaryStorageMaintenanceCmd.java | 8 +- .../FindStoragePoolsForMigrationCmd.java | 6 +- .../admin/storage/ListStoragePoolsCmd.java | 6 +- .../admin/storage/ListStorageTagsCmd.java | 6 +- .../MigrateSecondaryStorageDataCmd.java | 11 + ...reparePrimaryStorageForMaintenanceCmd.java | 8 +- .../admin/storage/UpdateStoragePoolCmd.java | 11 + .../admin/systemvm/DestroySystemVmCmd.java | 8 +- .../admin/systemvm/ListSystemVMsCmd.java | 6 +- .../admin/systemvm/RebootSystemVmCmd.java | 8 +- .../admin/systemvm/StartSystemVMCmd.java | 8 +- .../admin/systemvm/StopSystemVmCmd.java | 8 +- .../admin/usage/AddTrafficTypeCmd.java | 6 +- .../admin/usage/DeleteTrafficTypeCmd.java | 6 +- .../admin/usage/UpdateTrafficTypeCmd.java | 6 +- .../api/command/admin/user/CreateUserCmd.java | 6 + .../api/command/admin/user/DeleteUserCmd.java | 11 + .../command/admin/user/DisableUserCmd.java | 6 +- .../api/command/admin/user/MoveUserCmd.java | 20 +- .../api/command/admin/user/RegisterCmd.java | 11 + .../api/command/admin/user/UpdateUserCmd.java | 11 + .../api/command/admin/vm/AssignVMCmd.java | 10 + .../api/command/admin/vm/ExpungeVMCmd.java | 8 +- .../api/command/admin/vm/MigrateVMCmd.java | 11 + .../MigrateVirtualMachineWithVolumeCmd.java | 11 + .../api/command/admin/vm/RecoverVMCmd.java | 11 + .../admin/vm/UnmanageVMInstanceCmd.java | 8 +- .../admin/vpc/CreatePrivateGatewayCmd.java | 6 +- .../admin/vpc/DeletePrivateGatewayCmd.java | 6 +- .../admin/vpc/DeleteVPCOfferingCmd.java | 10 + .../admin/vpc/UpdateVPCOfferingCmd.java | 11 + .../zone/MarkDefaultZoneForAccountCmd.java | 12 +- .../user/account/AddAccountToProjectCmd.java | 11 + .../user/account/AddUserToProjectCmd.java | 15 +- .../account/DeleteAccountFromProjectCmd.java | 11 + .../account/DeleteUserFromProjectCmd.java | 11 + .../command/user/account/ListAccountsCmd.java | 15 +- .../user/account/ListProjectAccountsCmd.java | 6 + .../user/address/AssociateIPAddrCmd.java | 6 +- .../user/address/DisassociateIPAddrCmd.java | 8 +- .../address/ListPublicIpAddressesCmd.java | 6 +- .../command/user/address/UpdateIPAddrCmd.java | 11 + .../affinitygroup/CreateAffinityGroupCmd.java | 6 +- .../affinitygroup/DeleteAffinityGroupCmd.java | 11 +- .../affinitygroup/ListAffinityGroupsCmd.java | 6 +- .../UpdateVMAffinityGroupCmd.java | 6 +- .../autoscale/CreateAutoScalePolicyCmd.java | 6 +- .../autoscale/CreateAutoScaleVmGroupCmd.java | 6 +- .../CreateAutoScaleVmProfileCmd.java | 6 +- .../user/autoscale/CreateConditionCmd.java | 6 +- .../autoscale/DeleteAutoScalePolicyCmd.java | 6 +- .../autoscale/DeleteAutoScaleVmGroupCmd.java | 6 +- .../DeleteAutoScaleVmProfileCmd.java | 6 +- .../user/autoscale/DeleteConditionCmd.java | 6 +- .../autoscale/DisableAutoScaleVmGroupCmd.java | 6 +- .../autoscale/EnableAutoScaleVmGroupCmd.java | 6 +- .../autoscale/UpdateAutoScalePolicyCmd.java | 6 +- .../autoscale/UpdateAutoScaleVmGroupCmd.java | 6 +- .../UpdateAutoScaleVmProfileCmd.java | 6 +- .../command/user/backup/CreateBackupCmd.java | 6 +- .../api/command/user/event/ListEventsCmd.java | 17 +- .../firewall/CreateEgressFirewallRuleCmd.java | 6 +- .../user/firewall/CreateFirewallRuleCmd.java | 6 +- .../firewall/CreatePortForwardingRuleCmd.java | 6 +- .../firewall/DeleteEgressFirewallRuleCmd.java | 6 +- .../user/firewall/DeleteFirewallRuleCmd.java | 6 +- .../firewall/DeletePortForwardingRuleCmd.java | 6 +- .../api/command/user/iso/AttachIsoCmd.java | 11 + .../api/command/user/iso/DeleteIsoCmd.java | 8 +- .../api/command/user/iso/DetachIsoCmd.java | 11 + .../api/command/user/iso/ExtractIsoCmd.java | 8 +- .../api/command/user/iso/ListIsosCmd.java | 6 +- .../api/command/user/iso/RegisterIsoCmd.java | 6 + .../api/command/user/iso/UpdateIsoCmd.java | 11 + .../CreateApplicationLoadBalancerCmd.java | 6 +- .../CreateLoadBalancerRuleCmd.java | 6 +- .../DeleteApplicationLoadBalancerCmd.java | 6 +- .../DeleteLoadBalancerRuleCmd.java | 6 +- .../user/nat/CreateIpForwardingRuleCmd.java | 6 +- .../user/nat/DeleteIpForwardingRuleCmd.java | 6 +- .../command/user/nat/DisableStaticNatCmd.java | 15 + .../command/user/nat/EnableStaticNatCmd.java | 10 + .../user/network/CreateNetworkACLCmd.java | 6 + .../user/network/CreateNetworkACLListCmd.java | 11 + .../user/network/DeleteNetworkACLCmd.java | 11 + .../user/network/DeleteNetworkACLListCmd.java | 11 + .../user/network/DeleteNetworkCmd.java | 8 +- .../user/network/MoveNetworkAclItemCmd.java | 6 + .../user/network/RestartNetworkCmd.java | 11 + .../user/network/UpdateNetworkACLItemCmd.java | 11 + .../user/network/UpdateNetworkACLListCmd.java | 11 + .../user/network/UpdateNetworkCmd.java | 11 + .../gslb/CreateGlobalLoadBalancerRuleCmd.java | 6 +- .../gslb/DeleteGlobalLoadBalancerRuleCmd.java | 6 +- .../AuthorizeSecurityGroupEgressCmd.java | 8 +- .../AuthorizeSecurityGroupIngressCmd.java | 8 +- .../securitygroup/ListSecurityGroupsCmd.java | 6 +- .../RevokeSecurityGroupEgressCmd.java | 8 +- .../RevokeSecurityGroupIngressCmd.java | 8 +- .../user/snapshot/CreateSnapshotCmd.java | 6 +- .../CreateSnapshotFromVMSnapshotCmd.java | 6 +- .../snapshot/CreateSnapshotPolicyCmd.java | 11 + .../user/snapshot/DeleteSnapshotCmd.java | 8 +- .../user/snapshot/ListSnapshotsCmd.java | 6 +- .../user/snapshot/RevertSnapshotCmd.java | 8 +- .../snapshot/UpdateSnapshotPolicyCmd.java | 2 +- .../user/template/CopyTemplateCmd.java | 13 +- .../user/template/CreateTemplateCmd.java | 6 +- .../user/template/DeleteTemplateCmd.java | 8 +- .../user/template/ExtractTemplateCmd.java | 13 +- .../user/template/ListTemplatesCmd.java | 6 +- .../user/template/RegisterTemplateCmd.java | 6 +- .../user/template/UpdateTemplateCmd.java | 11 + .../api/command/user/vm/AddIpToVmNicCmd.java | 6 +- .../api/command/user/vm/AddNicToVMCmd.java | 16 +- .../api/command/user/vm/DeployVMCmd.java | 6 +- .../api/command/user/vm/DestroyVMCmd.java | 8 +- .../api/command/user/vm/ListNicsCmd.java | 6 +- .../api/command/user/vm/ListVMsCmd.java | 21 +- .../api/command/user/vm/RebootVMCmd.java | 8 +- .../command/user/vm/RemoveIpFromVmNicCmd.java | 6 +- .../command/user/vm/ResetVMPasswordCmd.java | 8 +- .../api/command/user/vm/ResetVMSSHKeyCmd.java | 8 +- .../api/command/user/vm/RestoreVMCmd.java | 11 + .../api/command/user/vm/ScaleVMCmd.java | 16 +- .../api/command/user/vm/StartVMCmd.java | 8 +- .../api/command/user/vm/StopVMCmd.java | 8 +- .../api/command/user/vm/UpdateVMCmd.java | 16 +- .../api/command/user/vm/UpdateVmNicIpCmd.java | 6 +- .../user/vmsnapshot/CreateVMSnapshotCmd.java | 10 +- .../user/vmsnapshot/DeleteVMSnapshotCmd.java | 10 + .../vmsnapshot/RevertToVMSnapshotCmd.java | 10 + .../command/user/volume/AttachVolumeCmd.java | 8 +- .../command/user/volume/CreateVolumeCmd.java | 6 +- .../command/user/volume/DeleteVolumeCmd.java | 11 + .../command/user/volume/DestroyVolumeCmd.java | 8 +- .../command/user/volume/DetachVolumeCmd.java | 8 +- .../command/user/volume/ExtractVolumeCmd.java | 8 +- .../command/user/volume/ListVolumesCmd.java | 7 +- .../command/user/volume/MigrateVolumeCmd.java | 13 +- .../command/user/volume/RecoverVolumeCmd.java | 11 + .../user/volume/RemoveResourceDetailCmd.java | 6 +- .../command/user/volume/ResizeVolumeCmd.java | 11 +- .../command/user/volume/UpdateVolumeCmd.java | 8 +- .../command/user/volume/UploadVolumeCmd.java | 10 +- .../user/vpc/CreateStaticRouteCmd.java | 6 +- .../user/vpc/DeleteStaticRouteCmd.java | 6 +- .../api/command/user/vpc/DeleteVPCCmd.java | 11 + .../api/command/user/vpc/RestartVPCCmd.java | 11 + .../api/command/user/vpc/UpdateVPCCmd.java | 11 + .../user/vpn/CreateRemoteAccessVpnCmd.java | 11 + .../user/vpn/CreateVpnCustomerGatewayCmd.java | 29 +- .../user/vpn/DeleteRemoteAccessVpnCmd.java | 10 + .../user/vpn/DeleteVpnCustomerGatewayCmd.java | 11 + .../user/vpn/UpdateVpnCustomerGatewayCmd.java | 11 + .../api/response/EventResponse.java | 39 ++- .../cloudstack/context/CallContext.java | 19 ++ .../api/ApiCommandResourceTypeTest.java | 71 ++++ .../main/java/com/cloud/event/EventVO.java | 24 ++ .../java/com/cloud/dao/EntityManagerImpl.java | 9 +- .../jobs/impl/AsyncJobManagerImpl.java | 4 +- .../cluster/CreateKubernetesClusterCmd.java | 20 +- .../guru/BigSwitchBcfGuestNetworkGuru.java | 3 +- .../api/command/CreateServiceInstanceCmd.java | 5 + .../api/commands/StopNetScalerVMCmd.java | 8 +- .../network/guru/OvsGuestNetworkGuru.java | 15 +- .../network/guru/VxlanGuestNetworkGuru.java | 10 +- .../api/command/LinkAccountToLdapCmd.java | 26 +- .../command/ListAndSwitchSAMLAccountCmd.java | 48 +-- .../com/cloud/api/ApiAsyncJobDispatcher.java | 8 +- .../main/java/com/cloud/api/ApiDBUtils.java | 52 +-- .../java/com/cloud/api/ApiDispatcher.java | 15 +- .../main/java/com/cloud/api/ApiServer.java | 10 +- .../com/cloud/api/query/QueryManagerImpl.java | 70 +++- .../cloud/api/query/vo/AsyncJobJoinVO.java | 6 +- .../com/cloud/api/query/vo/EventJoinVO.java | 14 + .../ConfigurationManagerImpl.java | 65 ++-- .../cloud/event/ActionEventInterceptor.java | 40 ++- .../com/cloud/event/ActionEventUtils.java | 238 +++++++++---- .../com/cloud/event/dao/EventJoinDaoImpl.java | 43 ++- .../cloud/network/IpAddressManagerImpl.java | 3 +- .../com/cloud/network/NetworkServiceImpl.java | 15 +- .../network/firewall/FirewallManagerImpl.java | 1 + .../guru/ExternalGuestNetworkGuru.java | 17 +- .../cloud/network/guru/GuestNetworkGuru.java | 8 +- .../VirtualNetworkApplianceManagerImpl.java | 13 +- .../network/vpc/NetworkACLManagerImpl.java | 2 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 5 +- .../network/vpn/Site2SiteVpnManagerImpl.java | 8 +- .../cloud/resource/ResourceManagerImpl.java | 5 +- .../RollingMaintenanceManagerImpl.java | 47 +-- .../resourceicon/ResourceIconManagerImpl.java | 43 ++- .../cloud/server/ManagementServerImpl.java | 17 +- .../cloud/storage/VolumeApiServiceImpl.java | 24 +- .../storage/snapshot/SnapshotManagerImpl.java | 10 +- .../snapshot/SnapshotSchedulerImpl.java | 10 +- .../cloud/tags/ResourceManagerUtilImpl.java | 36 +- .../cloud/template/TemplateManagerImpl.java | 3 + .../com/cloud/user/AccountManagerImpl.java | 10 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 5 +- .../vm/snapshot/VMSnapshotManagerImpl.java | 11 +- .../cloudstack/acl/RoleManagerImpl.java | 4 +- .../affinity/AffinityGroupServiceImpl.java | 6 +- .../annotation/AnnotationManagerImpl.java | 91 +++-- .../cloudstack/backup/BackupManagerImpl.java | 13 +- .../download/DirectDownloadManagerImpl.java | 3 +- .../apache/cloudstack/ha/HAManagerImpl.java | 17 +- .../OutOfBandManagementServiceImpl.java | 73 ++-- .../PowerOperationTask.java | 8 +- .../java/com/cloud/api/ApiDispatcherTest.java | 94 ++++++ .../cloud/api/query/QueryManagerImplTest.java | 190 +++++++++++ .../event/ActionEventInterceptorTest.java | 319 ++++++++++++++++++ .../com/cloud/event/ActionEventUtilsTest.java | 200 ++++++++++- .../cloud/event/dao/EventJoinDaoImplTest.java | 69 ++++ .../resource/ResourceManagerImplTest.java | 6 +- .../ResourceIconManagerImplTest.java | 132 ++++++++ .../storage/dao/AsyncJobJoinDaoTest.java | 4 +- .../vpc/MockSite2SiteVpnManagerImpl.java | 9 + .../annotation/AnnotationManagerImplTest.java | 192 +++++++++++ .../integration/smoke/test_events_resource.py | 197 +++++++++++ ui/public/locales/en.json | 5 + ui/src/components/view/EventsTab.vue | 151 +++++++++ ui/src/components/view/InfoCard.vue | 13 +- ui/src/components/view/ListView.vue | 8 +- ui/src/components/view/ResourceView.vue | 9 +- ui/src/components/view/SearchView.vue | 29 ++ ui/src/components/view/TreeView.vue | 15 + ui/src/components/widgets/ResourceLabel.vue | 69 ++++ ui/src/config/section/account.js | 8 + ui/src/config/section/domain.js | 10 +- ui/src/config/section/event.js | 6 +- ui/src/config/section/image.js | 12 + ui/src/config/section/infra/pods.js | 7 + .../config/section/infra/primaryStorages.js | 5 + ui/src/config/section/infra/routers.js | 7 + .../config/section/infra/secondaryStorages.js | 5 + ui/src/config/section/infra/systemVms.js | 8 + ui/src/config/section/infra/zones.js | 5 + ui/src/config/section/network.js | 12 + ui/src/config/section/project.js | 6 + ui/src/config/section/storage.js | 18 + ui/src/config/section/user.js | 14 + ui/src/utils/plugins.js | 56 +++ ui/src/views/compute/InstanceTab.vue | 5 + ui/src/views/dashboard/CapacityDashboard.vue | 7 +- ui/src/views/dashboard/UsageDashboard.vue | 5 +- ui/src/views/network/VpcTab.vue | 5 + .../com/cloud/utils/db/EntityManager.java | 2 + 323 files changed, 4410 insertions(+), 1061 deletions(-) delete mode 100644 api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java create mode 100644 api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java create mode 100644 api/src/test/java/org/apache/cloudstack/api/ApiCommandResourceTypeTest.java create mode 100644 server/src/test/java/com/cloud/api/ApiDispatcherTest.java create mode 100644 server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java create mode 100644 server/src/test/java/com/cloud/event/ActionEventInterceptorTest.java create mode 100644 server/src/test/java/com/cloud/event/dao/EventJoinDaoImplTest.java create mode 100644 server/src/test/java/com/cloud/resourceicon/ResourceIconManagerImplTest.java create mode 100644 server/src/test/java/org/apache/cloudstack/annotation/AnnotationManagerImplTest.java create mode 100644 test/integration/smoke/test_events_resource.py create mode 100644 ui/src/components/view/EventsTab.vue create mode 100644 ui/src/components/widgets/ResourceLabel.vue diff --git a/api/src/main/java/com/cloud/event/ActionEvent.java b/api/src/main/java/com/cloud/event/ActionEvent.java index 8fe14dd800b..e72cdd92bf0 100644 --- a/api/src/main/java/com/cloud/event/ActionEvent.java +++ b/api/src/main/java/com/cloud/event/ActionEvent.java @@ -33,4 +33,8 @@ public @interface ActionEvent { String eventType(); String eventDescription(); + + long resourceId() default -1; + + String resourceType() default ""; } diff --git a/api/src/main/java/com/cloud/event/Event.java b/api/src/main/java/com/cloud/event/Event.java index bd86a7ffadf..0d1fb11a1b1 100644 --- a/api/src/main/java/com/cloud/event/Event.java +++ b/api/src/main/java/com/cloud/event/Event.java @@ -33,6 +33,10 @@ public interface Event extends ControlledEntity, Identity, InternalIdentity { String getDescription(); + Long getResourceId(); + + String getResourceType(); + Date getCreateDate(); long getUserId(); diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java index 7533e58d4f3..e21d86bd67e 100644 --- a/api/src/main/java/com/cloud/event/EventTypes.java +++ b/api/src/main/java/com/cloud/event/EventTypes.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RolePermission; +import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.annotation.Annotation; import org.apache.cloudstack.api.response.ClusterResponse; import org.apache.cloudstack.api.response.HostResponse; @@ -63,6 +64,7 @@ import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRoute; import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.VpcOffering; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; @@ -966,9 +968,9 @@ public class EventTypes { entityEventDetails.put(EVENT_VPC_RESTART, Vpc.class); // VPC offerings - entityEventDetails.put(EVENT_VPC_OFFERING_CREATE, Vpc.class); - entityEventDetails.put(EVENT_VPC_OFFERING_UPDATE, Vpc.class); - entityEventDetails.put(EVENT_VPC_OFFERING_DELETE, Vpc.class); + entityEventDetails.put(EVENT_VPC_OFFERING_CREATE, VpcOffering.class); + entityEventDetails.put(EVENT_VPC_OFFERING_UPDATE, VpcOffering.class); + entityEventDetails.put(EVENT_VPC_OFFERING_DELETE, VpcOffering.class); // Private gateway entityEventDetails.put(EVENT_PRIVATE_GATEWAY_CREATE, PrivateGateway.class); @@ -1008,6 +1010,11 @@ public class EventTypes { entityEventDetails.put(EVENT_GUEST_VLAN_RANGE_DEDICATE, GuestVlan.class); entityEventDetails.put(EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE, GuestVlan.class); + entityEventDetails.put(EVENT_AFFINITY_GROUP_CREATE, AffinityGroup.class); + entityEventDetails.put(EVENT_AFFINITY_GROUP_DELETE, AffinityGroup.class); + entityEventDetails.put(EVENT_AFFINITY_GROUP_ASSIGN, AffinityGroup.class); + entityEventDetails.put(EVENT_AFFINITY_GROUP_REMOVE, AffinityGroup.class); + // OpenDaylight entityEventDetails.put(EVENT_EXTERNAL_OPENDAYLIGHT_ADD_CONTROLLER, "OpenDaylightController"); entityEventDetails.put(EVENT_EXTERNAL_OPENDAYLIGHT_DELETE_CONTROLLER, "OpenDaylightController"); diff --git a/api/src/main/java/com/cloud/network/vpn/Site2SiteVpnService.java b/api/src/main/java/com/cloud/network/vpn/Site2SiteVpnService.java index abdc7568766..73cc61a7869 100644 --- a/api/src/main/java/com/cloud/network/vpn/Site2SiteVpnService.java +++ b/api/src/main/java/com/cloud/network/vpn/Site2SiteVpnService.java @@ -46,6 +46,8 @@ public interface Site2SiteVpnService { Site2SiteVpnGateway getVpnGateway(Long vpnGatewayId); + Site2SiteCustomerGateway getCustomerGateway(Long customerGatewayId); + Site2SiteVpnConnection createVpnConnection(CreateVpnConnectionCmd cmd) throws NetworkRuleConflictException; boolean deleteCustomerGateway(DeleteVpnCustomerGatewayCmd deleteVpnCustomerGatewayCmd); diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java b/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java deleted file mode 100644 index 1cac1daba19..00000000000 --- a/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java +++ /dev/null @@ -1,58 +0,0 @@ -// 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; - -public enum ApiCommandJobType { - None, - VirtualMachine, - DomainRouter, - Volume, - ConsoleProxy, - Snapshot, - Backup, - Template, - Iso, - SystemVm, - Host, - StoragePool, - ImageStore, - IpAddress, - PortableIpAddress, - SecurityGroup, - PhysicalNetwork, - TrafficType, - PhysicalNetworkServiceProvider, - FirewallRule, - Account, - User, - PrivateGateway, - StaticRoute, - Counter, - Condition, - AutoScalePolicy, - AutoScaleVmProfile, - AutoScaleVmGroup, - GlobalLoadBalancerRule, - LoadBalancerRule, - AffinityGroup, - InternalLbVm, - DedicatedGuestVlanRange, - GuestOs, - GuestOsMapping, - Network, - Management -} diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java new file mode 100644 index 00000000000..0a7ece7b7d8 --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java @@ -0,0 +1,118 @@ +// 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; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.cloudstack.region.PortableIp; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.StringUtils; + +public enum ApiCommandResourceType { + None(null), + VirtualMachine(com.cloud.vm.VirtualMachine.class), + DomainRouter(com.cloud.network.router.VirtualRouter.class), + Volume(com.cloud.storage.Volume.class), + ConsoleProxy(com.cloud.vm.VirtualMachine.class), + Snapshot(com.cloud.storage.Snapshot.class), + Backup(org.apache.cloudstack.backup.Backup.class), + Template(com.cloud.template.VirtualMachineTemplate.class), + Iso(com.cloud.template.VirtualMachineTemplate.class), + SystemVm(com.cloud.vm.VirtualMachine.class), + Host(com.cloud.host.Host.class), + StoragePool(com.cloud.storage.StoragePool.class), + ImageStore(com.cloud.storage.ImageStore.class), + IpAddress(com.cloud.network.IpAddress.class), + PortableIpAddress(PortableIp.class), + SecurityGroup(com.cloud.network.security.SecurityGroup.class), + PhysicalNetwork(com.cloud.network.PhysicalNetwork.class), + TrafficType(com.cloud.network.PhysicalNetworkTrafficType.class), + PhysicalNetworkServiceProvider(com.cloud.network.PhysicalNetworkServiceProvider.class), + FirewallRule(com.cloud.network.rules.FirewallRule.class), + Account(com.cloud.user.Account.class), + User(com.cloud.user.User.class), + PrivateGateway(com.cloud.network.vpc.PrivateGateway.class), + StaticRoute(com.cloud.network.vpc.StaticRoute.class), + Counter(com.cloud.network.as.Counter.class), + Condition(com.cloud.network.as.Condition.class), + AutoScalePolicy(com.cloud.network.as.AutoScalePolicy.class), + AutoScaleVmProfile(com.cloud.network.as.AutoScaleVmProfile.class), + AutoScaleVmGroup(com.cloud.network.as.AutoScaleVmGroup.class), + GlobalLoadBalancerRule(com.cloud.region.ha.GlobalLoadBalancerRule.class), + LoadBalancerRule(com.cloud.network.lb.LoadBalancingRule.class), + AffinityGroup(org.apache.cloudstack.affinity.AffinityGroup.class), + InternalLbVm(com.cloud.network.router.VirtualRouter.class), + DedicatedGuestVlanRange(com.cloud.network.GuestVlan.class), + GuestOs(com.cloud.storage.GuestOS.class), + GuestOsMapping(com.cloud.storage.GuestOSHypervisor.class), + Network(com.cloud.network.Network.class), + NetworkAcl(com.cloud.network.vpc.NetworkACL.class), + NetworkAclItem(com.cloud.network.vpc.NetworkACLItem.class), + Project(com.cloud.projects.Project.class), + Domain(com.cloud.domain.Domain.class), + DiskOffering(com.cloud.offering.DiskOffering.class), + ServiceOffering(com.cloud.offering.ServiceOffering.class), + NetworkOffering(com.cloud.offering.NetworkOffering.class), + VpcOffering(com.cloud.network.vpc.VpcOffering.class), + BackupOffering(org.apache.cloudstack.backup.BackupOffering.class), + Zone(com.cloud.dc.DataCenter.class), + Vpc(com.cloud.network.vpc.Vpc.class), + Cluster(com.cloud.org.Cluster.class), + Pod(com.cloud.dc.Pod.class), + VmSnapshot(com.cloud.vm.snapshot.VMSnapshot.class), + Role(org.apache.cloudstack.acl.Role.class), + VpnCustomerGateway(com.cloud.network.Site2SiteCustomerGateway.class); + + private final Class clazz; + + private ApiCommandResourceType(Class clazz) { + this.clazz = clazz; + } + + public Class getAssociatedClass() { + return this.clazz; + } + + public static List valuesFromAssociatedClass(Class clazz) { + List types = new ArrayList<>(); + for (ApiCommandResourceType type : ApiCommandResourceType.values()) { + if (type.getAssociatedClass() == clazz) { + types.add(type); + } + } + return types; + } + + public static ApiCommandResourceType valueFromAssociatedClass(Class clazz) { + List types = valuesFromAssociatedClass(clazz); + return CollectionUtils.isEmpty(types) ? null : types.get(0); + } + + @Override + public String toString() { + return this.name(); + } + + public static ApiCommandResourceType fromString(String value) { + if (StringUtils.isNotEmpty(value) && EnumUtils.isValidEnum(ApiCommandResourceType.class, value)) { + return valueOf(value); + } + return null; + } +} diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 13282baa2b9..7580bc238d7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -321,6 +321,7 @@ public class ApiConstants { public static final String RECONNECT = "reconnect"; public static final String RECOVER = "recover"; public static final String REQUIRES_HVM = "requireshvm"; + public static final String RESOURCE_NAME = "resourcename"; public static final String RESOURCE_TYPE = "resourcetype"; public static final String RESOURCE_TYPE_NAME = "resourcetypename"; public static final String RESPONSE = "response"; diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseAsyncCmd.java b/api/src/main/java/org/apache/cloudstack/api/BaseAsyncCmd.java index 1c3822c1057..865ec745640 100644 --- a/api/src/main/java/org/apache/cloudstack/api/BaseAsyncCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/BaseAsyncCmd.java @@ -74,21 +74,6 @@ public abstract class BaseAsyncCmd extends BaseCmd { this.startEventId = startEventId; } - /** - * Async commands that want to be tracked as part of the listXXX commands need to - * provide implementations of the two following methods, getInstanceId() and getInstanceType() - * - * getObjectId() should return the id of the object the async command is executing on - * getObjectType() should return a type from the AsyncJob.Type enumeration - */ - public Long getInstanceId() { - return null; - } - - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.None; - } - public String getSyncObjType() { return null; } diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java index 475745d081a..da381b05e73 100644 --- a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java @@ -29,11 +29,6 @@ import java.util.regex.Pattern; import javax.inject.Inject; -import com.cloud.server.ManagementService; -import com.cloud.server.ResourceIconManager; -import com.cloud.server.ResourceManagerUtil; -import com.cloud.server.ResourceMetaDataService; -import com.cloud.server.TaggedResourceService; import org.apache.cloudstack.acl.ProjectRoleService; import org.apache.cloudstack.acl.RoleService; import org.apache.cloudstack.acl.RoleType; @@ -72,6 +67,11 @@ import com.cloud.network.vpn.RemoteAccessVpnService; import com.cloud.network.vpn.Site2SiteVpnService; import com.cloud.projects.ProjectService; import com.cloud.resource.ResourceService; +import com.cloud.server.ManagementService; +import com.cloud.server.ResourceIconManager; +import com.cloud.server.ResourceManagerUtil; +import com.cloud.server.ResourceMetaDataService; +import com.cloud.server.TaggedResourceService; import com.cloud.storage.DataStoreProviderApiService; import com.cloud.storage.StorageService; import com.cloud.storage.VolumeApiService; @@ -430,4 +430,21 @@ public abstract class BaseCmd { return null; } + /** + * Commands that generate action events associated to a resource and + * async commands that want to be tracked as part of the listXXX commands + * need to provide implementations of the two following methods, + * getApiResourceId() and getApiResourceType() + * + * getApiResourceId() should return the id of the object the async command is executing on + * getApiResourceType() should return a type from the ApiCommandResourceType enumeration + */ + public Long getApiResourceId() { + return null; + } + + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.None; + } + } diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseListCmd.java b/api/src/main/java/org/apache/cloudstack/api/BaseListCmd.java index bcebbb86003..9bd69dc9e49 100644 --- a/api/src/main/java/org/apache/cloudstack/api/BaseListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/BaseListCmd.java @@ -117,11 +117,6 @@ public abstract class BaseListCmd extends BaseCmd implements IBaseListCmd { return startIndex; } - @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.None; - } - @Override public void validateSpecificParameters(final Map params){ super.validateSpecificParameters(params); diff --git a/api/src/main/java/org/apache/cloudstack/api/IBaseListCmd.java b/api/src/main/java/org/apache/cloudstack/api/IBaseListCmd.java index 70957ea9153..bf87e116082 100644 --- a/api/src/main/java/org/apache/cloudstack/api/IBaseListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/IBaseListCmd.java @@ -27,6 +27,4 @@ public interface IBaseListCmd { Long getPageSizeVal(); Long getStartIndex(); - - ApiCommandJobType getInstanceType(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java index 159f17f728c..24659cb1bd8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java @@ -19,11 +19,9 @@ package org.apache.cloudstack.api.command.admin.account; import java.util.Collection; import java.util.Map; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; - 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; @@ -34,6 +32,8 @@ import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; import com.cloud.user.Account; import com.cloud.user.UserAccount; @@ -207,4 +207,9 @@ public class CreateAccountCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Neither account type and role ID are not provided"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java index 1896f97311c..22eec04c57b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java @@ -21,7 +21,7 @@ import javax.inject.Inject; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -110,12 +110,12 @@ public class DeleteAccountCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Account; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return id; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java index 3e5e1d3d017..f71484c2dea 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -133,7 +133,12 @@ public class DisableAccountCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Account; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } + + @Override + public Long getApiResourceId() { + return id; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java index f30c985c961..e9dc9f611d8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.admin.account; import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -108,4 +109,14 @@ public class EnableAccountCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to enable account"); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java index 43377dad8a3..0dd7a37bb91 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java @@ -21,6 +21,7 @@ import java.util.Map; import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.log4j.Logger; @@ -145,4 +146,14 @@ public class UpdateAccountCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update account"); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java index 69d70273264..73c5ca2d759 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java @@ -17,10 +17,10 @@ package org.apache.cloudstack.api.command.admin.acl; -import com.cloud.user.Account; import org.apache.cloudstack.acl.Role; 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; @@ -29,6 +29,8 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.cloudstack.context.CallContext; +import com.cloud.user.Account; + @APICommand(name = CreateRoleCmd.APINAME, description = "Creates a role", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", @@ -111,4 +113,9 @@ public class CreateRoleCmd extends RoleCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Role; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/DeleteRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/DeleteRoleCmd.java index bd4a7cdacb7..89f82500da8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/DeleteRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/DeleteRoleCmd.java @@ -17,20 +17,22 @@ package org.apache.cloudstack.api.command.admin.acl; -import com.cloud.user.Account; import org.apache.cloudstack.acl.Role; 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; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.cloudstack.context.CallContext; +import com.cloud.user.Account; + @APICommand(name = DeleteRoleCmd.APINAME, description = "Deletes a role", responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", @@ -80,4 +82,14 @@ public class DeleteRoleCmd extends BaseCmd { response.setSuccess(result); setResponseObject(response); } + + @Override + public Long getApiResourceId() { + return getRoleId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Role; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java index 0137d1e317c..7b7b4e44294 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java @@ -17,11 +17,11 @@ package org.apache.cloudstack.api.command.admin.acl; -import com.cloud.user.Account; import org.apache.cloudstack.acl.Role; 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; @@ -30,6 +30,8 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.cloudstack.context.CallContext; +import com.cloud.user.Account; + @APICommand(name = UpdateRoleCmd.APINAME, description = "Updates a role", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", @@ -87,4 +89,14 @@ public class UpdateRoleCmd extends RoleCmd { role = roleService.updateRole(role, getRoleName(), getRoleType(), getRoleDescription()); setupResponse(role); } + + @Override + public Long getApiResourceId() { + return getRoleId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Role; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java index ea715663d9c..6c49a23aa58 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/CreateCounterCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.autoscale; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -97,8 +97,8 @@ public class CreateCounterCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Counter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Counter; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/DeleteCounterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/DeleteCounterCmd.java index 3547ef10c8c..6575bf940ba 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/DeleteCounterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/autoscale/DeleteCounterCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.autoscale; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -83,8 +83,8 @@ public class DeleteCounterCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Counter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Counter; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/backup/UpdateBackupOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/backup/UpdateBackupOfferingCmd.java index 6e4baaedd3d..76669ef5662 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/backup/UpdateBackupOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/backup/UpdateBackupOfferingCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.admin.backup; import javax.inject.Inject; 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; @@ -104,4 +105,14 @@ public class UpdateBackupOfferingCmd extends BaseCmd { public long getEntityOwnerId() { return Account.ACCOUNT_ID_SYSTEM; } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.BackupOffering; + } } \ No newline at end of file diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java index 2745f071dd0..99f3eae2aea 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java @@ -21,7 +21,7 @@ import javax.inject.Inject; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -119,7 +119,7 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/AddClusterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/AddClusterCmd.java index 3d0d7149740..e258d72ca38 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/AddClusterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/AddClusterCmd.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.api.command.admin.cluster; import java.util.ArrayList; import java.util.List; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -206,6 +207,11 @@ public class AddClusterCmd extends BaseCmd { this.allocationState = allocationState; } + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Cluster; + } + @Override public void execute() { try { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/DeleteClusterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/DeleteClusterCmd.java index 5d046758007..7493c7c45e5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/DeleteClusterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/DeleteClusterCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.cluster; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -65,6 +66,16 @@ public class DeleteClusterCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Cluster; + } + @Override public void execute() { boolean result = _resourceService.deleteCluster(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java index 8d6faf99bdd..99c62a17ebc 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.cluster; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -105,6 +106,16 @@ public class UpdateClusterCmd extends BaseCmd { this.managedState = managedstate; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Cluster; + } + @Override public void execute() { Cluster cluster = _resourceService.getCluster(getId()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/GetDiagnosticsDataCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/GetDiagnosticsDataCmd.java index dc058ff0a28..b414857908e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/GetDiagnosticsDataCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/GetDiagnosticsDataCmd.java @@ -23,7 +23,7 @@ import javax.inject.Inject; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.BaseCmd; @@ -150,8 +150,22 @@ public class GetDiagnosticsDataCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public Long getApiResourceId() { + return getId(); } + @Override + public ApiCommandResourceType getApiResourceType() { + + VirtualMachine.Type vmType = _entityMgr.findById(VirtualMachine.class, getId()).getType(); + switch (vmType) { + case ConsoleProxy: + return ApiCommandResourceType.ConsoleProxy; + case SecondaryStorageVm: + return ApiCommandResourceType.SystemVm; + case DomainRouter: + return ApiCommandResourceType.DomainRouter; + } + return null; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/RunDiagnosticsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/RunDiagnosticsCmd.java index d7f3b393310..f4e15d78643 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/RunDiagnosticsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/diagnostics/RunDiagnosticsCmd.java @@ -26,7 +26,7 @@ import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -141,8 +141,23 @@ public class RunDiagnosticsCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + + VirtualMachine.Type vmType = _entityMgr.findById(VirtualMachine.class, getId()).getType(); + switch (vmType) { + case ConsoleProxy: + return ApiCommandResourceType.ConsoleProxy; + case SecondaryStorageVm: + return ApiCommandResourceType.SystemVm; + case DomainRouter: + return ApiCommandResourceType.DomainRouter; + } + return null; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java index fe1c20206b6..80f1c03095b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.domain; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; @@ -103,4 +104,9 @@ public class CreateDomainCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create domain"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Domain; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java index 037cf3d9ab4..4302089dbc3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java @@ -20,6 +20,7 @@ import javax.inject.Inject; 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.BaseAsyncCmd; @@ -109,4 +110,14 @@ public class DeleteDomainCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete domain"); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Domain; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/UpdateDomainCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/UpdateDomainCmd.java index 409a84d7d80..76cc3292c9f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/UpdateDomainCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/domain/UpdateDomainCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.admin.domain; import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -100,4 +101,14 @@ public class UpdateDomainCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update domain"); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Domain; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java index 717bcfe8155..891ecb6d47b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -143,8 +143,8 @@ public class AddGuestOsCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOs; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOs; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsMappingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsMappingCmd.java index 8af50a15bfa..79e82d6f5d4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsMappingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/AddGuestOsMappingCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -130,8 +130,8 @@ public class AddGuestOsMappingCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOsMapping; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOsMapping; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsCmd.java index 3de7f7a68da..fc8c9e641a2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -91,8 +91,8 @@ public class RemoveGuestOsCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOs; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOs; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsMappingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsMappingCmd.java index ddd45399de2..690bc9f94b7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsMappingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/RemoveGuestOsMappingCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -91,8 +91,8 @@ public class RemoveGuestOsMappingCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOsMapping; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOsMapping; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java index ff3b49d79be..d67ffc66e95 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -122,7 +122,7 @@ public class UpdateGuestOsCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOs; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOs; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsMappingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsMappingCmd.java index d760d534cfb..2683a21dfcf 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsMappingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsMappingCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.guest; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -95,8 +95,8 @@ public class UpdateGuestOsMappingCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GuestOsMapping; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GuestOsMapping; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelHostAsDegradedCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelHostAsDegradedCmd.java index 98557dd710a..9d6a575bc62 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelHostAsDegradedCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelHostAsDegradedCmd.java @@ -22,7 +22,7 @@ import com.cloud.utils.fsm.NoTransitionException; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -87,12 +87,12 @@ public class CancelHostAsDegradedCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelMaintenanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelMaintenanceCmd.java index d23a7651bbc..a584c057595 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelMaintenanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/CancelMaintenanceCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.host; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -88,12 +88,12 @@ public class CancelMaintenanceCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/DeclareHostAsDegradedCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/DeclareHostAsDegradedCmd.java index bdf440fc054..c6188eadb8d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/DeclareHostAsDegradedCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/DeclareHostAsDegradedCmd.java @@ -22,7 +22,7 @@ import com.cloud.utils.fsm.NoTransitionException; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -87,12 +87,12 @@ public class DeclareHostAsDegradedCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostTagsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostTagsCmd.java index 5f55ada61da..7adb3a14d19 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostTagsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostTagsCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.host; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.HostTagResponse; @@ -49,8 +49,8 @@ public class ListHostTagsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java index 9a5d3115b59..1ec8f6bf5dc 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java @@ -24,7 +24,7 @@ import java.util.Map; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.BaseListCmd; @@ -198,8 +198,8 @@ public class ListHostsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } protected ListResponse getHostResponses() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/PrepareForMaintenanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/PrepareForMaintenanceCmd.java index 7083f0db133..fc228225c2e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/PrepareForMaintenanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/PrepareForMaintenanceCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.admin.host; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -88,12 +88,12 @@ public class PrepareForMaintenanceCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java index 34e439f3a37..82625280270 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.admin.host; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -89,12 +89,12 @@ public class ReconnectHostCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReleaseHostReservationCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReleaseHostReservationCmd.java index 6aeff6312c9..c0d339e86b7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReleaseHostReservationCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ReleaseHostReservationCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.host; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -84,12 +84,12 @@ public class ReleaseHostReservationCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java index fd415858f56..f5756909706 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java @@ -20,7 +20,7 @@ import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -137,8 +137,8 @@ public class ListInternalLBVMsCmd extends BaseListProjectAndAccountResourcesCmd } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java index 7040e7cf29a..fdec7947853 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -94,12 +94,12 @@ public class StartInternalLBVMCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.InternalLbVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.InternalLbVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java index 51a3d9f8fa0..1381f670527 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -92,12 +92,12 @@ public class StopInternalLBVMCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.InternalLbVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.InternalLbVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java index c01019e6e87..4e2ae10da54 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.admin.management; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.BaseListCmd; @@ -65,8 +65,8 @@ public class ListMgmtsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/AddNetworkServiceProviderCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/AddNetworkServiceProviderCmd.java index bb87015da78..756c35fc233 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/AddNetworkServiceProviderCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/AddNetworkServiceProviderCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -143,7 +143,7 @@ public class AddNetworkServiceProviderCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetworkServiceProvider; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetworkServiceProvider; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreatePhysicalNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreatePhysicalNetworkCmd.java index c691a18c835..9819cde6b4e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreatePhysicalNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreatePhysicalNetworkCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -181,7 +181,7 @@ public class CreatePhysicalNetworkCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetwork; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetwork; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeleteNetworkServiceProviderCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeleteNetworkServiceProviderCmd.java index 9df27d3e06c..fc752e8f881 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeleteNetworkServiceProviderCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeleteNetworkServiceProviderCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.network; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -103,7 +103,7 @@ public class DeleteNetworkServiceProviderCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetworkServiceProvider; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetworkServiceProvider; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeletePhysicalNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeletePhysicalNetworkCmd.java index 4d8c44628d3..06619aecc36 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeletePhysicalNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/DeletePhysicalNetworkCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.network; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -94,7 +94,12 @@ public class DeletePhysicalNetworkCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetwork; + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetwork; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java index 263d46a7509..f6e49491fdf 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.network; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -64,8 +64,8 @@ public class ReleaseDedicatedGuestVlanRangeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DedicatedGuestVlanRange; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DedicatedGuestVlanRange; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java index 12e9bca883f..65245b510fb 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; 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; @@ -203,6 +204,16 @@ public class UpdateNetworkOfferingCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkOffering; + } + @Override public void execute() { NetworkOffering result = _configService.updateNetworkOffering(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkServiceProviderCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkServiceProviderCmd.java index bb4f64e0400..a448ed77df3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkServiceProviderCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdateNetworkServiceProviderCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -112,8 +112,8 @@ public class UpdateNetworkServiceProviderCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetworkServiceProvider; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetworkServiceProvider; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java index ed3fa97ce7a..6f0cc3f6015 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.Parameter; @@ -115,7 +115,7 @@ public class UpdatePhysicalNetworkCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PhysicalNetwork; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PhysicalNetwork; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java index e7b46be0040..4a25cef26c2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Set; 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; @@ -326,4 +327,9 @@ public class CreateDiskOfferingCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create disk offering"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DiskOffering; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java index 57631046c33..08022a4e6c7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java @@ -21,6 +21,7 @@ import java.util.List; 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; @@ -279,6 +280,16 @@ public class UpdateDiskOfferingCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DiskOffering; + } + @Override public void execute() { DiskOffering result = _configService.updateDiskOffering(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateServiceOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateServiceOfferingCmd.java index f2d064c8e61..ace6a829bf3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateServiceOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateServiceOfferingCmd.java @@ -21,6 +21,7 @@ import java.util.List; 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; @@ -190,6 +191,16 @@ public class UpdateServiceOfferingCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.ServiceOffering; + } + @Override public void execute() { //Note diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java index 49eab1f176c..d61f62c1b0a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java @@ -26,7 +26,7 @@ import com.cloud.host.Host; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -118,7 +118,7 @@ public class IssueOutOfBandManagementPowerActionCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Host; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Host; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/CreatePodCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/CreatePodCmd.java index d912b44132f..9a060e01345 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/CreatePodCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/CreatePodCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.pod; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -106,11 +107,18 @@ public class CreatePodCmd extends BaseCmd { return s_name; } + + @Override public long getEntityOwnerId() { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public ApiCommandResourceType getApiResourceType() { + return super.getApiResourceType(); + } + @Override public void execute() { Pod result = _configService.createPod(getZoneId(), getPodName(), getStartIp(), getEndIp(), getGateway(), getNetmask(), getAllocationState()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/DeletePodCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/DeletePodCmd.java index c2edacba353..454bfd079b0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/DeletePodCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/DeletePodCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.pod; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -65,6 +66,16 @@ public class DeletePodCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Pod; + } + @Override public void execute() { boolean result = _configService.deletePod(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/UpdatePodCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/UpdatePodCmd.java index c89694c56bb..d49e9bd981e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/UpdatePodCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/pod/UpdatePodCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.pod; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -107,6 +108,16 @@ public class UpdatePodCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Pod; + } + @Override public void execute() { Pod result = _configService.editPod(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/region/CreatePortableIpRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/region/CreatePortableIpRangeCmd.java index 403eaf3e39a..c28a29c6e9f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/region/CreatePortableIpRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/region/CreatePortableIpRangeCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.region; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -148,7 +148,7 @@ public class CreatePortableIpRangeCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PortableIpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PortableIpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/region/DeletePortableIpRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/region/DeletePortableIpRangeCmd.java index 413818b8242..6cc884645e9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/region/DeletePortableIpRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/region/DeletePortableIpRangeCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.region; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -89,7 +89,7 @@ public class DeletePortableIpRangeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PortableIpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PortableIpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/resource/StartRollingMaintenanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/resource/StartRollingMaintenanceCmd.java index b5a91281047..a3f9fe9df76 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/resource/StartRollingMaintenanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/resource/StartRollingMaintenanceCmd.java @@ -17,17 +17,13 @@ package org.apache.cloudstack.api.command.admin.resource; -import com.cloud.event.EventTypes; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.resource.RollingMaintenanceManager; -import com.cloud.utils.Pair; -import com.cloud.utils.Ternary; +import java.util.List; + +import javax.inject.Inject; + 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.BaseAsyncCmd; import org.apache.cloudstack.api.BaseCmd; @@ -41,8 +37,15 @@ import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; import org.apache.log4j.Logger; -import javax.inject.Inject; -import java.util.List; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.resource.RollingMaintenanceManager; +import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; @APICommand(name = StartRollingMaintenanceCmd.APINAME, description = "Start rolling maintenance", responseObject = RollingMaintenanceResponse.class, @@ -175,4 +178,36 @@ public class StartRollingMaintenanceCmd extends BaseAsyncCmd { Pair> pair = manager.getResourceTypeIdPair(this); return "Starting rolling maintenance on entity: " + pair.first() + " with IDs: " + pair.second(); } + + @Override + public Long getApiResourceId() { + String eventType = getEventType(); + switch (eventType) { + case EventTypes.EVENT_ZONE_ROLLING_MAINTENANCE: + return getZoneIds().get(0); + case EventTypes.EVENT_POD_ROLLING_MAINTENANCE: + return getPodIds().get(0); + case EventTypes.EVENT_CLUSTER_ROLLING_MAINTENANCE: + return getClusterIds().get(0); + case EventTypes.EVENT_HOST_ROLLING_MAINTENANCE: + return getHostIds().get(0); + } + return null; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + String eventType = getEventType(); + switch (eventType) { + case EventTypes.EVENT_ZONE_ROLLING_MAINTENANCE: + return ApiCommandResourceType.Zone; + case EventTypes.EVENT_POD_ROLLING_MAINTENANCE: + return ApiCommandResourceType.Pod; + case EventTypes.EVENT_CLUSTER_ROLLING_MAINTENANCE: + return ApiCommandResourceType.Cluster; + case EventTypes.EVENT_HOST_ROLLING_MAINTENANCE: + return ApiCommandResourceType.Host; + } + return null; + } } \ No newline at end of file diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureOvsElementCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureOvsElementCmd.java index 7577f2eb884..d3b4896e53b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureOvsElementCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureOvsElementCmd.java @@ -21,7 +21,7 @@ import java.util.List; import javax.inject.Inject; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -106,12 +106,12 @@ public class ConfigureOvsElementCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.None; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.None; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return id; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureVirtualRouterElementCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureVirtualRouterElementCmd.java index 6dd05a48b71..575920cc327 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureVirtualRouterElementCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ConfigureVirtualRouterElementCmd.java @@ -23,7 +23,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -112,12 +112,12 @@ public class ConfigureVirtualRouterElementCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.None; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.None; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return id; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java index c460c6665e7..b6b370a6ba4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.router; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -86,12 +86,12 @@ public class DestroyRouterCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java index 3c9b684c0c8..e5c689dcd87 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java @@ -20,7 +20,7 @@ import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -160,8 +160,8 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java index 764d304e25b..bc0e6e8dee7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.router; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -90,12 +90,12 @@ public class RebootRouterCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java index 6d36a3c801e..25235cb0434 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.router; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -93,12 +93,12 @@ public class StartRouterCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java index 2474171a459..dc970ce61ad 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.router; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -91,12 +91,12 @@ public class StopRouterCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java index fedc314be7f..2004910c9f4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java @@ -20,7 +20,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseResponse; @@ -117,8 +117,8 @@ public class UpgradeRouterTemplateCmd extends org.apache.cloudstack.api.BaseCmd return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getInstanceType() { + return ApiCommandResourceType.DomainRouter; } public Long getInstanceId() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CancelPrimaryStorageMaintenanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CancelPrimaryStorageMaintenanceCmd.java index 91348ecf6b0..a694aba30fb 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CancelPrimaryStorageMaintenanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CancelPrimaryStorageMaintenanceCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.storage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -69,12 +69,12 @@ public class CancelPrimaryStorageMaintenanceCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StoragePool; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java index 73c596c9e56..8133806cbc6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java @@ -22,7 +22,7 @@ import java.util.Comparator; import java.util.List; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; @@ -67,8 +67,8 @@ public class FindStoragePoolsForMigrationCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StoragePool; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java index 2450ac7cd6b..b2455c3037a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.storage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; @@ -112,8 +112,8 @@ public class ListStoragePoolsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StoragePool; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java index 9e0aeccee5e..d740d04cff7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListStorageTagsCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.storage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.StorageTagResponse; @@ -49,8 +49,8 @@ public class ListStorageTagsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StoragePool; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java index 9abbecfcd8e..e8a287552b6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java @@ -21,6 +21,7 @@ import java.util.List; 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.BaseAsyncCmd; import org.apache.cloudstack.api.Parameter; @@ -112,4 +113,14 @@ public class MigrateSecondaryStorageDataCmd extends BaseAsyncCmd { public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.ImageStore; + } } \ No newline at end of file diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/PreparePrimaryStorageForMaintenanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/PreparePrimaryStorageForMaintenanceCmd.java index cf5fdf66c64..ddabefb14c8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/PreparePrimaryStorageForMaintenanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/PreparePrimaryStorageForMaintenanceCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.storage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -69,12 +69,12 @@ public class PreparePrimaryStorageForMaintenanceCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StoragePool; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java index ad91c29dde3..0128a218a7c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.admin.storage; import java.util.List; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -103,6 +104,16 @@ public class UpdateStoragePoolCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StoragePool; + } + @Override public void execute() { StoragePool result = _storageService.updateStoragePool(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java index f68f9ddb49e..0a477a89409 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -88,12 +88,12 @@ public class DestroySystemVmCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java index 2b2faf50113..aee2084c2e8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; @@ -123,8 +123,8 @@ public class ListSystemVMsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java index 352fd3b330b..6c440ff2ba8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -98,12 +98,12 @@ public class RebootSystemVmCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java index a2b70a6630b..a3dd5a032d9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -99,12 +99,12 @@ public class StartSystemVMCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java index 9237004b727..44056671044 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -101,12 +101,12 @@ public class StopSystemVmCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SystemVm; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/AddTrafficTypeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/AddTrafficTypeCmd.java index 9e4254c49aa..1111434c660 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/AddTrafficTypeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/AddTrafficTypeCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.usage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -191,7 +191,7 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.TrafficType; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.TrafficType; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficTypeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficTypeCmd.java index 46383cca725..0dda89b2a5c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficTypeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficTypeCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.usage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -88,8 +88,8 @@ public class DeleteTrafficTypeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.TrafficType; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.TrafficType; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/UpdateTrafficTypeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/UpdateTrafficTypeCmd.java index 6d0824cca79..3c7548583c3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/UpdateTrafficTypeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/usage/UpdateTrafficTypeCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.usage; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -135,7 +135,7 @@ public class UpdateTrafficTypeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.TrafficType; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.TrafficType; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/CreateUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/CreateUserCmd.java index 71d6a661af3..ec830518718 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/CreateUserCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/CreateUserCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.admin.user; 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; @@ -172,4 +173,9 @@ public class CreateUserCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Empty passwords are not allowed"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DeleteUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DeleteUserCmd.java index 08ba521ed62..e8ac7fd3720 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DeleteUserCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DeleteUserCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.admin.user; import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -77,6 +78,16 @@ public class DeleteUserCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; + } + @Override public void execute() { CallContext.current().setEventDetails("UserId: " + getId()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DisableUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DisableUserCmd.java index c6e09ef0f9e..89c7af4cec2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DisableUserCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/DisableUserCmd.java @@ -21,7 +21,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -104,7 +104,7 @@ public class DisableUserCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.User; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java index e34def3b5d3..1d4096f37e3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java @@ -16,11 +16,11 @@ // under the License. package org.apache.cloudstack.api.command.admin.user; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.google.common.base.Preconditions; +import javax.inject.Inject; + 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; @@ -34,7 +34,9 @@ import org.apache.cloudstack.region.RegionService; import org.apache.commons.lang3.ObjectUtils; import org.apache.log4j.Logger; -import javax.inject.Inject; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.google.common.base.Preconditions; @APICommand(name = "moveUser", description = "Moves a user to another account", @@ -107,6 +109,16 @@ public class MoveUserCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; + } + @Override public void execute() { Preconditions.checkNotNull(getId(),"I have to have an user to move!"); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/RegisterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/RegisterCmd.java index 2732bb90589..f0d92322f39 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/RegisterCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/RegisterCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.user; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -75,6 +76,16 @@ public class RegisterCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; + } + @Override public void execute() { String[] keys = _accountService.createApiKeyAndSecretKey(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java index 24624e2c271..5035b32d14d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.admin.user; import javax.inject.Inject; 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; @@ -174,4 +175,14 @@ public class UpdateUserCmd extends BaseCmd { public void setEmail(String email) { this.email = email; } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.User; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java index 7b577963f1b..290349070d5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.admin.vm; import java.util.List; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -160,4 +161,13 @@ public class AssignVMCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return getVmId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java index ea6cb00efa7..cd9b89b6ffe 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -93,12 +93,12 @@ public class ExpungeVMCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java index 2c68d86f445..2962dd4a68f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.vm; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -214,4 +215,14 @@ public class MigrateVMCmd extends BaseAsyncCmd { } return null; } + + @Override + public Long getApiResourceId() { + return virtualMachineId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java index 195e1316fd5..db513ff4dc0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.Map; 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.BaseAsyncCmd; @@ -138,6 +139,16 @@ public class MigrateVirtualMachineWithVolumeCmd extends BaseAsyncCmd { return "Attempting to migrate VM Id: " + this._uuidMgr.getUuid(VirtualMachine.class, getVirtualMachineId()) + " to host Id: " + this._uuidMgr.getUuid(Host.class, getHostId()); } + @Override + public Long getApiResourceId() { + return virtualMachineId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() { if (hostId == null && MapUtils.isEmpty(migrateVolumeTo)) { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java index 1a123ecfcdb..50062acfab3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.vm; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -76,6 +77,16 @@ public class RecoverVMCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() throws ResourceAllocationException { UserVm result = _userVmService.recoverVirtualMachine(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java index f49577ebd59..db729b7f8d7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java @@ -30,7 +30,7 @@ import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -124,12 +124,12 @@ public class UnmanageVMInstanceCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return vmId; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java index fab1b598351..206eca2c991 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.vpc; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -219,7 +219,7 @@ public class CreatePrivateGatewayCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PrivateGateway; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PrivateGateway; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java index 8d67a4ed8c5..82809e5bd0d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.admin.vpc; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -107,8 +107,8 @@ public class DeletePrivateGatewayCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.PrivateGateway; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.PrivateGateway; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java index 0959f5f8c07..a5e1b7c90a5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.vpc; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -86,4 +87,13 @@ public class DeleteVPCOfferingCmd extends BaseAsyncCmd { return "Deleting VPC offering id=" + getId(); } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VpcOffering; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java index 2ad1eeac76b..bd78101fd8b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; 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.BaseAsyncCmd; @@ -191,4 +192,14 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { public String getEventDescription() { return "Updating VPC offering id=" + getId(); } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VpcOffering; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/zone/MarkDefaultZoneForAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/zone/MarkDefaultZoneForAccountCmd.java index 28a6d6ccc13..9dd0337a83f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/zone/MarkDefaultZoneForAccountCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/zone/MarkDefaultZoneForAccountCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.admin.zone; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -107,8 +107,14 @@ public class MarkDefaultZoneForAccountCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Account; + public Long getApiResourceId() { + Account account = _accountService.getActiveAccountByName(accountName, domainId); + return account != null ? account.getId() : null; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java index 62cb100d979..5bb6c76ba8b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.user.account; import java.util.List; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.response.ProjectRoleResponse; import org.apache.commons.lang3.EnumUtils; @@ -159,4 +160,14 @@ public class AddAccountToProjectCmd extends BaseAsyncCmd { return "Sending invitation to email " + email + " to join project: " + getProjectId(); } } + + @Override + public Long getApiResourceId() { + return projectId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java index c8e71feb579..2418ceb23e9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.api.command.user.account; 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; @@ -31,11 +32,11 @@ import org.apache.cloudstack.api.response.ProjectRoleResponse; import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.cloudstack.context.CallContext; import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.StringUtils; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.projects.ProjectAccount; -import com.google.common.base.Strings; @APICommand(name = AddUserToProjectCmd.APINAME, description = "Adds user to a project", responseObject = SuccessResponse.class, since = "4.14", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User}) @@ -86,7 +87,7 @@ public class AddUserToProjectCmd extends BaseAsyncCmd { } public ProjectAccount.Role getRoleType() { - if (!Strings.isNullOrEmpty(roleType)) { + if (StringUtils.isNotEmpty(roleType)) { String role = roleType.substring(0, 1).toUpperCase() + roleType.substring(1).toLowerCase(); if (!EnumUtils.isValidEnum(ProjectAccount.Role.class, role)) { throw new InvalidParameterValueException("Only Admin or Regular project role types are valid"); @@ -147,4 +148,14 @@ public class AddUserToProjectCmd extends BaseAsyncCmd { public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + @Override + public Long getApiResourceId() { + return projectId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java index 84b06c0a253..6804f091e71 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.user.account; import java.util.List; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -112,4 +113,14 @@ public class DeleteAccountFromProjectCmd extends BaseAsyncCmd { public String getEventDescription() { return "Removing account " + accountName + " from project: " + projectId; } + + @Override + public Long getApiResourceId() { + return projectId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java index 83b01eac4e7..7cd90125041 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java @@ -21,6 +21,7 @@ import java.util.List; 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.BaseAsyncCmd; @@ -103,6 +104,16 @@ public class DeleteUserFromProjectCmd extends BaseAsyncCmd { return _projectService.getProjectOwners(projectId); } + @Override + public Long getApiResourceId() { + return projectId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Project; + } + @Override public void execute() { CallContext.current().setEventDetails("Project ID: " + projectId + "; user ID: " + userId); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java index 993384d6a3f..e89118afef6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java @@ -20,12 +20,8 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; -import com.cloud.server.ResourceIcon; -import com.cloud.server.ResourceTag; -import org.apache.cloudstack.api.response.ResourceIconResponse; -import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.DomainDetails; import org.apache.cloudstack.api.BaseListDomainResourcesCmd; @@ -34,8 +30,12 @@ import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ResourceIconResponse; +import org.apache.log4j.Logger; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.server.ResourceIcon; +import com.cloud.server.ResourceTag; import com.cloud.user.Account; @APICommand(name = "listAccounts", description = "Lists accounts and provides detailed account information for listed accounts", responseObject = AccountResponse.class, responseView = ResponseView.Restricted, entityType = {Account.class}, @@ -151,4 +151,9 @@ public class ListAccountsCmd extends BaseListDomainResourcesCmd implements UserC accountResponse.setResourceIconResponse(iconResponse); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java index bc10e4b6e4f..bcfedd2262d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.user.account; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; @@ -100,4 +101,9 @@ public class ListProjectAccountsCmd extends BaseListCmd { this.setResponseObject(response); } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java index 5beba26d0f5..75b83b40f3e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -366,8 +366,8 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/address/DisassociateIPAddrCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/address/DisassociateIPAddrCmd.java index c2e173c0fa5..17b17632ca5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/address/DisassociateIPAddrCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/address/DisassociateIPAddrCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.address; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -141,12 +141,12 @@ public class DisassociateIPAddrCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getIpAddressId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java index a9b3bf89afc..e456074145d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -206,7 +206,7 @@ public class ListPublicIpAddressesCmd extends BaseListTaggedResourcesCmd impleme } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java index 6d20283984b..9ed66b0935e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.address; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -133,4 +134,14 @@ public class UpdateIPAddrCmd extends BaseAsyncCustomIdCmd { setResponseObject(ipResponse); } } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; + } } \ No newline at end of file diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java index 8cc3d69bb6b..052b98719d7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java @@ -20,7 +20,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -169,8 +169,8 @@ public class CreateAffinityGroupCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AffinityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AffinityGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java index e8884b4f65c..e96ba433474 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java @@ -24,7 +24,7 @@ import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -135,7 +135,12 @@ public class DeleteAffinityGroupCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AffinityGroup; + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AffinityGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java index fa7935b0b66..de70361c331 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -90,7 +90,7 @@ public class ListAffinityGroupsCmd extends BaseListProjectAndAccountResourcesCmd } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AffinityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AffinityGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java index c798b1820d0..c70e4fbda66 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java @@ -26,7 +26,7 @@ import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.ApiErrorCode; @@ -169,8 +169,8 @@ public class UpdateVMAffinityGroupCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AffinityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AffinityGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java index 6a2b491f2f4..7ab9f276b8d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -156,8 +156,8 @@ public class CreateAutoScalePolicyCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScalePolicy; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScalePolicy; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java index 0308c1710c3..45881f2bc7e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -180,8 +180,8 @@ public class CreateAutoScaleVmGroupCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmGroup; } @Deprecated diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java index 447085e79b5..d62b9367676 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -245,8 +245,8 @@ public class CreateAutoScaleVmProfileCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmProfile; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmProfile; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java index 847866ef3ae..655fcfceb36 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.user.autoscale; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -122,8 +122,8 @@ public class CreateConditionCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Condition; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Condition; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java index c0a3a00f7d4..a33a6200906 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -105,7 +105,7 @@ public class DeleteAutoScalePolicyCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScalePolicy; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScalePolicy; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java index a9d2f4e2329..0cc9571a685 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -105,7 +105,7 @@ public class DeleteAutoScaleVmGroupCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java index 779315a96dd..5f9fd8a5f74 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -104,7 +104,7 @@ public class DeleteAutoScaleVmProfileCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmProfile; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmProfile; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java index 24f4cc68784..8c3e56d43ba 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -81,8 +81,8 @@ public class DeleteConditionCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Condition; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Condition; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java index 8eb1809f887..b0daf2ec664 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +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,8 +102,8 @@ public class DisableAutoScaleVmGroupCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java index 59c9f7a9aa3..b6f2a82ac49 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +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,8 +102,8 @@ public class EnableAutoScaleVmGroupCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java index 24858f4656b..b1089a5ee0b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java @@ -24,7 +24,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -132,7 +132,7 @@ public class UpdateAutoScalePolicyCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScalePolicy; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScalePolicy; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java index 76fa3d75d18..c086c3290e2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java @@ -25,7 +25,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCustomIdCmd; @@ -163,8 +163,8 @@ public class UpdateAutoScaleVmGroupCmd extends BaseAsyncCustomIdCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmGroup; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java index deebe2ecc9a..2f4445a20d2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java @@ -25,7 +25,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCustomIdCmd; @@ -155,8 +155,8 @@ public class UpdateAutoScaleVmProfileCmd extends BaseAsyncCustomIdCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.AutoScaleVmProfile; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.AutoScaleVmProfile; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/CreateBackupCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/CreateBackupCmd.java index db7a2763ef2..189ebe2f69d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/backup/CreateBackupCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/backup/CreateBackupCmd.java @@ -21,7 +21,7 @@ import javax.inject.Inject; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -96,8 +96,8 @@ public class CreateBackupCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Backup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Backup; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java index b98c30897a0..66aff30e52d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java @@ -18,14 +18,13 @@ package org.apache.cloudstack.api.command.user.event; import java.util.Date; -import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.ListResponse; +import org.apache.log4j.Logger; import com.cloud.event.Event; @@ -68,6 +67,12 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name = ApiConstants.START_ID, type = CommandType.UUID, entityType = EventResponse.class, description = "the parent/start ID of the event, when provided this will list all the events with the start/parent ID including the parent event") private Long startId; + @Parameter(name = ApiConstants.RESOURCE_ID, type = CommandType.STRING, description = "the ID of the resource associated with the event", since="4.17.0") + private String resourceId; + + @Parameter(name = ApiConstants.RESOURCE_TYPE, type = CommandType.STRING, description = "the type of the resource associated with the event", since="4.17.0") + private String resourceType; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -104,6 +109,14 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { return startId; } + public String getResourceId() { + return resourceId; + } + + public String getResourceType() { + return resourceType; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java index 3bb140011c4..70646bdc06e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java @@ -24,7 +24,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -355,8 +355,8 @@ public class CreateEgressFirewallRuleCmd extends BaseAsyncCreateCmd implements F } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java index ca66ee762b1..878561d5e36 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -330,8 +330,8 @@ public class CreateFirewallRuleCmd extends BaseAsyncCreateCmd implements Firewal } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java index 6a4e802e93a..a90367c8ac4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java @@ -24,7 +24,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -419,8 +419,8 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements P } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java index 59a0519df4d..bcb25890135 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -122,7 +122,7 @@ public class DeleteEgressFirewallRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java index ba8b18eacf0..7bd5836f99e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -120,7 +120,7 @@ public class DeleteFirewallRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java index 1c45280a837..505777b64f9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -124,7 +124,7 @@ public class DeletePortForwardingRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java index 74a98beef9d..cdc72de4a10 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.iso; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -103,6 +104,16 @@ public class AttachIsoCmd extends BaseAsyncCmd implements UserCmd { return "attaching ISO: " + getId() + " to VM: " + getVirtualMachineId(); } + @Override + public Long getApiResourceId() { + return virtualMachineId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() { CallContext.current().setEventDetails("Vm Id: " + getVirtualMachineId() + " ISO ID: " + getId()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DeleteIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DeleteIsoCmd.java index b38a24f8ad7..8e6750cc3e3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DeleteIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DeleteIsoCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.iso; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -103,12 +103,12 @@ public class DeleteIsoCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Iso; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Iso; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java index 4f4a0197ac7..e3b22c4a49f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.iso; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -93,6 +94,16 @@ public class DetachIsoCmd extends BaseAsyncCmd implements UserCmd { return "detaching ISO from VM: " + getVirtualMachineId(); } + @Override + public Long getApiResourceId() { + return virtualMachineId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() { boolean result = _templateService.detachIso(virtualMachineId, isForced()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ExtractIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ExtractIsoCmd.java index a400a014b6b..9e63ce00910 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ExtractIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ExtractIsoCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.iso; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -117,12 +117,12 @@ public class ExtractIsoCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Iso; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Iso; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java index 44bbb7168c1..90ecaa47de0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java @@ -22,7 +22,7 @@ import org.apache.cloudstack.api.response.ResourceIconResponse; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -167,8 +167,8 @@ public class ListIsosCmd extends BaseListTaggedResourcesCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Iso; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Iso; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java index 1c1a767aa3b..47018b3b38d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.user.iso; import java.util.List; 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; @@ -242,6 +243,11 @@ public class RegisterIsoCmd extends BaseCmd implements UserCmd { return accountId; } + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Iso; + } + @Override public void execute() throws ResourceAllocationException { VirtualMachineTemplate template = _templateService.registerIso(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java index 36e9b5329e1..58c475c661e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.iso; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -68,6 +69,16 @@ public class UpdateIsoCmd extends BaseUpdateTemplateOrIsoCmd implements UserCmd return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Iso; + } + @Override public void execute() { VirtualMachineTemplate result = _templateService.updateTemplate(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java index 592f49f4406..0b581f410a8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java @@ -18,7 +18,7 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -164,8 +164,8 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.LoadBalancerRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.LoadBalancerRule; } public String getSourceIp() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java index 6c1e133d57c..76061525458 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java @@ -20,7 +20,7 @@ import java.util.List; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -412,8 +412,8 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd /*implements L } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java index f63b0014bd3..d945e81a8b3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -110,7 +110,7 @@ public class DeleteApplicationLoadBalancerCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java index 112f6cf7fc8..2c6ba178b38 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/DeleteLoadBalancerRuleCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -116,7 +116,7 @@ public class DeleteLoadBalancerRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java index de7f68de004..70b721b96ee 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java @@ -21,7 +21,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -309,8 +309,8 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements Sta } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DeleteIpForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DeleteIpForwardingRuleCmd.java index 9059d507319..d40a63fc67d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DeleteIpForwardingRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DeleteIpForwardingRuleCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.nat; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -117,8 +117,8 @@ public class DeleteIpForwardingRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.FirewallRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.FirewallRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DisableStaticNatCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DisableStaticNatCmd.java index 3e0ab2e8144..c42670d2bc9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DisableStaticNatCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/DisableStaticNatCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.nat; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -111,4 +112,18 @@ public class DisableStaticNatCmd extends BaseAsyncCmd { } return ip; } + + @Override + public Long getApiResourceId() { + IpAddress object = _entityMgr.findById(IpAddress.class, ipAddressId); + if (object != null) { + object.getAssociatedWithVmId(); + } + return null; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/EnableStaticNatCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/EnableStaticNatCmd.java index c960285ed69..60e579196c4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/EnableStaticNatCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/EnableStaticNatCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.nat; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -144,4 +145,13 @@ public class EnableStaticNatCmd extends BaseCmd { } } + @Override + public Long getApiResourceId() { + return getVirtualMachineId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java index 3d79c2275af..f13063cca4d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java @@ -21,6 +21,7 @@ import java.util.List; 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.BaseAsyncCreateCmd; @@ -247,4 +248,9 @@ public class CreateNetworkACLCmd extends BaseAsyncCreateCmd { } } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAclItem; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLListCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLListCmd.java index 530dc4e7030..884ca53f05f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLListCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.user.network; 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.BaseAsyncCreateCmd; @@ -134,4 +135,14 @@ public class CreateNetworkACLListCmd extends BaseAsyncCreateCmd { public String getEventDescription() { return "Creating Network ACL with ID: " + getEntityUuid(); } + + @Override + public Long getApiResourceId() { + return getEntityId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAcl; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLCmd.java index ab6df801fe9..6243826c745 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.network; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -77,6 +78,16 @@ public class DeleteNetworkACLCmd extends BaseAsyncCmd { return caller.getAccountId(); } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAclItem; + } + @Override public void execute() throws ResourceUnavailableException { CallContext.current().setEventDetails("Network ACL item ID: " + id); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLListCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLListCmd.java index 19cf601d63a..e6868dbbbdf 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkACLListCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.network; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -77,6 +78,16 @@ public class DeleteNetworkACLListCmd extends BaseAsyncCmd { return caller.getAccountId(); } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAcl; + } + @Override public void execute() throws ResourceUnavailableException { CallContext.current().setEventDetails("Network ACL ID: " + id); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java index 72a953857af..51e40c3bbd6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java @@ -16,7 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.network; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -106,13 +106,13 @@ public class DeleteNetworkCmd extends BaseAsyncCmd { } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Network; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Network; } @Override public long getEntityOwnerId() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/MoveNetworkAclItemCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/MoveNetworkAclItemCmd.java index acc7fdff90f..1fba93c415e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/MoveNetworkAclItemCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/MoveNetworkAclItemCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.user.network; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCustomIdCmd; import org.apache.cloudstack.api.Parameter; @@ -100,4 +101,9 @@ public class MoveNetworkAclItemCmd extends BaseAsyncCustomIdCmd { public String getAclConsistencyHash() { return aclConsistencyHash; } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAclItem; + } } \ No newline at end of file diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java index dbcdb8f8884..72b83e567e5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.network; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -133,4 +134,14 @@ public class RestartNetworkCmd extends BaseAsyncCmd { return _networkService.getNetwork(id).getAccountId(); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Network; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java index 189ed1ccc68..f675fa23e34 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java @@ -20,6 +20,7 @@ import java.util.List; 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.BaseAsyncCustomIdCmd; import org.apache.cloudstack.api.Parameter; @@ -194,4 +195,14 @@ public class UpdateNetworkACLItemCmd extends BaseAsyncCustomIdCmd { public boolean isPartialUpgrade() { return partialUpgrade; } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAclItem; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java index 22eaf2180ca..04617086a3f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.user.network; 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.BaseAsyncCustomIdCmd; import org.apache.cloudstack.api.Parameter; @@ -111,4 +112,14 @@ public class UpdateNetworkACLListCmd extends BaseAsyncCustomIdCmd { public String getName() { return name; } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.NetworkAcl; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java index 2ffa52bcfd2..cac3c1cb074 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java @@ -20,6 +20,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; 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.BaseAsyncCmd; @@ -214,4 +215,14 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd implements UserCmd { _uuidMgr.checkUuid(getCustomId(), Network.class); } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Network; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/CreateGlobalLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/CreateGlobalLoadBalancerRuleCmd.java index 18f5b7683cf..6f3a8a6a704 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/CreateGlobalLoadBalancerRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/CreateGlobalLoadBalancerRuleCmd.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.api.command.user.region.ha.gslb; import javax.inject.Inject; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -182,8 +182,8 @@ public class CreateGlobalLoadBalancerRuleCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GlobalLoadBalancerRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GlobalLoadBalancerRule; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java index dfb093d5b16..ec84e668db1 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java @@ -22,7 +22,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -119,7 +119,7 @@ public class DeleteGlobalLoadBalancerRuleCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.GlobalLoadBalancerRule; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.GlobalLoadBalancerRule; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java index c62b7ec1f77..10f1296e525 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java @@ -27,7 +27,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -229,12 +229,12 @@ public class AuthorizeSecurityGroupEgressCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SecurityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SecurityGroup; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getSecurityGroupId(); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java index 3b339e4ca65..1893d5e8fbb 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java @@ -27,7 +27,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -228,12 +228,12 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SecurityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SecurityGroup; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getSecurityGroupId(); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java index 4a8081a3507..2895593595d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.securitygroup; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -84,7 +84,7 @@ public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SecurityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SecurityGroup; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java index a28a220b534..e10c7c75a7c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.securitygroup; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -105,12 +105,12 @@ public class RevokeSecurityGroupEgressCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SecurityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SecurityGroup; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java index 9e81d0bc4ee..1b4a13f8777 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -106,12 +106,12 @@ public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.SecurityGroup; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SecurityGroup; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java index cf4c1d43dea..c9215703880 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java @@ -21,7 +21,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -196,8 +196,8 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Snapshot; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Snapshot; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java index 556b041631b..3e6e37fdd2a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.user.snapshot; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -155,8 +155,8 @@ public class CreateSnapshotFromVMSnapshotCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Snapshot; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Snapshot; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotPolicyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotPolicyCmd.java index 898bae5919f..c16ebe701ed 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotPolicyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotPolicyCmd.java @@ -22,6 +22,7 @@ import java.util.Map; 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; @@ -163,4 +164,14 @@ public class CreateSnapshotPolicyCmd extends BaseCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot policy"); } } + + @Override + public Long getApiResourceId() { + return getVolumeId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java index 452135fc1f4..dada167ede5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -88,12 +88,12 @@ public class DeleteSnapshotCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Snapshot; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Snapshot; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java index bdb23e4ad5b..c6a15605ed1 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -104,8 +104,8 @@ public class ListSnapshotsCmd extends BaseListTaggedResourcesCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Snapshot; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Snapshot; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java index 20a638c36f4..824c2b4abee 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java @@ -21,7 +21,7 @@ package org.apache.cloudstack.api.command.user.snapshot; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -86,12 +86,12 @@ public class RevertSnapshotCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Snapshot; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Snapshot; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/UpdateSnapshotPolicyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/UpdateSnapshotPolicyCmd.java index 7181fd50d08..8b62230e174 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/UpdateSnapshotPolicyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/UpdateSnapshotPolicyCmd.java @@ -79,7 +79,7 @@ public class UpdateSnapshotPolicyCmd extends BaseAsyncCustomIdCmd { } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java index 54900974c2e..f672d4c8890 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java @@ -19,11 +19,8 @@ package org.apache.cloudstack.api.command.user.template; import java.util.ArrayList; import java.util.List; -import com.cloud.dc.DataCenter; -import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -34,7 +31,9 @@ import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; +import com.cloud.dc.DataCenter; import com.cloud.event.EventTypes; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.StorageUnavailableException; @@ -155,12 +154,12 @@ public class CopyTemplateCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java index d5985318ee8..55b43d22cd2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java @@ -32,7 +32,7 @@ import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -276,8 +276,8 @@ public class CreateTemplateCmd extends BaseAsyncCreateCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; } protected boolean isBareMetal() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java index 3cee148f759..07b0f81bf82 100755 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.template; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -104,12 +104,12 @@ public class DeleteTemplateCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ExtractTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ExtractTemplateCmd.java index f0e7b0803e9..13076287a32 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ExtractTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ExtractTemplateCmd.java @@ -16,11 +16,8 @@ // under the License. package org.apache.cloudstack.api.command.user.template; -import com.cloud.dc.DataCenter; -import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -30,7 +27,9 @@ import org.apache.cloudstack.api.response.ExtractResponse; import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; +import com.cloud.dc.DataCenter; import com.cloud.event.EventTypes; import com.cloud.exception.InternalErrorException; import com.cloud.template.VirtualMachineTemplate; @@ -118,12 +117,12 @@ public class ExtractTemplateCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java index bf3b2fbf5a4..a64ce195c0f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; @@ -181,8 +181,8 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd implements User } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java index bb7f7a441b6..255b11aaa24 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Map; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -293,8 +293,8 @@ public class RegisterTemplateCmd extends BaseCmd implements UserCmd { return s_name; } - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Template; + public ApiCommandResourceType getInstanceType() { + return ApiCommandResourceType.Template; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java index 8396b078c15..28ecd453d26 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.template; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -79,6 +80,16 @@ public class UpdateTemplateCmd extends BaseUpdateTemplateOrIsoCmd implements Use return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Template; + } + @Override public void execute() { VirtualMachineTemplate result = _templateService.updateTemplate(this); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java index ba465ad4259..fc009c7e5db 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.user.vm; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -136,8 +136,8 @@ public class AddIpToVmNicCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java index 454ca6db80f..1e395831a6f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java @@ -22,12 +22,10 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -import com.cloud.network.Network; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.ApiErrorCode; @@ -39,9 +37,11 @@ import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.Network; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.net.Dhcp; @@ -157,6 +157,16 @@ public class AddNicToVMCmd extends BaseAsyncCmd implements UserCmd { return dhcpOptionsMap; } + @Override + public Long getApiResourceId() { + return getVmId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() { CallContext.current().setEventDetails("Vm Id: " + this._uuidMgr.getUuid(VirtualMachine.class, getVmId()) + " Network Id: " + this._uuidMgr.getUuid(Network.class, getNetworkId())); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index c87bc4661a1..fce7c91710f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -31,7 +31,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCustomIdCmd; @@ -682,8 +682,8 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java index 30ab5b562ff..07fd55276f8 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -122,12 +122,12 @@ public class DestroyVMCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java index 30a3b8cce90..0614e641f30 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java @@ -22,7 +22,7 @@ import com.cloud.vm.NicSecondaryIp; import org.apache.cloudstack.api.response.NicSecondaryIpResponse; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseListCmd; @@ -169,8 +169,8 @@ public class ListNicsCmd extends BaseListCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java index b0ff1023c5c..5e124aba4ec 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java @@ -20,37 +20,36 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; -import com.cloud.server.ResourceIcon; -import com.cloud.server.ResourceTag; -import org.apache.cloudstack.api.command.user.UserCmd; -import org.apache.cloudstack.api.response.ResourceIconResponse; -import org.apache.cloudstack.api.response.SecurityGroupResponse; -import org.apache.cloudstack.api.response.UserResponse; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject.ResponseView; +import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.IsoVmResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.PodResponse; +import org.apache.cloudstack.api.response.ResourceIconResponse; +import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.TemplateResponse; +import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.log4j.Logger; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.server.ResourceIcon; +import com.cloud.server.ResourceTag; import com.cloud.vm.VirtualMachine; @@ -273,8 +272,8 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java index d827a6b894a..9bdcc1aed56 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -105,12 +105,12 @@ public class RebootVMCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java index db84dc9fc8b..50e2e560d31 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.vm; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -180,8 +180,8 @@ public class RemoveIpFromVmNicCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java index e9a2503ce46..e275a988cd1 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -107,12 +107,12 @@ public class ResetVMPasswordCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java index ce481d8814c..c611f54264c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -113,8 +113,8 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override @@ -133,7 +133,7 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java index 2439a26c538..ab1bd0b79ee 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vm; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -110,4 +111,14 @@ public class RestoreVMCmd extends BaseAsyncCmd implements UserCmd { public Long getId() { return getVmId(); } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java index 4d05ce24979..9cf2c5fede3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java @@ -22,12 +22,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import com.cloud.offering.ServiceOffering; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; 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.BaseAsyncCmd; @@ -38,12 +36,14 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import org.apache.cloudstack.api.response.UserVmResponse; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ManagementServerException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.VirtualMachineMigrationException; +import com.cloud.offering.ServiceOffering; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; @@ -133,6 +133,16 @@ public class ScaleVMCmd extends BaseAsyncCmd implements UserCmd { return "upgrading vm: " + this._uuidMgr.getUuid(VirtualMachine.class, getId()) + " to service offering: " + this._uuidMgr.getUuid(ServiceOffering.class, getServiceOfferingId()); } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } + @Override public void execute() { UserVm result; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java index ffbce175b5d..2e7f5a6f0d5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java @@ -24,7 +24,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -151,12 +151,12 @@ public class StartVMCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java index 8e1c3cbbaa8..529e09a0753 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -101,12 +101,12 @@ public class StopVMCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java index 6cc9f16d8c1..cc0d7afacdd 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java @@ -21,13 +21,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.cloud.utils.exception.CloudRuntimeException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; 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.BaseCustomIdCmd; @@ -39,11 +37,13 @@ import org.apache.cloudstack.api.response.GuestOSResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Dhcp; import com.cloud.vm.VirtualMachine; @@ -286,4 +286,14 @@ public class UpdateVMCmd extends BaseCustomIdCmd implements SecurityGroupAction, } } + + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java index a9ea7bd2427..aee5307a233 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java @@ -22,7 +22,7 @@ import java.util.EnumSet; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -179,8 +179,8 @@ public class UpdateVmNicIpCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.IpAddress; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; } } 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 7cb3194e970..fc78edbe87b 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 @@ -17,12 +17,10 @@ package org.apache.cloudstack.api.command.user.vmsnapshot; -import org.apache.log4j.Logger; - -import com.cloud.vm.VirtualMachine; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; 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.BaseAsyncCreateCmd; @@ -31,10 +29,12 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VMSnapshotResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.ResourceAllocationException; import com.cloud.uservm.UserVm; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.snapshot.VMSnapshot; @APICommand(name = "createVMSnapshot", description = "Creates snapshot for a vm.", responseObject = VMSnapshotResponse.class, since = "4.2.0", entityType = {VMSnapshot.class}, @@ -132,4 +132,8 @@ public class CreateVMSnapshotCmd extends BaseAsyncCreateCmd { return userVM.getAccountId(); } + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VmSnapshot; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java index 03c9d43d9e2..a712d44fc47 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.user.vmsnapshot; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -89,4 +90,13 @@ public class DeleteVMSnapshotCmd extends BaseAsyncCmd { return EventTypes.EVENT_VM_SNAPSHOT_DELETE; } + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VmSnapshot; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java index 86562ad97b3..42cd18bfa2f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vmsnapshot; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -97,4 +98,13 @@ public class RevertToVMSnapshotCmd extends BaseAsyncCmd implements UserCmd { return EventTypes.EVENT_VM_SNAPSHOT_REVERT; } + @Override + public Long getApiResourceId() { + return getVmSnapShotId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VmSnapshot; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java index 18770b210b7..05c84172520 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.Parameter; @@ -87,12 +87,12 @@ public class AttachVolumeCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java index a54bda19206..3426a95686d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java @@ -20,7 +20,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCustomIdCmd; @@ -183,8 +183,8 @@ public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd implements UserC } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java index 678299c8b5a..020d7ca8452 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java @@ -15,6 +15,7 @@ // specific language governing permissions and limitations // under the License. package org.apache.cloudstack.api.command.user.volume; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -79,6 +80,16 @@ public class DeleteVolumeCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } + @Override public void execute() throws ConcurrentOperationException { CallContext.current().setEventDetails("Volume Id: " + this._uuidMgr.getUuid(Volume.class, getId())); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DestroyVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DestroyVolumeCmd.java index ed845789390..f4007ce9f40 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DestroyVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DestroyVolumeCmd.java @@ -22,7 +22,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -106,12 +106,12 @@ public class DestroyVolumeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java index 1e38ca24ed0..e92f6a3cb0d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.Parameter; @@ -93,12 +93,12 @@ public class DetachVolumeCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java index f48236680e1..8534012c6bd 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -101,12 +101,12 @@ public class ExtractVolumeCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java index 0b3e6dd5ce1..b1d0d3d5b4f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java @@ -20,11 +20,10 @@ import java.util.List; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.BaseCmd.CommandType; import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.command.user.UserCmd; import org.apache.cloudstack.api.response.ClusterResponse; @@ -157,8 +156,8 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd implements UserCm } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java index 44dd4bf8c39..3f841e3f12e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java @@ -16,8 +16,8 @@ // under the License. package org.apache.cloudstack.api.command.user.volume; -import com.cloud.storage.StoragePool; 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.BaseAsyncCmd; @@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.VolumeResponse; import com.cloud.event.EventTypes; +import com.cloud.storage.StoragePool; import com.cloud.storage.Volume; import com.cloud.user.Account; @@ -133,4 +134,14 @@ public class MigrateVolumeCmd extends BaseAsyncCmd implements UserCmd { } return null; } + + @Override + public Long getApiResourceId() { + return volumeId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RecoverVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RecoverVolumeCmd.java index f5bb1ddd676..2589f816bc6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RecoverVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RecoverVolumeCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.volume; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -76,6 +77,16 @@ public class RecoverVolumeCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } + @Override + public Long getApiResourceId() { + return id; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } + @Override public void execute() { CallContext.current().setEventDetails("Volume Id: " + getId()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RemoveResourceDetailCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RemoveResourceDetailCmd.java index 703fe8a1bda..c2daa4ff317 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RemoveResourceDetailCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/RemoveResourceDetailCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.volume; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.Parameter; @@ -77,8 +77,8 @@ public class RemoveResourceDetailCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java index 1f1bc6a8fc1..316378097fb 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.Parameter; @@ -133,8 +133,13 @@ public class ResizeVolumeCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } + + @Override + public Long getApiResourceId() { + return id; } public static String getResultObjectName() { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java index 345221e1de4..e7782674828 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java @@ -22,7 +22,7 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCustomIdCmd; @@ -121,12 +121,12 @@ public class UpdateVolumeCmd extends BaseAsyncCustomIdCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Volume; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java index 236a4c8c7a6..b40761d123a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java @@ -16,10 +16,8 @@ // under the License. package org.apache.cloudstack.api.command.user.volume; -import com.cloud.dc.DataCenter; -import org.apache.log4j.Logger; - 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.BaseAsyncCmd; @@ -33,7 +31,9 @@ import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; +import com.cloud.dc.DataCenter; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -179,4 +179,8 @@ public class UploadVolumeCmd extends BaseAsyncCmd implements UserCmd { return EventTypes.EVENT_VOLUME_UPLOAD; } + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Volume; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java index 849d1ecbc0b..40e1932393c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.vpc; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -144,7 +144,7 @@ public class CreateStaticRouteCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StaticRoute; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StaticRoute; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java index 9449e6d534a..8065c2fbc33 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java @@ -21,7 +21,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -121,7 +121,7 @@ public class DeleteStaticRouteCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.StaticRoute; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.StaticRoute; } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java index 9d13b63e6a2..89705524d4c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vpc; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -113,4 +114,14 @@ public class DeleteVPCCmd extends BaseAsyncCmd { public Long getSyncObjId() { return getId(); } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Vpc; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java index aade0c2886a..597f14415a3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.user.vpc; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; 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.BaseAsyncCmd; @@ -130,4 +131,14 @@ public class RestartVPCCmd extends BaseAsyncCmd { public Long getSyncObjId() { return getId(); } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Vpc; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java index 92f02ca2622..190a0e5cbc5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vpc; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -134,4 +135,14 @@ public class UpdateVPCCmd extends BaseAsyncCustomIdCmd implements UserCmd { _uuidMgr.checkUuid(getCustomId(), Vpc.class); } } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Vpc; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java index 9508fa50e35..b6ea5cc426c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vpn; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -201,4 +202,14 @@ public class CreateRemoteAccessVpnCmd extends BaseAsyncCreateCmd { else return display; } + + @Override + public Long getApiResourceId() { + return getPublicIpId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java index 36549e4d820..93cce3286e6 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java @@ -16,26 +16,27 @@ // under the License. package org.apache.cloudstack.api.command.user.vpn; -import org.apache.cloudstack.api.ApiArgValidator; -import org.apache.log4j.Logger; 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; +import org.apache.cloudstack.api.BaseAsyncCreateCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.BaseCmd.CommandType; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.Site2SiteCustomerGatewayResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceAllocationException; import com.cloud.network.Site2SiteCustomerGateway; @APICommand(name = "createVpnCustomerGateway", description = "Creates site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = {Site2SiteCustomerGateway.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) -public class CreateVpnCustomerGatewayCmd extends BaseAsyncCmd { +public class CreateVpnCustomerGatewayCmd extends BaseAsyncCreateCmd { public static final Logger s_logger = Logger.getLogger(CreateVpnCustomerGatewayCmd.class.getName()); private static final String s_name = "createvpncustomergatewayresponse"; @@ -192,8 +193,19 @@ public class CreateVpnCustomerGatewayCmd extends BaseAsyncCmd { } @Override - public void execute() { + public void create() throws ResourceAllocationException { Site2SiteCustomerGateway result = _s2sVpnService.createCustomerGateway(this); + if (result != null) { + setEntityId(result.getId()); + setEntityUuid(result.getUuid()); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create customer VPN gateway"); + } + } + + @Override + public void execute() { + Site2SiteCustomerGateway result = _s2sVpnService.getCustomerGateway(getEntityId()); if (result != null) { Site2SiteCustomerGatewayResponse response = _responseGenerator.createSite2SiteCustomerGatewayResponse(result); response.setResponseName(getCommandName()); @@ -202,4 +214,9 @@ public class CreateVpnCustomerGatewayCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create customer VPN gateway"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VpnCustomerGateway; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java index daa305a950a..17831d5c653 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vpn; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -110,4 +111,13 @@ public class DeleteRemoteAccessVpnCmd extends BaseAsyncCmd { return _ravService.getRemoteAccessVpn(publicIpId).getNetworkId(); } + @Override + public Long getApiResourceId() { + return publicIpId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.IpAddress; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java index aad69ce0a9a..cf2b895dd7b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.vpn; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -97,4 +98,14 @@ public class DeleteVpnCustomerGatewayCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete customer VPN gateway"); } } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VpnCustomerGateway; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java index 80a7156e781..247d970e7a7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.user.vpn; import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -196,4 +197,14 @@ public class UpdateVpnCustomerGatewayCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update customer VPN gateway"); } } + + @Override + public Long getApiResourceId() { + return getId(); + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VpnCustomerGateway; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/EventResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/EventResponse.java index da15434e6d0..a3ca777be5a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/EventResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/EventResponse.java @@ -18,14 +18,13 @@ package org.apache.cloudstack.api.response; import java.util.Date; -import com.google.gson.annotations.SerializedName; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; import com.cloud.event.Event; import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; @EntityReference(value = Event.class) @SuppressWarnings("unused") @@ -70,6 +69,18 @@ public class EventResponse extends BaseResponse implements ControlledViewEntityR @Param(description = "the name of the account's domain") private String domainName; + @SerializedName(ApiConstants.RESOURCE_ID) + @Param(description = "the id of the resource", since = "4.17.0") + private String resourceId; + + @SerializedName(ApiConstants.RESOURCE_TYPE) + @Param(description = "the type of the resource", since = "4.17.0") + private String resourceType; + + @SerializedName(ApiConstants.RESOURCE_NAME) + @Param(description = "the name of the resource", since = "4.17.0") + private String resourceName; + @SerializedName(ApiConstants.CREATED) @Param(description = "the date the event was created") private Date created; @@ -117,6 +128,30 @@ public class EventResponse extends BaseResponse implements ControlledViewEntityR this.domainName = domainName; } + public void setResourceId(String resourceId) { + this.resourceId = resourceId; + } + + public String getResourceId() { + return resourceId; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + public String getResourceName() { + return resourceName; + } + public void setCreated(Date created) { this.created = created; } diff --git a/api/src/main/java/org/apache/cloudstack/context/CallContext.java b/api/src/main/java/org/apache/cloudstack/context/CallContext.java index 9df02dd320e..d63ccefd4d3 100644 --- a/api/src/main/java/org/apache/cloudstack/context/CallContext.java +++ b/api/src/main/java/org/apache/cloudstack/context/CallContext.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Stack; import java.util.UUID; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.managed.threadlocal.ManagedThreadLocal; import org.apache.log4j.Logger; import org.apache.log4j.NDC; @@ -56,6 +57,8 @@ public class CallContext { private String eventDetails; private String eventType; private boolean isEventDisplayEnabled = true; // default to true unless specifically set + private Long eventResourceId; + private ApiCommandResourceType eventResourceType; private User user; private long userId; private final Map context = new HashMap(); @@ -327,6 +330,22 @@ public class CallContext { this.eventDescription = eventDescription; } + public Long getEventResourceId() { + return eventResourceId; + } + + public void setEventResourceId(Long eventResourceId) { + this.eventResourceId = eventResourceId; + } + + public ApiCommandResourceType getEventResourceType() { + return eventResourceType; + } + + public void setEventResourceType(ApiCommandResourceType eventResourceType) { + this.eventResourceType = eventResourceType; + } + public Project getProject() { return this.project; } diff --git a/api/src/test/java/org/apache/cloudstack/api/ApiCommandResourceTypeTest.java b/api/src/test/java/org/apache/cloudstack/api/ApiCommandResourceTypeTest.java new file mode 100644 index 00000000000..98c4b938031 --- /dev/null +++ b/api/src/test/java/org/apache/cloudstack/api/ApiCommandResourceTypeTest.java @@ -0,0 +1,71 @@ +// 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; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.cloud.domain.Domain; +import com.cloud.network.Network; +import com.cloud.storage.Volume; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.user.Account; +import com.cloud.vm.VirtualMachine; + +public class ApiCommandResourceTypeTest { + + @Test + public void testGetAssociatedClass() { + Assert.assertNull(ApiCommandResourceType.None.getAssociatedClass()); + Assert.assertEquals(Account.class, ApiCommandResourceType.Account.getAssociatedClass()); + Assert.assertEquals(Domain.class, ApiCommandResourceType.Domain.getAssociatedClass()); + Assert.assertEquals(VirtualMachineTemplate.class, ApiCommandResourceType.Template.getAssociatedClass()); + Assert.assertEquals(VirtualMachine.class, ApiCommandResourceType.VirtualMachine.getAssociatedClass()); + Assert.assertEquals(Network.class, ApiCommandResourceType.Network.getAssociatedClass()); + Assert.assertEquals(Volume.class, ApiCommandResourceType.Volume.getAssociatedClass()); + } + + @Test + public void testValuesFromAssociatedClass() { + List types = ApiCommandResourceType.valuesFromAssociatedClass(Account.class); + Assert.assertNotNull(types); + Assert.assertTrue(types.size() > 0); + Assert.assertEquals(types.get(0), ApiCommandResourceType.Account); + + types = ApiCommandResourceType.valuesFromAssociatedClass(ApiCommandResourceTypeTest.class); + Assert.assertNotNull(types); + Assert.assertEquals(0, types.size()); + } + + @Test + public void testValueFromAssociatedClass() { + Assert.assertEquals(ApiCommandResourceType.valueFromAssociatedClass(VirtualMachine.class), ApiCommandResourceType.VirtualMachine); + Assert.assertNull(ApiCommandResourceType.valueFromAssociatedClass(ApiCommandResourceTypeTest.class)); + } + + @Test + public void testFromString() { + Assert.assertNull(ApiCommandResourceType.fromString(null)); + Assert.assertNull(ApiCommandResourceType.fromString("")); + Assert.assertNull(ApiCommandResourceType.fromString("Something")); + Assert.assertEquals(ApiCommandResourceType.Account, ApiCommandResourceType.fromString("Account")); + Assert.assertEquals(ApiCommandResourceType.Domain, ApiCommandResourceType.fromString("Domain")); + } +} diff --git a/engine/schema/src/main/java/com/cloud/event/EventVO.java b/engine/schema/src/main/java/com/cloud/event/EventVO.java index e5cf2a27397..24c3e8cd064 100644 --- a/engine/schema/src/main/java/com/cloud/event/EventVO.java +++ b/engine/schema/src/main/java/com/cloud/event/EventVO.java @@ -61,6 +61,12 @@ public class EventVO implements Event { @Column(name = "domain_id") private long domainId; + @Column(name = "resource_id") + private long resourceId; + + @Column(name = "resource_type") + private String resourceType; + @Column(name = "level") private String level = LEVEL_INFO; @@ -158,6 +164,24 @@ public class EventVO implements Event { this.domainId = domainId; } + @Override + public Long getResourceId() { + return resourceId; + } + + public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + + @Override + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + @Override public int getTotalSize() { return totalSize; diff --git a/framework/db/src/main/java/com/cloud/dao/EntityManagerImpl.java b/framework/db/src/main/java/com/cloud/dao/EntityManagerImpl.java index 40bc5ebd6fe..e738f1e99ef 100644 --- a/framework/db/src/main/java/com/cloud/dao/EntityManagerImpl.java +++ b/framework/db/src/main/java/com/cloud/dao/EntityManagerImpl.java @@ -22,8 +22,6 @@ import java.util.Map; import javax.naming.ConfigurationException; -import net.sf.ehcache.Cache; - import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.GenericDao; @@ -32,6 +30,8 @@ import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import net.sf.ehcache.Cache; + @SuppressWarnings("unchecked") public class EntityManagerImpl extends ManagerBase implements EntityManager { String _name; @@ -122,4 +122,9 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { dao.remove(id); } + @Override + public boolean validEntityType(Class entityType) { + GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); + return dao != null; + } } diff --git a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java index 34f58933cd4..a963357122e 100644 --- a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java +++ b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java @@ -34,7 +34,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.storage.dao.VolumeDetailsDao; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.log4j.Logger; import org.apache.log4j.NDC; import org.apache.cloudstack.api.ApiErrorCode; @@ -1084,7 +1084,7 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, s_logger.debug("Purge queue item for cancelled job-" + job.getId()); } _queueMgr.purgeAsyncJobQueueItemId(job.getId()); - if (ApiCommandJobType.Volume.toString().equals(job.getInstanceType())) { + if (ApiCommandResourceType.Volume.toString().equals(job.getInstanceType())) { try { _volumeDetailsDao.removeDetail(job.getInstanceId(), "SNAPSHOT_ID"); diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java index d767c2b52bf..b634e73d490 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java +++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java @@ -16,15 +16,15 @@ // under the License. package org.apache.cloudstack.api.command.user.kubernetes.cluster; -import com.cloud.kubernetes.cluster.KubernetesCluster; -import com.cloud.kubernetes.cluster.KubernetesClusterEventTypes; -import com.cloud.kubernetes.cluster.KubernetesClusterService; -import com.cloud.utils.exception.CloudRuntimeException; +import java.security.InvalidParameterException; + +import javax.inject.Inject; + import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -41,8 +41,10 @@ import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; import org.apache.log4j.Logger; -import javax.inject.Inject; -import java.security.InvalidParameterException; +import com.cloud.kubernetes.cluster.KubernetesCluster; +import com.cloud.kubernetes.cluster.KubernetesClusterEventTypes; +import com.cloud.kubernetes.cluster.KubernetesClusterService; +import com.cloud.utils.exception.CloudRuntimeException; @APICommand(name = CreateKubernetesClusterCmd.APINAME, description = "Creates a Kubernetes cluster", @@ -275,8 +277,8 @@ public class CreateKubernetesClusterCmd extends BaseAsyncCreateCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override diff --git a/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/guru/BigSwitchBcfGuestNetworkGuru.java b/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/guru/BigSwitchBcfGuestNetworkGuru.java index 29a29a46bf8..17339949dff 100644 --- a/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/guru/BigSwitchBcfGuestNetworkGuru.java +++ b/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/guru/BigSwitchBcfGuestNetworkGuru.java @@ -23,6 +23,7 @@ import java.util.List; import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -205,7 +206,7 @@ public class BigSwitchBcfGuestNetworkGuru extends GuestNetworkGuru implements Ne } implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vnetId)); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), - EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnetId + " Network Id: " + network.getId(), 0); + EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnetId + " Network Id: " + network.getId(), network.getId(), ApiCommandResourceType.Network.toString(), 0); } else { implemented.setBroadcastUri(network.getBroadcastUri()); } diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/api/command/CreateServiceInstanceCmd.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/api/command/CreateServiceInstanceCmd.java index 59c4e6102ad..3a48cc90c69 100644 --- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/api/command/CreateServiceInstanceCmd.java +++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/api/command/CreateServiceInstanceCmd.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.network.contrail.api.command; import javax.inject.Inject; 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.BaseAsyncCreateCmd; @@ -199,4 +200,8 @@ public class CreateServiceInstanceCmd extends BaseAsyncCreateCmd { return accountId; } + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.SystemVm; + } } diff --git a/plugins/network-elements/netscaler/src/main/java/com/cloud/api/commands/StopNetScalerVMCmd.java b/plugins/network-elements/netscaler/src/main/java/com/cloud/api/commands/StopNetScalerVMCmd.java index af95255da90..5d754168e49 100644 --- a/plugins/network-elements/netscaler/src/main/java/com/cloud/api/commands/StopNetScalerVMCmd.java +++ b/plugins/network-elements/netscaler/src/main/java/com/cloud/api/commands/StopNetScalerVMCmd.java @@ -23,7 +23,7 @@ import org.apache.log4j.Logger; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; @@ -97,12 +97,12 @@ public class StopNetScalerVMCmd extends BaseAsyncCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.DomainRouter; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.DomainRouter; } @Override - public Long getInstanceId() { + public Long getApiResourceId() { return getId(); } diff --git a/plugins/network-elements/ovs/src/main/java/com/cloud/network/guru/OvsGuestNetworkGuru.java b/plugins/network-elements/ovs/src/main/java/com/cloud/network/guru/OvsGuestNetworkGuru.java index 7b0ccdbc07e..f8d851e586e 100644 --- a/plugins/network-elements/ovs/src/main/java/com/cloud/network/guru/OvsGuestNetworkGuru.java +++ b/plugins/network-elements/ovs/src/main/java/com/cloud/network/guru/OvsGuestNetworkGuru.java @@ -17,6 +17,13 @@ package com.cloud.network.guru; +import javax.inject.Inject; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.deploy.DeployDestination; @@ -45,11 +52,6 @@ import com.cloud.user.Account; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import javax.inject.Inject; @Component public class OvsGuestNetworkGuru extends GuestNetworkGuru { @@ -228,7 +230,8 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru { EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " - + network.getId(), 0); + + network.getId(), + network.getId(), ApiCommandResourceType.Network.toString(), 0); } else { implemented.setBroadcastUri(network.getBroadcastUri()); } diff --git a/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java b/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java index 8a45f754fdd..2f30e17e323 100644 --- a/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java +++ b/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java @@ -17,6 +17,11 @@ package com.cloud.network.guru; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.deploy.DeployDestination; @@ -39,9 +44,6 @@ import com.cloud.user.Account; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; @Component public class VxlanGuestNetworkGuru extends GuestNetworkGuru { @@ -102,7 +104,7 @@ public class VxlanGuestNetworkGuru extends GuestNetworkGuru { protected void allocateVnetComplete(Network network, NetworkVO implemented, long dcId, long physicalNetworkId, String reservationId, String vnet) { //TODO(VXLAN): Add new event type for vxlan? ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, - "Assigned Zone vNet: " + vnet + " Network Id: " + network.getId(), 0); + "Assigned Zone vNet: " + vnet + " Network Id: " + network.getId(), network.getId(), ApiCommandResourceType.Network.toString(), 0); } @Override diff --git a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java index 52adc664ff8..72df525882a 100644 --- a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java +++ b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java @@ -18,12 +18,13 @@ */ package org.apache.cloudstack.api.command; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.user.UserAccount; +import java.util.UUID; + +import javax.inject.Inject; + 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; @@ -37,8 +38,10 @@ import org.apache.cloudstack.ldap.LdapUser; import org.apache.cloudstack.ldap.NoLdapUserMatchingQueryException; import org.apache.log4j.Logger; -import javax.inject.Inject; -import java.util.UUID; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.UserAccount; @APICommand(name = LinkAccountToLdapCmd.APINAME, description = "link a cloudstack account to a group or OU in ldap", responseObject = LinkDomainToLdapResponse.class, since = "4.11.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {RoleType.Admin,RoleType.DomainAdmin}) @@ -139,4 +142,15 @@ public class LinkAccountToLdapCmd extends BaseCmd { public short getAccountType() { return accountType; } + + @Override + public Long getApiResourceId() { + Account account = _accountService.getActiveAccountByName(accountName, domainId); + return account != null ? account.getAccountId() : null; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } diff --git a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/ListAndSwitchSAMLAccountCmd.java b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/ListAndSwitchSAMLAccountCmd.java index 895d12f8359..311bf4a3e1a 100644 --- a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/ListAndSwitchSAMLAccountCmd.java +++ b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/ListAndSwitchSAMLAccountCmd.java @@ -16,18 +16,19 @@ // under the License. package org.apache.cloudstack.api.command; -import com.cloud.api.response.ApiResponseSerializer; -import com.cloud.domain.Domain; -import com.cloud.domain.dao.DomainDao; -import com.cloud.exception.CloudAuthenticationException; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.user.UserAccount; -import com.cloud.user.UserAccountVO; -import com.cloud.user.dao.UserAccountDao; -import com.cloud.user.dao.UserDao; -import com.cloud.utils.HttpUtils; +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + 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.ApiServerService; @@ -47,15 +48,17 @@ import org.apache.cloudstack.saml.SAML2AuthManager; import org.apache.cloudstack.saml.SAMLUtils; import org.apache.log4j.Logger; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import com.cloud.api.response.ApiResponseSerializer; +import com.cloud.domain.Domain; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.CloudAuthenticationException; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.UserAccount; +import com.cloud.user.UserAccountVO; +import com.cloud.user.dao.UserAccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.HttpUtils; @APICommand(name = "listAndSwitchSamlAccount", description = "Lists and switches to other SAML accounts owned by the SAML user", responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class ListAndSwitchSAMLAccountCmd extends BaseCmd implements APIAuthenticator { @@ -204,4 +207,9 @@ public class ListAndSwitchSAMLAccountCmd extends BaseCmd implements APIAuthentic s_logger.error("No suitable Pluggable Authentication Manager found for SAML2 listAndSwitchSamlAccount Cmd"); } } + + @Override + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.Account; + } } \ No newline at end of file diff --git a/server/src/main/java/com/cloud/api/ApiAsyncJobDispatcher.java b/server/src/main/java/com/cloud/api/ApiAsyncJobDispatcher.java index 0b7d681ad95..196f640252a 100644 --- a/server/src/main/java/com/cloud/api/ApiAsyncJobDispatcher.java +++ b/server/src/main/java/com/cloud/api/ApiAsyncJobDispatcher.java @@ -21,11 +21,6 @@ import java.util.Map; import javax.inject.Inject; -import org.apache.log4j.Logger; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -36,6 +31,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJob; import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher; import org.apache.cloudstack.framework.jobs.AsyncJobManager; import org.apache.cloudstack.jobs.JobInfo; +import org.apache.log4j.Logger; import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; @@ -43,6 +39,8 @@ import com.cloud.user.User; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.db.EntityManager; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispatcher { private static final Logger s_logger = Logger.getLogger(ApiAsyncJobDispatcher.class); diff --git a/server/src/main/java/com/cloud/api/ApiDBUtils.java b/server/src/main/java/com/cloud/api/ApiDBUtils.java index 28bafe2cb8c..0de3fb0c0c7 100644 --- a/server/src/main/java/com/cloud/api/ApiDBUtils.java +++ b/server/src/main/java/com/cloud/api/ApiDBUtils.java @@ -278,7 +278,7 @@ import org.apache.cloudstack.acl.RoleService; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.dao.AffinityGroupDao; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants.DomainDetails; import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.ApiConstants.VMDetails; @@ -1639,7 +1639,7 @@ public class ApiDBUtils { return null; } String jobInstanceId = null; - ApiCommandJobType jobInstanceType = EnumUtils.fromString(ApiCommandJobType.class, job.getInstanceType(), ApiCommandJobType.None); + ApiCommandResourceType jobInstanceType = EnumUtils.fromString(ApiCommandResourceType.class, job.getInstanceType(), ApiCommandResourceType.None); if (job.getInstanceId() == null) { // when assert is hit, implement 'getInstanceId' of BaseAsyncCmd and return appropriate instance id @@ -1647,118 +1647,118 @@ public class ApiDBUtils { return null; } - if (jobInstanceType == ApiCommandJobType.Volume) { + if (jobInstanceType == ApiCommandResourceType.Volume) { VolumeVO volume = ApiDBUtils.findVolumeById(job.getInstanceId()); if (volume != null) { jobInstanceId = volume.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Template || jobInstanceType == ApiCommandJobType.Iso) { + } else if (jobInstanceType == ApiCommandResourceType.Template || jobInstanceType == ApiCommandResourceType.Iso) { VMTemplateVO template = ApiDBUtils.findTemplateById(job.getInstanceId()); if (template != null) { jobInstanceId = template.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.VirtualMachine || jobInstanceType == ApiCommandJobType.ConsoleProxy || - jobInstanceType == ApiCommandJobType.SystemVm || jobInstanceType == ApiCommandJobType.DomainRouter) { + } else if (jobInstanceType == ApiCommandResourceType.VirtualMachine || jobInstanceType == ApiCommandResourceType.ConsoleProxy || + jobInstanceType == ApiCommandResourceType.SystemVm || jobInstanceType == ApiCommandResourceType.DomainRouter) { VMInstanceVO vm = ApiDBUtils.findVMInstanceById(job.getInstanceId()); if (vm != null) { jobInstanceId = vm.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Snapshot) { + } else if (jobInstanceType == ApiCommandResourceType.Snapshot) { Snapshot snapshot = ApiDBUtils.findSnapshotById(job.getInstanceId()); if (snapshot != null) { jobInstanceId = snapshot.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Host) { + } else if (jobInstanceType == ApiCommandResourceType.Host) { Host host = ApiDBUtils.findHostById(job.getInstanceId()); if (host != null) { jobInstanceId = host.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.StoragePool) { + } else if (jobInstanceType == ApiCommandResourceType.StoragePool) { StoragePoolVO spool = ApiDBUtils.findStoragePoolById(job.getInstanceId()); if (spool != null) { jobInstanceId = spool.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.IpAddress) { + } else if (jobInstanceType == ApiCommandResourceType.IpAddress) { IPAddressVO ip = ApiDBUtils.findIpAddressById(job.getInstanceId()); if (ip != null) { jobInstanceId = ip.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.SecurityGroup) { + } else if (jobInstanceType == ApiCommandResourceType.SecurityGroup) { SecurityGroup sg = ApiDBUtils.findSecurityGroupById(job.getInstanceId()); if (sg != null) { jobInstanceId = sg.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.PhysicalNetwork) { + } else if (jobInstanceType == ApiCommandResourceType.PhysicalNetwork) { PhysicalNetworkVO pnet = ApiDBUtils.findPhysicalNetworkById(job.getInstanceId()); if (pnet != null) { jobInstanceId = pnet.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.TrafficType) { + } else if (jobInstanceType == ApiCommandResourceType.TrafficType) { PhysicalNetworkTrafficTypeVO trafficType = ApiDBUtils.findPhysicalNetworkTrafficTypeById(job.getInstanceId()); if (trafficType != null) { jobInstanceId = trafficType.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.PhysicalNetworkServiceProvider) { + } else if (jobInstanceType == ApiCommandResourceType.PhysicalNetworkServiceProvider) { PhysicalNetworkServiceProvider sp = ApiDBUtils.findPhysicalNetworkServiceProviderById(job.getInstanceId()); if (sp != null) { jobInstanceId = sp.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.FirewallRule) { + } else if (jobInstanceType == ApiCommandResourceType.FirewallRule) { FirewallRuleVO fw = ApiDBUtils.findFirewallRuleById(job.getInstanceId()); if (fw != null) { jobInstanceId = fw.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Account) { + } else if (jobInstanceType == ApiCommandResourceType.Account) { Account acct = ApiDBUtils.findAccountById(job.getInstanceId()); if (acct != null) { jobInstanceId = acct.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.User) { + } else if (jobInstanceType == ApiCommandResourceType.User) { User usr = ApiDBUtils.findUserById(job.getInstanceId()); if (usr != null) { jobInstanceId = usr.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.StaticRoute) { + } else if (jobInstanceType == ApiCommandResourceType.StaticRoute) { StaticRouteVO route = ApiDBUtils.findStaticRouteById(job.getInstanceId()); if (route != null) { jobInstanceId = route.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.PrivateGateway) { + } else if (jobInstanceType == ApiCommandResourceType.PrivateGateway) { VpcGatewayVO gateway = ApiDBUtils.findVpcGatewayById(job.getInstanceId()); if (gateway != null) { jobInstanceId = gateway.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Counter) { + } else if (jobInstanceType == ApiCommandResourceType.Counter) { CounterVO counter = ApiDBUtils.getCounter(job.getInstanceId()); if (counter != null) { jobInstanceId = counter.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Condition) { + } else if (jobInstanceType == ApiCommandResourceType.Condition) { ConditionVO condition = ApiDBUtils.findConditionById(job.getInstanceId()); if (condition != null) { jobInstanceId = condition.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.AutoScalePolicy) { + } else if (jobInstanceType == ApiCommandResourceType.AutoScalePolicy) { AutoScalePolicyVO policy = ApiDBUtils.findAutoScalePolicyById(job.getInstanceId()); if (policy != null) { jobInstanceId = policy.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.AutoScaleVmProfile) { + } else if (jobInstanceType == ApiCommandResourceType.AutoScaleVmProfile) { AutoScaleVmProfileVO profile = ApiDBUtils.findAutoScaleVmProfileById(job.getInstanceId()); if (profile != null) { jobInstanceId = profile.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.AutoScaleVmGroup) { + } else if (jobInstanceType == ApiCommandResourceType.AutoScaleVmGroup) { AutoScaleVmGroupVO group = ApiDBUtils.findAutoScaleVmGroupById(job.getInstanceId()); if (group != null) { jobInstanceId = group.getUuid(); } - } else if (jobInstanceType == ApiCommandJobType.Network) { + } else if (jobInstanceType == ApiCommandResourceType.Network) { NetworkVO networkVO = ApiDBUtils.findNetworkById(job.getInstanceId()); if(networkVO != null) { jobInstanceId = networkVO.getUuid(); } - } else if (jobInstanceType != ApiCommandJobType.None) { + } else if (jobInstanceType != ApiCommandResourceType.None) { // TODO : when we hit here, we need to add instanceType -> UUID // entity table mapping assert (false); diff --git a/server/src/main/java/com/cloud/api/ApiDispatcher.java b/server/src/main/java/com/cloud/api/ApiDispatcher.java index 11615ea3f54..3880f2aa9d1 100644 --- a/server/src/main/java/com/cloud/api/ApiDispatcher.java +++ b/server/src/main/java/com/cloud/api/ApiDispatcher.java @@ -21,14 +21,11 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; -import com.cloud.projects.Project; -import com.cloud.utils.db.EntityManager; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.InfrastructureEntity; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -38,12 +35,15 @@ import org.apache.cloudstack.api.BaseCustomIdCmd; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.jobs.AsyncJob; import org.apache.cloudstack.framework.jobs.AsyncJobManager; +import org.apache.log4j.Logger; import com.cloud.api.dispatch.DispatchChain; import com.cloud.api.dispatch.DispatchChainFactory; import com.cloud.api.dispatch.DispatchTask; +import com.cloud.projects.Project; import com.cloud.user.Account; import com.cloud.user.AccountManager; +import com.cloud.utils.db.EntityManager; public class ApiDispatcher { private static final Logger s_logger = Logger.getLogger(ApiDispatcher.class.getName()); @@ -115,6 +115,13 @@ public class ApiDispatcher { Project project = _entityMgr.findByUuidIncludingRemoved(Project.class, params.get(ApiConstants.PROJECT_ID)); ctx.setProject(project); } + if (cmd.getApiResourceId() != null) { + ctx.setEventResourceId(cmd.getApiResourceId()); + } + final ApiCommandResourceType resourceType = cmd.getApiResourceType(); + if (resourceType != null && !ApiCommandResourceType.None.equals(resourceType)) { + ctx.setEventResourceType(resourceType); + } // TODO This if shouldn't be here. Use polymorphism and move it to validateSpecificParameters if (cmd instanceof BaseAsyncCmd) { diff --git a/server/src/main/java/com/cloud/api/ApiServer.java b/server/src/main/java/com/cloud/api/ApiServer.java index 91812e65517..c40edaceba3 100644 --- a/server/src/main/java/com/cloud/api/ApiServer.java +++ b/server/src/main/java/com/cloud/api/ApiServer.java @@ -724,7 +724,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer // save the scheduled event final Long eventId = ActionEventUtils.onScheduledActionEvent((callerUserId == null) ? (Long)User.UID_SYSTEM : callerUserId, asyncCmd.getEntityOwnerId(), asyncCmd.getEventType(), - asyncCmd.getEventDescription(), asyncCmd.isDisplay(), startEventId); + asyncCmd.getEventDescription(), asyncCmd.getApiResourceId(), asyncCmd.getApiResourceType().toString(), asyncCmd.isDisplay(), startEventId); if (startEventId == 0) { // There was no create event before, set current event id as start eventId startEventId = eventId; @@ -734,7 +734,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer params.put("cmdEventType", asyncCmd.getEventType().toString()); params.put("ctxDetails", ApiGsonHelper.getBuilder().create().toJson(ctx.getContextParameters())); - Long instanceId = (objectId == null) ? asyncCmd.getInstanceId() : objectId; + Long instanceId = (objectId == null) ? asyncCmd.getApiResourceId() : objectId; // users can provide the job id they want to use, so log as it is a uuid and is unique String injectedJobId = asyncCmd.getInjectedJobId(); @@ -742,7 +742,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer AsyncJobVO job = new AsyncJobVO("", callerUserId, caller.getId(), cmdObj.getClass().getName(), ApiGsonHelper.getBuilder().create().toJson(params), instanceId, - asyncCmd.getInstanceType() != null ? asyncCmd.getInstanceType().toString() : null, + asyncCmd.getApiResourceType() != null ? asyncCmd.getApiResourceType().toString() : null, injectedJobId); job.setDispatcher(asyncDispatcher.getName()); @@ -797,9 +797,9 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer // list all jobs for ROOT admin if (accountMgr.isRootAdmin(account.getId())) { - jobs = asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType().toString(), null); + jobs = asyncMgr.findInstancePendingAsyncJobs(command.getApiResourceType().toString(), null); } else { - jobs = asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType().toString(), account.getId()); + jobs = asyncMgr.findInstancePendingAsyncJobs(command.getApiResourceType().toString(), account.getId()); } if (jobs.size() == 0) { diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 0263abd255d..bedfd30e140 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -25,19 +25,24 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; +import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; +import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.ResourceDetail; import org.apache.cloudstack.api.ResponseGenerator; import org.apache.cloudstack.api.ResponseObject.ResponseView; @@ -124,6 +129,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -237,8 +243,8 @@ import com.cloud.user.dao.UserDao; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.StringUtils; import com.cloud.utils.Ternary; +import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; @@ -256,7 +262,6 @@ import com.cloud.vm.VmDetailConstants; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; -import com.google.common.base.Strings; @Component public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements QueryService, Configurable { @@ -450,6 +455,9 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q @Inject private ResourceIconDao resourceIconDao; + @Inject + EntityManager entityManager; + private SearchCriteria getMinimumCpuServiceOfferingJoinSearchCriteria(int cpu) { SearchCriteria sc = _srvOfferingJoinDao.createSearchCriteria(); SearchCriteria sc1 = _srvOfferingJoinDao.createSearchCriteria(); @@ -659,6 +667,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> searchForEventsInternal(ListEventsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); + boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getId()); List permittedAccounts = new ArrayList(); Long id = cmd.getId(); @@ -670,6 +679,37 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Integer entryTime = cmd.getEntryTime(); Integer duration = cmd.getDuration(); Long startId = cmd.getStartId(); + final String resourceUuid = cmd.getResourceId(); + final String resourceTypeStr = cmd.getResourceType(); + ApiCommandResourceType resourceType = null; + Long resourceId = null; + if (resourceTypeStr != null) { + resourceType = ApiCommandResourceType.fromString(resourceTypeStr); + if (resourceType == null) { + throw new InvalidParameterValueException(String.format("Invalid %s", ApiConstants.RESOURCE_TYPE)); + } + } + if (resourceUuid != null) { + if (resourceTypeStr == null) { + throw new InvalidParameterValueException(String.format("%s parameter must be used with %s parameter", ApiConstants.RESOURCE_ID, ApiConstants.RESOURCE_TYPE)); + } + try { + UUID.fromString(resourceUuid); + } catch (IllegalArgumentException ex) { + throw new InvalidParameterValueException(String.format("Invalid %s", ApiConstants.RESOURCE_ID)); + } + Object object = entityManager.findByUuidIncludingRemoved(resourceType.getAssociatedClass(), resourceUuid); + if (object instanceof InternalIdentity) { + resourceId = ((InternalIdentity)object).getId(); + } + if (resourceId == null) { + throw new InvalidParameterValueException(String.format("Invalid %s", ApiConstants.RESOURCE_ID)); + } + if (!isRootAdmin && object instanceof ControlledEntity) { + ControlledEntity entity = (ControlledEntity)object; + _accountMgr.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.ListEntry, entity.getAccountId() == caller.getId(), entity); + } + } Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); @@ -693,6 +733,8 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); sb.and("displayEvent", sb.entity().getDisplay(), SearchCriteria.Op.EQ); sb.and("archived", sb.entity().getArchived(), SearchCriteria.Op.EQ); + sb.and("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); + sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); // building ACL condition @@ -738,6 +780,14 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sc.setParameters("createDateL", endDate); } + if (resourceId != null) { + sc.setParameters("resourceId", resourceId); + } + + if (resourceType != null) { + sc.setParameters("resourceType", resourceType.toString()); + } + sc.setParameters("archived", false); Pair, Integer> eventPair = null; @@ -791,7 +841,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q boolean listAll = cmd.listAll(); Long projectId = cmd.getProjectId(); - if (projectId == null && ResourceObjectType.Project.name().equalsIgnoreCase(resourceType) && !Strings.isNullOrEmpty(resourceId)) { + if (projectId == null && ResourceObjectType.Project.name().equalsIgnoreCase(resourceType) && StringUtils.isNotEmpty(resourceId)) { try { projectId = Long.parseLong(resourceId); } catch (final NumberFormatException e) { @@ -1567,7 +1617,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } accountId = owner.getId(); } - if (!Strings.isNullOrEmpty(username)) { + if (StringUtils.isNotEmpty(username)) { User owner = userDao.getUserByName(username, domainId); if (owner == null) { throw new InvalidParameterValueException("Unable to find user " + username + " in domain " + domainId); @@ -1581,7 +1631,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (accountName != null) { throw new InvalidParameterValueException("could not find account " + accountName + " because domain is not specified"); } - if (!Strings.isNullOrEmpty(username)) { + if (StringUtils.isNotEmpty(username)) { throw new InvalidParameterValueException("could not find user " + username + " because domain is not specified"); } } @@ -1594,7 +1644,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q throw new PermissionDeniedException("Can't list domain id= " + domainId + " projects; unauthorized"); } - if (!Strings.isNullOrEmpty(username) && !username.equals(user.getUsername())) { + if (StringUtils.isNotEmpty(username) && !username.equals(user.getUsername())) { throw new PermissionDeniedException("Can't list user " + username + " projects; unauthorized"); } @@ -3182,7 +3232,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } if (currentVmOffering != null) { - List storageTags = StringUtils.csvTagsToList(currentVmOffering.getTags()); + List storageTags = com.cloud.utils.StringUtils.csvTagsToList(currentVmOffering.getTags()); if (!storageTags.isEmpty()) { SearchBuilder sb = _srvOfferingJoinDao.createSearchBuilder(); for(String tag : storageTags) { @@ -3197,7 +3247,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sc.addAnd("storageTags", SearchCriteria.Op.SC, scc); } - List hostTags = StringUtils.csvTagsToList(currentVmOffering.getHostTag()); + List hostTags = com.cloud.utils.StringUtils.csvTagsToList(currentVmOffering.getHostTag()); if (!hostTags.isEmpty()) { SearchBuilder sb = _srvOfferingJoinDao.createSearchBuilder(); for(String tag : hostTags) { @@ -3849,10 +3899,10 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q case Template: case UserVm: HypervisorType hypervisorType = HypervisorType.None; - if (!Strings.isNullOrEmpty(resourceUuid) && ResourceObjectType.Template.equals(type)) { + if (StringUtils.isNotEmpty(resourceUuid) && ResourceObjectType.Template.equals(type)) { hypervisorType = _templateDao.findByUuid(resourceUuid).getHypervisorType(); } - if (!Strings.isNullOrEmpty(resourceUuid) && ResourceObjectType.UserVm.equals(type)) { + if (StringUtils.isNotEmpty(resourceUuid) && ResourceObjectType.UserVm.equals(type)) { hypervisorType = _vmInstanceDao.findByUuid(resourceUuid).getHypervisorType(); } fillVMOrTemplateDetailOptions(options, hypervisorType); diff --git a/server/src/main/java/com/cloud/api/query/vo/AsyncJobJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/AsyncJobJoinVO.java index d88cbe0af01..6dc8720dcbb 100644 --- a/server/src/main/java/com/cloud/api/query/vo/AsyncJobJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/AsyncJobJoinVO.java @@ -25,7 +25,7 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.framework.jobs.AsyncJob; import com.cloud.utils.db.GenericDao; @@ -93,7 +93,7 @@ public class AsyncJobJoinVO extends BaseViewVO implements ControlledViewEntity { @Enumerated(value = EnumType.STRING) @Column(name = "instance_type", length = 64) - private ApiCommandJobType instanceType; + private ApiCommandResourceType instanceType; @Column(name = "instance_id", length = 64) private Long instanceId; @@ -190,7 +190,7 @@ public class AsyncJobJoinVO extends BaseViewVO implements ControlledViewEntity { return removed; } - public ApiCommandJobType getInstanceType() { + public ApiCommandResourceType getInstanceType() { return instanceType; } diff --git a/server/src/main/java/com/cloud/api/query/vo/EventJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/EventJoinVO.java index 3584038fab0..9d9c865b7a3 100644 --- a/server/src/main/java/com/cloud/api/query/vo/EventJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/EventJoinVO.java @@ -95,6 +95,12 @@ public class EventJoinVO extends BaseViewVO implements ControlledViewEntity { @Column(name = "domain_path") private String domainPath = null; + @Column(name = "resource_id") + private Long resourceId; + + @Column(name = "resource_type") + private String resourceType; + @Column(name = "project_id") private long projectId; @@ -163,6 +169,14 @@ public class EventJoinVO extends BaseViewVO implements ControlledViewEntity { return domainPath; } + public Long getResourceId() { + return resourceId; + } + + public String getResourceType() { + return resourceType; + } + public long getProjectId() { return projectId; } diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index e5347c4dcc2..53fb70d49f7 100755 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -116,6 +116,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -243,7 +244,6 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.StringUtils; import com.cloud.utils.UriUtils; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.DB; @@ -269,7 +269,6 @@ import com.cloud.vm.dao.VMInstanceDao; import com.google.common.base.Enums; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import com.google.common.collect.Sets; import com.googlecode.ipv6.IPv6Address; @@ -552,7 +551,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati @Override public void onPublishMessage(String serderAddress, String subject, Object args) { String globalSettingUpdated = (String) args; - if (Strings.isNullOrEmpty(globalSettingUpdated)) { + if (StringUtils.isEmpty(globalSettingUpdated)) { return; } if (globalSettingUpdated.equals(ApiServiceConfiguration.ManagementServerAddresses.key()) || @@ -1328,7 +1327,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati checkIpRange(startIp, endIp, cidrAddress, cidrSize); // Check if the IP range overlaps with the public ip - if(!Strings.isNullOrEmpty(startIp)) { + if(StringUtils.isNotEmpty(startIp)) { checkOverlapPublicIpRange(zoneId, startIp, endIp); } @@ -1365,6 +1364,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati @Override @DB + @ActionEvent(eventType = EventTypes.EVENT_POD_DELETE, eventDescription = "deleting pod", async = false) public boolean deletePod(final DeletePodCmd cmd) { final Long podId = cmd.getId(); @@ -1462,7 +1462,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati String endIp = cmd.getEndIp(); final boolean forSystemVms = cmd.isForSystemVms(); String vlan = cmd.getVlan(); - if (!(Strings.isNullOrEmpty(vlan) || vlan.startsWith(BroadcastDomainType.Vlan.scheme()))) { + if (StringUtils.isNotEmpty(vlan) && !vlan.startsWith(BroadcastDomainType.Vlan.scheme())) { vlan = BroadcastDomainType.Vlan.toUri(vlan).toString(); } @@ -1839,11 +1839,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati private void verifyIpRangeParameters(String startIP, String endIp) { - if (!Strings.isNullOrEmpty(startIP) && !NetUtils.isValidIp4(startIP)) { + if (StringUtils.isNotEmpty(startIP) && !NetUtils.isValidIp4(startIP)) { throw new InvalidParameterValueException("The current start address of the IP range " + startIP + " is not a valid IP address."); } - if (!Strings.isNullOrEmpty(endIp) && !NetUtils.isValidIp4(endIp)) { + if (StringUtils.isNotEmpty(endIp) && !NetUtils.isValidIp4(endIp)) { throw new InvalidParameterValueException("The current end address of the IP range " + endIp + " is not a valid IP address."); } @@ -1872,6 +1872,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } @Override + @ActionEvent(eventType = EventTypes.EVENT_POD_EDIT, eventDescription = "updating pod", async = false) public Pod editPod(final UpdatePodCmd cmd) { return editPod(cmd.getId(), cmd.getPodName(), null, null, cmd.getGateway(), cmd.getNetmask(), cmd.getAllocationState()); } @@ -1891,7 +1892,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // pod has allocated private IP addresses if (podHasAllocatedPrivateIPs(id)) { - if (!Strings.isNullOrEmpty(netmask)) { + if (StringUtils.isNotEmpty(netmask)) { final long newCidr = NetUtils.getCidrSize(netmask); final long oldCidr = pod.getCidrSize(); @@ -1985,6 +1986,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } @Override + @ActionEvent(eventType = EventTypes.EVENT_POD_CREATE, eventDescription = "creating pod", async = false) public Pod createPod(final long zoneId, final String name, final String startIp, final String endIp, final String gateway, final String netmask, String allocationState) { // Check if the gateway is a valid IP address if (!NetUtils.isValidIp4(gateway)) { @@ -2028,7 +2030,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // endIp is an optional parameter; if not specified - default it to the // end ip of the pod's cidr - if (!Strings.isNullOrEmpty(startIp)) { + if (StringUtils.isNotEmpty(startIp)) { if (endIp == null) { endIp = NetUtils.getIpRangeEndIpFromCidr(cidrAddress, cidrSize); } @@ -2040,7 +2042,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati // Create the new pod in the database String ipRange; - if (!Strings.isNullOrEmpty(startIp)) { + if (StringUtils.isNotEmpty(startIp)) { ipRange = startIp + "-" + endIp + "-" + DefaultForSystemVmsForPodIpRange + "-" + DefaultVlanForPodIpRange; } else { throw new InvalidParameterValueException("Start ip is required parameter"); @@ -2061,7 +2063,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final HostPodVO pod = _podDao.persist(podFinal); - if (!Strings.isNullOrEmpty(startIp)) { + if (StringUtils.isNotEmpty(startIp)) { _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIpFinal, false, null); } @@ -2070,6 +2072,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]); } + CallContext.current().putContextParameter(Pod.class, pod.getUuid()); + return pod; } }); @@ -2182,24 +2186,24 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati private void checkIpRange(final String startIp, final String endIp, final String cidrAddress, final long cidrSize) { //Checking not null for start IP as well. Previously we assumed to be not null always. //But the check is required for the change in updatePod API. - if (!Strings.isNullOrEmpty(startIp) && !NetUtils.isValidIp4(startIp)) { + if (StringUtils.isNotEmpty(startIp) && !NetUtils.isValidIp4(startIp)) { throw new InvalidParameterValueException("The start address of the IP range is not a valid IP address."); } - if (!Strings.isNullOrEmpty(endIp) && !NetUtils.isValidIp4(endIp)) { + if (StringUtils.isNotEmpty(endIp) && !NetUtils.isValidIp4(endIp)) { throw new InvalidParameterValueException("The end address of the IP range is not a valid IP address."); } //Not null check is required for the change in updatePod API. - if (!Strings.isNullOrEmpty(startIp) && !NetUtils.getCidrSubNet(startIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { + if (StringUtils.isNotEmpty(startIp) && !NetUtils.getCidrSubNet(startIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The start address of the IP range is not in the CIDR subnet."); } - if (!Strings.isNullOrEmpty(endIp) && !NetUtils.getCidrSubNet(endIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { + if (StringUtils.isNotEmpty(endIp) && !NetUtils.getCidrSubNet(endIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The end address of the IP range is not in the CIDR subnet."); } - if (!Strings.isNullOrEmpty(endIp) && NetUtils.ip2Long(startIp) > NetUtils.ip2Long(endIp)) { + if (StringUtils.isNotEmpty(endIp) && NetUtils.ip2Long(startIp) > NetUtils.ip2Long(endIp)) { throw new InvalidParameterValueException("The start IP address must have a lower value than the end IP address."); } @@ -2909,7 +2913,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final ProvisioningType typedProvisioningType = ProvisioningType.getProvisioningType(provisioningType); - tags = StringUtils.cleanupTags(tags); + tags = com.cloud.utils.StringUtils.cleanupTags(tags); ServiceOfferingVO offering = new ServiceOfferingVO(name, cpu, ramSize, speed, networkRate, null, offerHA, limitResourceUse, volatileVm, displayText, typedProvisioningType, localStorageRequired, false, tags, isSystem, vmType, @@ -3037,6 +3041,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } CallContext.current().setEventDetails("Service offering id=" + offering.getId()); + CallContext.current().putContextParameter(ServiceOffering.class, offering.getUuid()); return offering; } else { return null; @@ -3328,7 +3333,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati throw new InvalidParameterValueException(String.format("Unable to create disk offering by user: %s because it is not root-admin or domain-admin", user.getUuid())); } - tags = StringUtils.cleanupTags(tags); + tags = com.cloud.utils.StringUtils.cleanupTags(tags); final DiskOfferingVO newDiskOffering = new DiskOfferingVO(name, description, typedProvisioningType, diskSize, tags, isCustomized, isCustomizedIops, minIops, maxIops); newDiskOffering.setUseLocalStorage(localStorageRequired); @@ -3375,6 +3380,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati diskOfferingDetailsDao.saveDetails(detailsVO); } CallContext.current().setEventDetails("Disk offering id=" + newDiskOffering.getId()); + CallContext.current().putContextParameter(DiskOffering.class, newDiskOffering.getId()); return offering; } return null; @@ -3718,7 +3724,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati protected void updateOfferingTagsIfIsNotNull(String tags, DiskOfferingVO diskOffering) { if (tags == null) { return; } if (StringUtils.isNotBlank(tags)) { - tags = StringUtils.cleanupTags(tags); + tags = com.cloud.utils.StringUtils.cleanupTags(tags); List pools = _storagePoolDao.listStoragePoolsWithActiveVolumesByOfferingId(diskOffering.getId()); if (CollectionUtils.isNotEmpty(pools)) { List listOfTags = Arrays.asList(tags.split(",")); @@ -3748,7 +3754,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return; } if (StringUtils.isNotBlank(hostTags)) { - hostTags = StringUtils.cleanupTags(hostTags); + hostTags = com.cloud.utils.StringUtils.cleanupTags(hostTags); List hosts = _hostDao.listHostsWithActiveVMs(offering.getId()); if (CollectionUtils.isNotEmpty(hosts)) { List listOfHostTags = Arrays.asList(hostTags.split(",")); @@ -4684,7 +4690,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati endIp = MoreObjects.firstNonNull(endIp, currentEndIP); final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); - if (Strings.isNullOrEmpty(cidr)) { + if (StringUtils.isEmpty(cidr)) { throw new InvalidParameterValueException(String.format("Invalid gateway (%s) or netmask (%s)", gateway, netmask)); } final String cidrAddress = getCidrAddress(cidr); @@ -4812,8 +4818,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati (List listAllocatedIPs, String startIp, String endIp, Boolean forSystemVms) { Collections.sort(listAllocatedIPs, Comparator.comparing(IPAddressVO::getAddress)); for (IPAddressVO allocatedIP : listAllocatedIPs) { - if ((!Strings.isNullOrEmpty(startIp) && NetUtils.ip2Long(startIp) > NetUtils.ip2Long(allocatedIP.getAddress().addr())) - || (!Strings.isNullOrEmpty(endIp) && NetUtils.ip2Long(endIp) < NetUtils.ip2Long(allocatedIP.getAddress().addr()))) { + if ((StringUtils.isNotEmpty(startIp) && NetUtils.ip2Long(startIp) > NetUtils.ip2Long(allocatedIP.getAddress().addr())) + || (StringUtils.isNotEmpty(endIp) && NetUtils.ip2Long(endIp) < NetUtils.ip2Long(allocatedIP.getAddress().addr()))) { throw new InvalidParameterValueException(String.format("The start IP address must be less than or equal to %s which is already in use. " + "The end IP address must be greater than or equal to %s which is already in use. " + "There are %d IPs already allocated in this range.", @@ -4828,9 +4834,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati private void checkAllocatedIpv6sAreWithinVlanRange(List listAllocatedIPs, String startIpv6, String endIpv6) { Collections.sort(listAllocatedIPs, Comparator.comparing(UserIpv6AddressVO::getAddress)); for (UserIpv6AddressVO allocatedIP : listAllocatedIPs) { - if ((!Strings.isNullOrEmpty(startIpv6) + if ((StringUtils.isNotEmpty(startIpv6) && IPv6Address.fromString(startIpv6).toBigInteger().compareTo(IPv6Address.fromString(allocatedIP.getAddress()).toBigInteger()) > 0) - || (!Strings.isNullOrEmpty(endIpv6) + || (StringUtils.isNotEmpty(endIpv6) && IPv6Address.fromString(endIpv6).toBigInteger().compareTo(IPv6Address.fromString(allocatedIP.getAddress()).toBigInteger()) < 0)) { throw new InvalidParameterValueException(String.format("The start IPv6 address must be less than or equal to %s which is already in use. " + "The end IPv6 address must be greater than or equal to %s which is already in use. " @@ -5797,6 +5803,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final NetworkOfferingVO offering = createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false, serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details, egressDefaultPolicy, maxconn, enableKeepAlive, forVpc, domainIds, zoneIds, enable); CallContext.current().setEventDetails(" Id: " + offering.getId() + " Name: " + name); + CallContext.current().putContextParameter(NetworkOffering.class, offering.getId()); return offering; } @@ -5947,7 +5954,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final String multicastRateStr = _configDao.getValue("multicast.throttling.rate"); final int multicastRate = multicastRateStr == null ? 10 : Integer.parseInt(multicastRateStr); - tags = StringUtils.cleanupTags(tags); + tags = com.cloud.utils.StringUtils.cleanupTags(tags); // specifyVlan should always be true for Shared network offerings if (!specifyVlan && type == GuestType.Shared) { @@ -6393,7 +6400,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati ListIterator it = offerings.listIterator(); while (it.hasNext()) { NetworkOfferingJoinVO offering = it.next(); - if (!Strings.isNullOrEmpty(offering.getDomainId())) { + if (StringUtils.isNotEmpty(offering.getDomainId())) { boolean toRemove = false; String[] domainIdsArray = offering.getDomainId().split(","); for (String domainIdString : domainIdsArray) { @@ -6496,14 +6503,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } // Now apply pagination - final List wPagination = StringUtils.applyPagination(supportedOfferings, cmd.getStartIndex(), cmd.getPageSizeVal()); + final List wPagination = com.cloud.utils.StringUtils.applyPagination(supportedOfferings, cmd.getStartIndex(), cmd.getPageSizeVal()); if (wPagination != null) { final Pair, Integer> listWPagination = new Pair, Integer>(wPagination, supportedOfferings.size()); return listWPagination; } return new Pair, Integer>(supportedOfferings, supportedOfferings.size()); } else { - final List wPagination = StringUtils.applyPagination(offerings, cmd.getStartIndex(), cmd.getPageSizeVal()); + final List wPagination = com.cloud.utils.StringUtils.applyPagination(offerings, cmd.getStartIndex(), cmd.getPageSizeVal()); if (wPagination != null) { final Pair, Integer> listWPagination = new Pair<>(wPagination, offerings.size()); return listWPagination; diff --git a/server/src/main/java/com/cloud/event/ActionEventInterceptor.java b/server/src/main/java/com/cloud/event/ActionEventInterceptor.java index d2dacd98a42..30ff61b3e7f 100644 --- a/server/src/main/java/com/cloud/event/ActionEventInterceptor.java +++ b/server/src/main/java/com/cloud/event/ActionEventInterceptor.java @@ -22,8 +22,9 @@ import java.util.List; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; - +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; +import org.apache.commons.lang3.StringUtils; import com.cloud.utils.component.ComponentMethodInterceptor; @@ -70,10 +71,13 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho CallContext ctx = CallContext.current(); String eventDescription = getEventDescription(actionEvent, ctx); + Long eventResourceId = getEventResourceId(actionEvent, ctx); + String eventResourceType = getEventResourceType(actionEvent, ctx); String eventType = getEventType(actionEvent, ctx); boolean isEventDisplayEnabled = ctx.isEventDisplayEnabled(); - ActionEventUtils.onStartedActionEventFromContext(eventType, eventDescription, isEventDisplayEnabled); + ActionEventUtils.onStartedActionEventFromContext(eventType, eventDescription, + eventResourceId, eventResourceType, isEventDisplayEnabled); } } return event; @@ -87,6 +91,8 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho long accountId = ctx.getProject() != null ? ctx.getProject().getProjectAccountId() : ctx.getCallingAccountId(); //This should be the entity owner id rather than the Calling User Account Id. long startEventId = ctx.getStartEventId(); String eventDescription = getEventDescription(actionEvent, ctx); + Long eventResourceId = getEventResourceId(actionEvent, ctx); + String eventResourceType = getEventResourceType(actionEvent, ctx); String eventType = getEventType(actionEvent, ctx); boolean isEventDisplayEnabled = ctx.isEventDisplayEnabled(); @@ -96,11 +102,13 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho if (actionEvent.create()) { //This start event has to be used for subsequent events of this action startEventId = ActionEventUtils.onCreatedActionEvent(userId, accountId, EventVO.LEVEL_INFO, eventType, - isEventDisplayEnabled, "Successfully created entity for " + eventDescription); + isEventDisplayEnabled, "Successfully created entity for " + eventDescription, + eventResourceId, eventResourceType); ctx.setStartEventId(startEventId); } else { ActionEventUtils.onCompletedActionEvent(userId, accountId, EventVO.LEVEL_INFO, eventType, - isEventDisplayEnabled, "Successfully completed " + eventDescription, startEventId); + isEventDisplayEnabled, "Successfully completed " + eventDescription, + eventResourceId, eventResourceType, startEventId); } } } @@ -113,6 +121,8 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho long accountId = ctx.getCallingAccountId(); long startEventId = ctx.getStartEventId(); String eventDescription = getEventDescription(actionEvent, ctx); + Long eventResourceId = getEventResourceId(actionEvent, ctx); + String eventResourceType = getEventResourceType(actionEvent, ctx); String eventType = getEventType(actionEvent, ctx); boolean isEventDisplayEnabled = ctx.isEventDisplayEnabled(); @@ -121,11 +131,13 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho if (actionEvent.create()) { long eventId = ActionEventUtils.onCreatedActionEvent(userId, accountId, EventVO.LEVEL_ERROR, eventType, - isEventDisplayEnabled, "Error while creating entity for " + eventDescription); + isEventDisplayEnabled, "Error while creating entity for " + eventDescription, + eventResourceId, eventResourceType); ctx.setStartEventId(eventId); } else { ActionEventUtils.onCompletedActionEvent(userId, accountId, EventVO.LEVEL_ERROR, eventType, isEventDisplayEnabled, - "Error while " + eventDescription, startEventId); + "Error while " + eventDescription, + eventResourceId, eventResourceType, startEventId); } } } @@ -183,4 +195,20 @@ public class ActionEventInterceptor implements ComponentMethodInterceptor, Metho return eventDescription; } + + protected Long getEventResourceId(ActionEvent actionEvent, CallContext ctx) { + Long resourceId = ctx.getEventResourceId(); + if (resourceId != null) { + return resourceId; + } + return actionEvent.resourceId() == -1? null : actionEvent.resourceId(); + } + + protected String getEventResourceType(ActionEvent actionEvent, CallContext ctx) { + ApiCommandResourceType resourceType = ctx.getEventResourceType(); + if (resourceType != null) { + return resourceType.toString(); + } + return StringUtils.isEmpty(actionEvent.resourceType()) ? null : actionEvent.resourceType(); + } } diff --git a/server/src/main/java/com/cloud/event/ActionEventUtils.java b/server/src/main/java/com/cloud/event/ActionEventUtils.java index b1dd8fdbaa1..bac216e35c9 100644 --- a/server/src/main/java/com/cloud/event/ActionEventUtils.java +++ b/server/src/main/java/com/cloud/event/ActionEventUtils.java @@ -17,6 +17,8 @@ package com.cloud.event; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -25,28 +27,33 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; -import com.cloud.utils.ReflectUtil; -import com.cloud.utils.db.EntityManager; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.Identity; -import org.apache.log4j.Logger; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; - +import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.events.EventBus; import org.apache.cloudstack.framework.events.EventBusException; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import com.cloud.configuration.Config; import com.cloud.event.dao.EventDao; +import com.cloud.projects.Project; +import com.cloud.projects.dao.ProjectDao; import com.cloud.server.ManagementService; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; -import com.cloud.projects.dao.ProjectDao; -import com.cloud.projects.Project; +import com.cloud.utils.Pair; +import com.cloud.utils.ReflectUtil; +import com.cloud.utils.Ternary; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.EntityManager; public class ActionEventUtils { private static final Logger s_logger = Logger.getLogger(ActionEventUtils.class); @@ -91,79 +98,71 @@ public class ActionEventUtils { s_configDao = configDao; } - public static Long onActionEvent(Long userId, Long accountId, Long domainId, String type, String description) { - - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Completed, description); - - Event event = persistActionEvent(userId, accountId, domainId, null, type, Event.State.Completed, true, description, null); - + public static Long onActionEvent(Long userId, Long accountId, Long domainId, String type, String description, Long resourceId, String resourceType) { + Ternary resourceDetails = getResourceDetails(resourceId, resourceType, type); + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Completed, description, resourceDetails.second(), resourceDetails.third()); + Event event = persistActionEvent(userId, accountId, domainId, null, type, Event.State.Completed, true, description, resourceDetails.first(), resourceDetails.third(), null); return event.getId(); } /* * Save event after scheduling an async job */ - public static Long onScheduledActionEvent(Long userId, Long accountId, String type, String description, boolean eventDisplayEnabled, long startEventId) { - - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Scheduled, description); - - Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Scheduled, eventDisplayEnabled, description, startEventId); - + public static Long onScheduledActionEvent(Long userId, Long accountId, String type, String description, Long resourceId, String resourceType, boolean eventDisplayEnabled, long startEventId) { + Ternary resourceDetails = getResourceDetails(resourceId, resourceType, type); + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Scheduled, description, resourceDetails.second(), resourceDetails.third()); + Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Scheduled, eventDisplayEnabled, description, resourceDetails.first(), resourceDetails.third(), startEventId); return event.getId(); } - public static void startNestedActionEvent(String eventType, String eventDescription) { + public static void startNestedActionEvent(String eventType, String eventDescription, Long resourceId, String resourceType) { CallContext.setActionEventInfo(eventType, eventDescription); - onStartedActionEventFromContext(eventType, eventDescription, true); + onStartedActionEventFromContext(eventType, eventDescription, resourceId, resourceType, true); } - public static void onStartedActionEventFromContext(String eventType, String eventDescription, boolean eventDisplayEnabled) { + public static void onStartedActionEventFromContext(String eventType, String eventDescription, Long resourceId, String resourceType, boolean eventDisplayEnabled) { CallContext ctx = CallContext.current(); long userId = ctx.getCallingUserId(); long accountId = ctx.getProject() != null ? ctx.getProject().getProjectAccountId() : ctx.getCallingAccountId(); //This should be the entity owner id rather than the Calling User Account Id. long startEventId = ctx.getStartEventId(); if (!eventType.equals("")) - ActionEventUtils.onStartedActionEvent(userId, accountId, eventType, eventDescription, eventDisplayEnabled, startEventId); + ActionEventUtils.onStartedActionEvent(userId, accountId, eventType, eventDescription, resourceId, resourceType, eventDisplayEnabled, startEventId); } /* * Save event after starting execution of an async job */ - public static Long onStartedActionEvent(Long userId, Long accountId, String type, String description, boolean eventDisplayEnabled, long startEventId) { - - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Started, description); - - Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Started, eventDisplayEnabled, description, startEventId); - + public static Long onStartedActionEvent(Long userId, Long accountId, String type, String description, Long resourceId, String resourceType, boolean eventDisplayEnabled, long startEventId) { + Ternary resourceDetails = getResourceDetails(resourceId, resourceType, type); + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Started, description, resourceDetails.second(), resourceDetails.third()); + Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Started, eventDisplayEnabled, description, resourceDetails.first(), resourceDetails.third(), startEventId); return event.getId(); } - public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type, String description, long startEventId) { + public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type, String description, Long resourceId, String resourceType, long startEventId) { - return onCompletedActionEvent(userId, accountId, level, type, true, description, startEventId); + return onCompletedActionEvent(userId, accountId, level, type, true, description, resourceId, resourceType, startEventId); } - public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type, boolean eventDisplayEnabled, String description, long startEventId) { - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Completed, description); - - Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Completed, eventDisplayEnabled, description, startEventId); - + public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type, boolean eventDisplayEnabled, String description, Long resourceId, String resourceType, long startEventId) { + Ternary resourceDetails = getResourceDetails(resourceId, resourceType, type); + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Completed, description, resourceDetails.second(), resourceDetails.third()); + Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Completed, eventDisplayEnabled, description, resourceDetails.first(), resourceDetails.third(), startEventId); return event.getId(); } - public static Long onCreatedActionEvent(Long userId, Long accountId, String level, String type, boolean eventDisplayEnabled, String description) { - - publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Created, description); - - Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Created, eventDisplayEnabled, description, null); - + public static Long onCreatedActionEvent(Long userId, Long accountId, String level, String type, boolean eventDisplayEnabled, String description, Long resourceId, String resourceType) { + Ternary resourceDetails = getResourceDetails(resourceId, resourceType, type); + publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type, com.cloud.event.Event.State.Created, description, resourceDetails.second(), resourceDetails.third()); + Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Created, eventDisplayEnabled, description, resourceDetails.first(), resourceDetails.third(), null); return event.getId(); } private static Event persistActionEvent(Long userId, Long accountId, Long domainId, String level, String type, - Event.State state, boolean eventDisplayEnabled, String description, Long startEventId) { + Event.State state, boolean eventDisplayEnabled, String description, + Long resourceId, String resourceType, Long startEventId) { EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); @@ -177,6 +176,12 @@ public class ActionEventUtils { } else { event.setDomainId(getDomainId(accountId)); } + if (resourceId != null) { + event.setResourceId(resourceId); + } + if (resourceType != null) { + event.setResourceType(resourceType); + } if (level != null && !level.isEmpty()) { event.setLevel(level); } @@ -187,7 +192,7 @@ public class ActionEventUtils { return event; } - private static void publishOnEventBus(long userId, long accountId, String eventCategory, String eventType, Event.State state, String description) { + private static void publishOnEventBus(long userId, long accountId, String eventCategory, String eventType, Event.State state, String description, String resourceUuid, String resourceType) { String configKey = Config.PublishActionEvent.key(); String value = s_configDao.getValue(configKey); boolean configValue = Boolean.parseBoolean(value); @@ -199,27 +204,8 @@ public class ActionEventUtils { return; // no provider is configured to provide events bus, so just return } - // get the entity details for which ActionEvent is generated - String entityType = null; - String entityUuid = null; - CallContext context = CallContext.current(); - //Get entity Class(Example - VirtualMachine.class) from the event Type eg. - VM.CREATE - Class entityClass = EventTypes.getEntityClassForEvent(eventType); - if (entityClass != null){ - //Get uuid from id - Object param = context.getContextParameter(entityClass); - if(param != null){ - try { - entityUuid = getEntityUuid(entityClass, param); - entityType = entityClass.getName(); - } catch (Exception e){ - s_logger.debug("Caught exception while finding entityUUID, moving on"); - } - } - } - org.apache.cloudstack.framework.events.Event event = - new org.apache.cloudstack.framework.events.Event(ManagementService.Name, eventCategory, eventType, EventTypes.getEntityForEvent(eventType), entityUuid); + new org.apache.cloudstack.framework.events.Event(ManagementService.Name, eventCategory, eventType, resourceType, resourceUuid); Map eventDescription = new HashMap(); Project project = s_projectDao.findByProjectAccountId(accountId); @@ -236,8 +222,8 @@ public class ActionEventUtils { eventDescription.put("account", account.getUuid()); eventDescription.put("event", eventType); eventDescription.put("status", state.toString()); - eventDescription.put("entity", entityType); - eventDescription.put("entityuuid", entityUuid); + eventDescription.put("entity", resourceType); + eventDescription.put("entityuuid", resourceUuid); //Put all the first class entities that are touched during the action. For now atleast put in the vmid. populateFirstClassEntities(eventDescription); eventDescription.put("description", description); @@ -254,21 +240,71 @@ public class ActionEventUtils { } } + private static Ternary getResourceDetailsUsingEntityClassAndContext(Class entityClass, ApiCommandResourceType resourceType) { + CallContext context = CallContext.current(); + ApiCommandResourceType alternateResourceType = ApiCommandResourceType.valueFromAssociatedClass(entityClass); + if (resourceType == null || + (ObjectUtils.allNotNull(resourceType, alternateResourceType) && + resourceType.getAssociatedClass() != alternateResourceType.getAssociatedClass())) { + resourceType = alternateResourceType; + } + String entityType = resourceType == null ? entityClass.getSimpleName() : resourceType.toString(); + String entityUuid = null; + Long entityId = null; + Object param = context.getContextParameter(entityClass); + if(param != null){ + try { + entityUuid = getEntityUuid(entityClass, param); + } catch (Exception e){ + s_logger.debug("Caught exception while finding entityUUID, moving on"); + } + } + if (param instanceof Long) { + entityId = (Long)param; + } else if (entityUuid != null) { + Object obj = s_entityMgr.findByUuidIncludingRemoved(entityClass, entityUuid); + if (obj instanceof InternalIdentity) { + entityId = ((InternalIdentity)obj).getId(); + } + } + return new Ternary<>(entityId, entityUuid, entityType); + } + + private static Ternary getResourceDetailsUsingEventTypeAndContext(ApiCommandResourceType resourceType, String eventType) { + Class entityClass = EventTypes.getEntityClassForEvent(eventType); + if (entityClass != null && s_entityMgr.validEntityType(entityClass)) { + return getResourceDetailsUsingEntityClassAndContext(entityClass, resourceType); + } else if (resourceType != null && resourceType.getAssociatedClass() != null && s_entityMgr.validEntityType(resourceType.getAssociatedClass())) { + return getResourceDetailsUsingEntityClassAndContext(resourceType.getAssociatedClass(), resourceType); + } + return new Ternary(null, null, null); + } + private static String getEntityUuid(Class entityType, Object entityId){ - // entityId can be internal db id or UUID so accordingly call findbyId or return uuid directly + // entityId can be internal db id or UUID so accordingly call findById or return uuid directly if (entityId instanceof Long){ // Its internal db id - use findById - final Object objVO = s_entityMgr.findById(entityType, (Long)entityId); - return ((Identity)objVO).getUuid(); - } else if(entityId instanceof String){ + if (!s_entityMgr.validEntityType(entityType)) { + return null; + } + final Object objVO = s_entityMgr.findByIdIncludingRemoved(entityType, (Long)entityId); + if (objVO != null) { + return ((Identity) objVO).getUuid(); + } + } else if(entityId instanceof String) { try{ // In case its an async job the internal db id would be a string because of json deserialization Long internalId = Long.valueOf((String) entityId); - final Object objVO = s_entityMgr.findById(entityType, internalId); - return ((Identity)objVO).getUuid(); - } catch (NumberFormatException e){ + if (!s_entityMgr.validEntityType(entityType)) { + return null; + } + final Object objVO = s_entityMgr.findByIdIncludingRemoved(entityType, internalId); + if (objVO != null) { + return ((Identity) objVO).getUuid(); + } + } catch (NumberFormatException e) { // It is uuid - so return it return (String)entityId; } @@ -277,6 +313,62 @@ public class ActionEventUtils { return null; } + private static Ternary updateParentResourceCases(Ternary details) { + if (!ObjectUtils.allNotNull(details, details.first(), details.second(), details.third())) { + return details; + } + HashMap> typeParentMethodMap = new HashMap<>(); + typeParentMethodMap.put(ApiCommandResourceType.Snapshot.toString(), new Pair<>(ApiCommandResourceType.Volume, "getVolumeId")); + typeParentMethodMap.put(ApiCommandResourceType.VmSnapshot.toString(), new Pair<>(ApiCommandResourceType.VirtualMachine, "getVmId")); + if (!typeParentMethodMap.containsKey(details.third())) { + return details; + } + ApiCommandResourceType type = ApiCommandResourceType.fromString(details.third()); + if (type == null || !s_entityMgr.validEntityType(type.getAssociatedClass())) { + return details; + } + Object objVO = s_entityMgr.findByIdIncludingRemoved(type.getAssociatedClass(), details.first()); + if (objVO == null) { + return details; + } + String methodName = typeParentMethodMap.get(type.toString()).second(); + try { + Method m = objVO.getClass().getMethod(methodName); + Long id = (Long)m.invoke(objVO); + if (id == null) { + return details; + } + type = typeParentMethodMap.get(type.toString()).first(); + objVO = s_entityMgr.findByIdIncludingRemoved(type.getAssociatedClass(), id); + if (objVO == null) { + return details; + } + return new Ternary<>(id, ((Identity)objVO).getUuid(), type.toString()); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + s_logger.debug(String.format("Parent resource for resource ID: %d, type: %s can not be found using method %s", details.first(), type, methodName)); + } + return details; + } + + private static Ternary getResourceDetails(Long resourceId, String resourceType, String eventType) { + Ternary details; + Class clazz = null; + ApiCommandResourceType type = null; + if (StringUtils.isNotEmpty(resourceType)) { + type = ApiCommandResourceType.fromString(resourceType); + if (type != null) { + clazz = type.getAssociatedClass(); + } + } + if (ObjectUtils.allNotNull(resourceId, clazz)) { + String uuid = getEntityUuid(clazz, resourceId); + details = new Ternary<>(resourceId, uuid, resourceType); + } else { + details = getResourceDetailsUsingEventTypeAndContext(type, eventType); + } + return updateParentResourceCases(details); + } + private static long getDomainId(long accountId) { AccountVO account = s_accountDao.findByIdIncludingRemoved(accountId); if (account == null) { diff --git a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java index 8a78a6934f2..c73f57529b8 100644 --- a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java @@ -16,18 +16,25 @@ // under the License. package com.cloud.event.dao; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.List; +import javax.inject.Inject; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.response.EventResponse; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import org.apache.cloudstack.api.response.EventResponse; - import com.cloud.api.ApiResponseHelper; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.event.Event; import com.cloud.event.Event.State; +import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -43,6 +50,24 @@ public class EventJoinDaoImpl extends GenericDaoBase implemen private SearchBuilder CompletedEventSearch; + @Inject + EntityManager entityMgr; + + private String getResourceName(Object obj) { + String[] possibleMethods = {"getDisplayName", "getDisplayText", "getHostName", "getName", "getAccountName", "getUsername"}; + for (String possibleMethodName : possibleMethods) { + try { + Method m = obj.getClass().getMethod(possibleMethodName); + String name = (String)m.invoke(obj); + if (StringUtils.isEmpty(name)) { + continue; + } + return name; + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ignored) {} + } + return null; + } + protected EventJoinDaoImpl() { vrSearch = createSearchBuilder(); @@ -85,7 +110,19 @@ public class EventJoinDaoImpl extends GenericDaoBase implemen responseEvent.setParentId(event.getStartUuid()); responseEvent.setState(event.getState()); responseEvent.setUsername(event.getUserName()); - + Long resourceId = event.getResourceId(); + responseEvent.setResourceType(event.getResourceType()); + ApiCommandResourceType resourceType = ApiCommandResourceType.fromString(event.getResourceType()); + Class clazz = resourceType != null ? resourceType.getAssociatedClass() : null; + if (ObjectUtils.allNotNull(resourceId, clazz) && entityMgr.validEntityType(clazz)) { + final Object objVO = entityMgr.findByIdIncludingRemoved(clazz, resourceId); + if (objVO instanceof Identity) { + responseEvent.setResourceId(((Identity)objVO).getUuid()); + } + if (objVO != null) { + responseEvent.setResourceName(getResourceName(objVO)); + } + } ApiResponseHelper.populateOwner(responseEvent, event); responseEvent.setObjectName("event"); return responseEvent; diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 97ef0503b69..b16ad9bf613 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -34,6 +34,7 @@ import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import org.apache.cloudstack.context.CallContext; @@ -1712,7 +1713,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage // trigger an action event for the transfer of portable IP across the networks, so that external entities // monitoring for this event can initiate the route advertisement for the availability of IP from the zoe ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, Domain.ROOT_DOMAIN, EventTypes.EVENT_PORTABLE_IP_TRANSFER, - "Portable IP associated is transferred from network " + currentNetworkId + " to " + newNetworkId); + "Portable IP associated is transferred from network " + currentNetworkId + " to " + newNetworkId, newNetworkId, ApiCommandResourceType.Network.toString()); } protected List getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner) { diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 53dabc46214..67f79c21e1b 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -577,7 +577,11 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C _accountMgr.checkAccess(caller, null, false, ipOwner); } - return _ipAddrMgr.allocateIp(ipOwner, false, caller, callerUserId, zone, displayIp, ipaddress); + IpAddress address = _ipAddrMgr.allocateIp(ipOwner, false, caller, callerUserId, zone, displayIp, ipaddress); + if (address != null) { + CallContext.current().putContextParameter(IpAddress.class, address.getUuid()); + } + return address; } @Override @@ -3150,6 +3154,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C // Add the config drive provider addConfigDriveToPhysicalNetwork(pNetwork.getId()); + CallContext.current().putContextParameter(PhysicalNetwork.class, pNetwork.getUuid()); + return pNetwork; } }); @@ -4530,8 +4536,11 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C releaseIpAddress(ipId); throw new InvalidParameterValueException("Can't assign ip to the network directly when network belongs" + " to VPC.Specify vpcId to associate ip address to VPC"); } - return _ipAddrMgr.associateIPToGuestNetwork(ipId, networkId, true); - + IpAddress address = _ipAddrMgr.associateIPToGuestNetwork(ipId, networkId, true); + if (address != null) { + CallContext.current().putContextParameter(IpAddress.class, address.getUuid()); + } + return address; } @Override diff --git a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java index 56814daeef2..7badc8b8d88 100644 --- a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java @@ -256,6 +256,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService, throw new CloudRuntimeException("Unable to update the state to add for " + newRule); } CallContext.current().setEventDetails("Rule Id: " + newRule.getId()); + CallContext.current().putContextParameter(FirewallRule.class, newRule.getId()); return newRule; } diff --git a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 5da0952b0d1..09824a07355 100644 --- a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -17,6 +17,15 @@ package com.cloud.network.guru; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.log4j.Logger; + import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.dao.DataCenterDao; @@ -60,12 +69,6 @@ import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import java.util.List; public class ExternalGuestNetworkGuru extends GuestNetworkGuru { private static final Logger s_logger = Logger.getLogger(ExternalGuestNetworkGuru.class); @@ -158,7 +161,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlanTag)); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), config.getAccountId(), EventVO.LEVEL_INFO, - EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + config.getId(), 0); + EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + config.getId(), config.getId(), ApiCommandResourceType.Network.toString(), 0); } else { vlanTag = Integer.parseInt(BroadcastDomainType.getValue(config.getBroadcastUri())); implemented.setBroadcastUri(config.getBroadcastUri()); diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java index c1ce99c0606..da5388cf777 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -22,7 +22,7 @@ import java.util.Random; import javax.inject.Inject; -import com.cloud.network.Network.GuestType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.ConfigKey; @@ -45,6 +45,7 @@ import com.cloud.exception.InsufficientVirtualNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.Network.State; @@ -299,7 +300,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur } implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vnet)); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), EventVO.LEVEL_INFO, - EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + network.getId(), 0); + EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + network.getId(), network.getId(), ApiCommandResourceType.Network.toString(), 0); } else { implemented.setBroadcastUri(network.getBroadcastUri()); } @@ -455,7 +456,8 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur _dcDao.releaseVnet(BroadcastDomainType.getValue(profile.getBroadcastUri()), profile.getDataCenterId(), profile.getPhysicalNetworkId(), profile.getAccountId(), profile.getReservationId()); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), profile.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_RELEASE, - "Released Zone Vnet: " + BroadcastDomainType.getValue(profile.getBroadcastUri()) + " for Network: " + profile.getId(), 0); + "Released Zone Vnet: " + BroadcastDomainType.getValue(profile.getBroadcastUri()) + " for Network: " + profile.getId(), + profile.getDataCenterId(), ApiCommandResourceType.Zone.toString(), 0); } profile.setBroadcastUri(null); diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index b243c16acd8..4fd5d2075f3 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -17,6 +17,8 @@ package com.cloud.network.router; +import static com.cloud.utils.NumbersUtil.toHumanReadableSize; + import java.lang.reflect.Type; import java.math.BigInteger; import java.nio.charset.Charset; @@ -47,6 +49,7 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.alert.AlertService.AlertType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd; import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd; import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd; @@ -271,8 +274,6 @@ import com.cloud.vm.dao.VMInstanceDao; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; -import static com.cloud.utils.NumbersUtil.toHumanReadableSize; - /** * VirtualNetworkApplianceManagerImpl manages the different types of virtual * network appliances available in the Cloud Stack. @@ -1237,7 +1238,7 @@ Configurable, StateListener> pair = getResourceTypeIdPair(cmd); ResourceType entity = pair.first(); List ids = pair.second(); - + String cmdResourceType = ApiCommandResourceType.fromString(entity.name()) != null ? ApiCommandResourceType.fromString(entity.name()).toString() : null; String description = String.format("Success: %s, details: %s, hosts updated: %s, hosts skipped: %s", success, details, generateReportHostsUpdated(hostsUpdated), generateReportHostsSkipped(hostsSkipped)); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_INFO, cmd.getEventType(), - "Completed rolling maintenance for entity " + entity + " with IDs: " + ids + " - " + description, 0); + "Completed rolling maintenance for entity " + entity + " with IDs: " + ids + " - " + description, ids.get(0), cmdResourceType, 0); } private String generateReportHostsUpdated(List hostsUpdated) { diff --git a/server/src/main/java/com/cloud/resourceicon/ResourceIconManagerImpl.java b/server/src/main/java/com/cloud/resourceicon/ResourceIconManagerImpl.java index 137f655459b..41d6c1f52ac 100644 --- a/server/src/main/java/com/cloud/resourceicon/ResourceIconManagerImpl.java +++ b/server/src/main/java/com/cloud/resourceicon/ResourceIconManagerImpl.java @@ -16,6 +16,17 @@ // under the License. package com.cloud.resourceicon; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; +import javax.persistence.EntityExistsException; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; + import com.cloud.domain.PartOf; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; @@ -27,13 +38,12 @@ import com.cloud.network.vpc.NetworkACLItemVO; import com.cloud.network.vpc.NetworkACLVO; import com.cloud.network.vpc.VpcVO; import com.cloud.projects.ProjectVO; +import com.cloud.resource.icon.ResourceIconVO; import com.cloud.resource.icon.dao.ResourceIconDao; import com.cloud.server.ResourceIcon; import com.cloud.server.ResourceIconManager; - import com.cloud.server.ResourceManagerUtil; import com.cloud.server.ResourceTag; -import com.cloud.resource.icon.ResourceIconVO; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.VolumeVO; import com.cloud.tags.ResourceManagerUtilImpl; @@ -52,14 +62,6 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; -import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import javax.persistence.EntityExistsException; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; public class ResourceIconManagerImpl extends ManagerBase implements ResourceIconManager { public static final Logger s_logger = Logger.getLogger(ResourceMetaDataManagerImpl.class); @@ -137,6 +139,25 @@ public class ResourceIconManagerImpl extends ManagerBase implements ResourceIcon return new Pair<>(accountId, domainId); } + private void updateResourceDetailsInContext(Long resourceId, ResourceTag.ResourceObjectType resourceType) { + Class clazz = ResourceManagerUtilImpl.s_typeMap.get(resourceType); + ApiCommandResourceType type = ApiCommandResourceType.valueFromAssociatedClass(clazz); + int depth = 5; + while (type == null && depth > 0) { + Class[] clazzes = clazz.getInterfaces(); + if (clazzes.length == 0) { + break; + } + depth--; + clazz = clazzes[0]; + type = ApiCommandResourceType.valueFromAssociatedClass(clazz); + } + CallContext.current().setEventResourceId(resourceId); + if (!ApiCommandResourceType.None.equals(type)) { + CallContext.current().setEventResourceType(type); + } + } + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_ICON_UPLOAD, eventDescription = "uploading resource icon") @@ -157,6 +178,7 @@ public class ResourceIconManagerImpl extends ManagerBase implements ResourceIcon long id = resourceManagerUtil.getResourceId(resourceId, resourceType); String resourceUuid = resourceManagerUtil.getUuid(resourceId, resourceType); + updateResourceDetailsInContext(id, resourceType); ResourceIconVO existingResourceIcon = resourceIconDao.findByResourceUuid(resourceUuid, resourceType); ResourceIconVO resourceIcon = null; Pair accountDomainPair = getAccountDomain(id, resourceType); @@ -198,6 +220,7 @@ public class ResourceIconManagerImpl extends ManagerBase implements ResourceIcon for (ResourceIcon resourceIcon : resourceIcons) { String resourceId = resourceIcon.getResourceUuid(); long id = resourceManagerUtil.getResourceId(resourceId, resourceType); + updateResourceDetailsInContext(id, resourceType); Pair accountDomainPair = getAccountDomain(id, resourceType); Long domainId = accountDomainPair.second(); Long accountId = accountDomainPair.first(); diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 84723fccbe5..c31b583780c 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -47,6 +47,7 @@ import org.apache.cloudstack.affinity.AffinityGroupProcessor; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd; import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd; @@ -3739,10 +3740,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } if (systemVm.getType() == VirtualMachine.Type.ConsoleProxy) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_START, "starting console proxy Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_START, "starting console proxy Vm", vmId, ApiCommandResourceType.ConsoleProxy.toString()); return startConsoleProxy(vmId); } else if (systemVm.getType() == VirtualMachine.Type.SecondaryStorageVm) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_START, "starting secondary storage Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_START, "starting secondary storage Vm", vmId, ApiCommandResourceType.SystemVm.toString()); return startSecondaryStorageVm(vmId); } else { final InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find a system vm with specified vmId"); @@ -3766,10 +3767,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe try { if (systemVm.getType() == VirtualMachine.Type.ConsoleProxy) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_STOP, "stopping console proxy Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_STOP, "stopping console proxy Vm", systemVm.getId(), ApiCommandResourceType.ConsoleProxy.toString()); return stopConsoleProxy(systemVm, cmd.isForced()); } else if (systemVm.getType() == VirtualMachine.Type.SecondaryStorageVm) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_STOP, "stopping secondary storage Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_STOP, "stopping secondary storage Vm", systemVm.getId(), ApiCommandResourceType.SystemVm.toString()); return stopSecondaryStorageVm(systemVm, cmd.isForced()); } return null; @@ -3790,13 +3791,13 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe try { if (systemVm.getType().equals(VirtualMachine.Type.ConsoleProxy)) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_REBOOT, "rebooting console proxy Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_REBOOT, "rebooting console proxy Vm", systemVm.getId(), ApiCommandResourceType.ConsoleProxy.toString()); if (cmd.isForced()) { return forceRebootConsoleProxy(systemVm); } return rebootConsoleProxy(cmd.getId()); } else { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_REBOOT, "rebooting secondary storage Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_REBOOT, "rebooting secondary storage Vm", systemVm.getId(), ApiCommandResourceType.SystemVm.toString()); if (cmd.isForced()) { return forceRebootSecondaryStorageVm(systemVm); } @@ -3821,10 +3822,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } if (systemVm.getType().equals(VirtualMachine.Type.ConsoleProxy)) { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_DESTROY, "destroying console proxy Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_PROXY_DESTROY, "destroying console proxy Vm", systemVm.getId(), ApiCommandResourceType.ConsoleProxy.toString()); return destroyConsoleProxy(cmd.getId()); } else { - ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_DESTROY, "destroying secondary storage Vm"); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_SSVM_DESTROY, "destroying secondary storage Vm", systemVm.getId(), ApiCommandResourceType.SystemVm.toString()); return destroySecondaryStorageVm(cmd.getId()); } } diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 5912ff99271..a9f95e6b6fe 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -89,6 +89,7 @@ import org.apache.cloudstack.utils.imagestore.ImageStoreUtil; import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -156,7 +157,6 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.Predicate; import com.cloud.utils.ReflectionUse; -import com.cloud.utils.StringUtils; import com.cloud.utils.UriUtils; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.DB; @@ -195,7 +195,6 @@ import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.snapshot.VMSnapshotVO; import com.cloud.vm.snapshot.dao.VMSnapshotDao; -import com.google.common.base.Strings; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; @@ -559,6 +558,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic volume.setFormat(ImageFormat.valueOf(format)); volume = _volsDao.persist(volume); CallContext.current().setEventDetails("Volume Id: " + volume.getUuid()); + CallContext.current().putContextParameter(Volume.class, volume.getUuid()); // Increment resource count during allocation; if actual creation fails, // decrement it @@ -585,7 +585,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic public String getVolumeNameFromCommand(CreateVolumeCmd cmd) { String userSpecifiedName = cmd.getVolumeName(); - if (org.apache.commons.lang.StringUtils.isBlank(userSpecifiedName)) { + if (StringUtils.isBlank(userSpecifiedName)) { userSpecifiedName = getRandomVolumeName(); } @@ -874,7 +874,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic } CallContext.current().setEventDetails("Volume Id: " + volume.getUuid()); - + CallContext.current().putContextParameter(Volume.class, volume.getId()); // Increment resource count during allocation; if actual creation fails, // decrement it _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume, displayVolume); @@ -1060,7 +1060,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic } if (diskOffering.getTags() != null) { - if (!StringUtils.areTagsEqual(diskOffering.getTags(), newDiskOffering.getTags())) { + if (!com.cloud.utils.StringUtils.areTagsEqual(diskOffering.getTags(), newDiskOffering.getTags())) { throw new InvalidParameterValueException("The tags on the new and old disk offerings must match."); } } else if (newDiskOffering.getTags() != null) { @@ -2275,7 +2275,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic } public void updateMissingRootDiskController(final VMInstanceVO vm, final String rootVolChainInfo) { - if (vm == null || !VirtualMachine.Type.User.equals(vm.getType()) || Strings.isNullOrEmpty(rootVolChainInfo)) { + if (vm == null || !VirtualMachine.Type.User.equals(vm.getType()) || org.apache.commons.lang3.StringUtils.isEmpty(rootVolChainInfo)) { return; } String rootDiskController = null; @@ -2549,7 +2549,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic */ private DiskOfferingVO retrieveAndValidateNewDiskOffering(MigrateVolumeCmd cmd) { String newDiskOfferingUuid = cmd.getNewDiskOfferingUuid(); - if (org.apache.commons.lang.StringUtils.isBlank(newDiskOfferingUuid)) { + if (StringUtils.isBlank(newDiskOfferingUuid)) { return null; } DiskOfferingVO newDiskOffering = _diskOfferingDao.findByUuid(newDiskOfferingUuid); @@ -2639,15 +2639,15 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic @Override public boolean doesTargetStorageSupportDiskOffering(StoragePool destPool, String diskOfferingTags) { - if (org.apache.commons.lang.StringUtils.isBlank(diskOfferingTags)) { + if (StringUtils.isBlank(diskOfferingTags)) { return true; } String storagePoolTags = getStoragePoolTags(destPool); - if (org.apache.commons.lang.StringUtils.isBlank(storagePoolTags)) { + if (StringUtils.isBlank(storagePoolTags)) { return false; } - String[] storageTagsAsStringArray = org.apache.commons.lang.StringUtils.split(storagePoolTags, ","); - String[] newDiskOfferingTagsAsStringArray = org.apache.commons.lang.StringUtils.split(diskOfferingTags, ","); + String[] storageTagsAsStringArray = StringUtils.split(storagePoolTags, ","); + String[] newDiskOfferingTagsAsStringArray = StringUtils.split(diskOfferingTags, ","); return CollectionUtils.isSubCollection(Arrays.asList(newDiskOfferingTagsAsStringArray), Arrays.asList(storageTagsAsStringArray)); } @@ -3480,7 +3480,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic if (host != null) { _hostDao.loadDetails(host); String hypervisorVersion = host.getDetail("product_version"); - if (org.apache.commons.lang.StringUtils.isBlank(hypervisorVersion)) { + if (StringUtils.isBlank(hypervisorVersion)) { hypervisorVersion = host.getHypervisorVersion(); } maxDataVolumesSupported = _hypervisorCapabilitiesDao.getMaxDataVolumesLimit(host.getHypervisorType(), hypervisorVersion); diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java index ffa393bd866..72815d42290 100755 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -31,6 +31,7 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd; import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd; import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd; @@ -60,7 +61,10 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -143,9 +147,6 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.snapshot.VMSnapshot; import com.cloud.vm.snapshot.VMSnapshotVO; import com.cloud.vm.snapshot.dao.VMSnapshotDao; -import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; @Component public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implements SnapshotManager, SnapshotApiService, Configurable { @@ -555,7 +556,7 @@ public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implement if (deleteSnapshot(oldSnapId)) { //log Snapshot delete event ActionEventUtils.onCompletedActionEvent(User.UID_SYSTEM, oldestSnapshot.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_SNAPSHOT_DELETE, - "Successfully deleted oldest snapshot: " + oldSnapId, 0); + "Successfully deleted oldest snapshot: " + oldSnapId, oldSnapId, ApiCommandResourceType.Snapshot.toString(), 0); } snaps.remove(oldestSnapshot); } @@ -1539,6 +1540,7 @@ public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase implement if (snapshot == null) { throw new CloudRuntimeException("Failed to create snapshot for volume: " + volume.getId()); } + CallContext.current().putContextParameter(Snapshot.class, snapshot.getUuid()); _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.snapshot); _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, new Long(volume.getSize())); return snapshot; diff --git a/server/src/main/java/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java b/server/src/main/java/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java index bccf8c68b23..4aa1449fc74 100644 --- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java +++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java @@ -27,9 +27,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -38,6 +36,8 @@ import org.apache.cloudstack.framework.jobs.AsyncJobManager; import org.apache.cloudstack.framework.jobs.dao.AsyncJobDao; import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; import org.apache.cloudstack.managed.context.ManagedContextTimerTask; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.api.ApiDispatcher; import com.cloud.api.ApiGsonHelper; @@ -301,7 +301,7 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu tmpSnapshotScheduleVO = _snapshotScheduleDao.acquireInLockTable(snapshotScheId); final Long eventId = ActionEventUtils.onScheduledActionEvent(User.UID_SYSTEM, volume.getAccountId(), EventTypes.EVENT_SNAPSHOT_CREATE, "creating snapshot for volume Id:" + - volume.getUuid(), true, 0); + volume.getUuid(), volumeId, ApiCommandResourceType.Volume.toString(), true, 0); final Map params = new HashMap(); params.put(ApiConstants.VOLUME_ID, "" + volumeId); @@ -327,7 +327,7 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu AsyncJobVO job = new AsyncJobVO("", User.UID_SYSTEM, volume.getAccountId(), CreateSnapshotCmd.class.getName(), ApiGsonHelper.getBuilder().create().toJson(params), cmd.getEntityId(), - cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null, null); + cmd.getApiResourceType() != null ? cmd.getApiResourceType().toString() : null, null); job.setDispatcher(_asyncDispatcher.getName()); final long jobId = _asyncMgr.submitAsyncJob(job); diff --git a/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java b/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java index e088b26ad96..00d83aad659 100644 --- a/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java +++ b/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java @@ -16,6 +16,18 @@ // under the License. package com.cloud.tags; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import javax.inject.Inject; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.commons.lang3.StringUtils; + import com.cloud.dc.DataCenterVO; import com.cloud.domain.DomainVO; import com.cloud.exception.InvalidParameterValueException; @@ -23,11 +35,6 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.network.LBHealthCheckPolicyVO; import com.cloud.network.as.AutoScaleVmGroupVO; import com.cloud.network.as.AutoScaleVmProfileVO; - -import com.cloud.network.rules.FirewallRuleVO; -import com.cloud.network.rules.PortForwardingRuleVO; -import com.cloud.network.security.SecurityGroupRuleVO; -import com.cloud.network.security.SecurityGroupVO; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.LBStickinessPolicyVO; import com.cloud.network.dao.LoadBalancerVO; @@ -36,6 +43,10 @@ import com.cloud.network.dao.RemoteAccessVpnVO; import com.cloud.network.dao.Site2SiteCustomerGatewayVO; import com.cloud.network.dao.Site2SiteVpnConnectionVO; import com.cloud.network.dao.Site2SiteVpnGatewayVO; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.rules.PortForwardingRuleVO; +import com.cloud.network.security.SecurityGroupRuleVO; +import com.cloud.network.security.SecurityGroupVO; import com.cloud.network.vpc.NetworkACLItemVO; import com.cloud.network.vpc.NetworkACLVO; import com.cloud.network.vpc.StaticRouteVO; @@ -46,12 +57,11 @@ import com.cloud.projects.ProjectVO; import com.cloud.server.ResourceManagerUtil; import com.cloud.server.ResourceTag; import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.SnapshotVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.SnapshotPolicyVO; - import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; @@ -62,16 +72,6 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.snapshot.VMSnapshotVO; -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.commons.lang.StringUtils; - -import javax.inject.Inject; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; public class ResourceManagerUtilImpl implements ResourceManagerUtil { public static final Map> s_typeMap = new HashMap<>(); diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java index 731b8a4daaa..158c717a1f8 100755 --- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java @@ -323,6 +323,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, VMTemplateVO template = adapter.create(profile); if (template != null) { + CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid()); return template; } else { throw new CloudRuntimeException("Failed to create ISO"); @@ -349,6 +350,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, VMTemplateVO template = adapter.create(profile); if (template != null) { + CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid()); return template; } else { throw new CloudRuntimeException("Failed to create a template"); @@ -1939,6 +1941,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, } if (template != null) { + CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid()); return template; } else { throw new CloudRuntimeException("Failed to create a template"); diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index bd51cd419e5..0a460b1a7bf 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -39,7 +39,6 @@ import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.utils.component.PluggableService; import org.apache.cloudstack.acl.APIChecker; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.QuerySelector; @@ -51,6 +50,7 @@ import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd; import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; @@ -73,6 +73,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import org.jetbrains.annotations.NotNull; import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.ControlledViewEntity; @@ -156,6 +157,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.component.PluggableService; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; @@ -183,7 +185,6 @@ import com.cloud.vm.snapshot.VMSnapshot; import com.cloud.vm.snapshot.VMSnapshotManager; import com.cloud.vm.snapshot.VMSnapshotVO; import com.cloud.vm.snapshot.dao.VMSnapshotDao; -import org.jetbrains.annotations.NotNull; public class AccountManagerImpl extends ManagerBase implements AccountManager, Manager { public static final Logger s_logger = Logger.getLogger(AccountManagerImpl.class); @@ -1178,6 +1179,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M } CallContext.current().putContextParameter(Account.class, account.getUuid()); + CallContext.current().putContextParameter(User.class, userId); // check success return _userAccountDao.findById(userId); @@ -2337,7 +2339,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M public void logoutUser(long userId) { UserAccount userAcct = _userAccountDao.findById(userId); if (userAcct != null) { - ActionEventUtils.onActionEvent(userId, userAcct.getAccountId(), userAcct.getDomainId(), EventTypes.EVENT_USER_LOGOUT, "user has logged out"); + ActionEventUtils.onActionEvent(userId, userAcct.getAccountId(), userAcct.getDomainId(), EventTypes.EVENT_USER_LOGOUT, "user has logged out", userId, ApiCommandResourceType.User.toString()); } // else log some kind of error event? This likely means the user doesn't exist, or has been deleted... } @@ -2476,7 +2478,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M s_logger.debug("User: " + username + " in domain " + domainId + " has successfully logged in"); } - ActionEventUtils.onActionEvent(user.getId(), user.getAccountId(), user.getDomainId(), EventTypes.EVENT_USER_LOGIN, "user has logged in from IP Address " + loginIpAddress); + ActionEventUtils.onActionEvent(user.getId(), user.getAccountId(), user.getDomainId(), EventTypes.EVENT_USER_LOGIN, "user has logged in from IP Address " + loginIpAddress, user.getId(), ApiCommandResourceType.User.toString()); return user; } else { diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 58ea4e9175e..24081745469 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -62,6 +62,7 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseCmd.HTTPMethod; import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd; @@ -729,7 +730,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir decrementCount = false; ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, Domain.ROOT_DOMAIN, EventTypes.EVENT_NETWORK_EXTERNAL_DHCP_VM_IPFETCH, - "VM " + vmId + " nic id " + nicId + " ip address " + vmIp + " got fetched successfully"); + "VM " + vmId + " nic id " + nicId + " ip address " + vmIp + " got fetched successfully", vmId, ApiCommandResourceType.VirtualMachine.toString()); } } } else { @@ -2565,7 +2566,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, Domain.ROOT_DOMAIN, EventTypes.EVENT_NETWORK_EXTERNAL_DHCP_VM_IPFETCH, - "VM " + vmId + " nic id "+ nicId + " ip addr fetch failed "); + "VM " + vmId + " nic id "+ nicId + " ip addr fetch failed ", vmId, ApiCommandResourceType.VirtualMachine.toString()); continue; } diff --git a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index bd66fe89ec6..636a1ae4d7a 100644 --- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -486,6 +486,7 @@ public class VMSnapshotManagerImpl extends MutualExclusiveIdsManagerBase impleme throw new CloudRuntimeException("Failed to create snapshot for vm: " + vmId); } addSupportForCustomServiceOffering(vmId, serviceOfferingId, vmSnapshot.getId()); + CallContext.current().putContextParameter(VMSnapshot.class, vmSnapshot.getUuid()); return vmSnapshot; } }); @@ -545,7 +546,11 @@ public class VMSnapshotManagerImpl extends MutualExclusiveIdsManagerBase impleme VmWorkJobVO placeHolder = null; placeHolder = createPlaceHolderWork(vmId); try { - return orchestrateCreateVMSnapshot(vmId, vmSnapshotId, quiescevm); + VMSnapshot snapshot = orchestrateCreateVMSnapshot(vmId, vmSnapshotId, quiescevm); + if (snapshot != null) { + CallContext.current().putContextParameter(VMSnapshot.class, snapshot.getUuid()); + } + return snapshot; } finally { _workJobDao.expunge(placeHolder.getId()); } @@ -569,7 +574,9 @@ public class VMSnapshotManagerImpl extends MutualExclusiveIdsManagerBase impleme else if (jobResult instanceof Throwable) throw new RuntimeException("Unexpected exception", (Throwable)jobResult); } - + if (result != null) { + CallContext.current().putContextParameter(VMSnapshot.class, result.getUuid()); + } return result; } } diff --git a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java index dce518c135e..adf2d2cd4ed 100644 --- a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java @@ -149,7 +149,9 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu return Transaction.execute(new TransactionCallback() { @Override public RoleVO doInTransaction(TransactionStatus status) { - return roleDao.persist(new RoleVO(name, roleType, description)); + RoleVO role = roleDao.persist(new RoleVO(name, roleType, description)); + CallContext.current().putContextParameter(Role.class, role.getUuid()); + return role; } }); } diff --git a/server/src/main/java/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java b/server/src/main/java/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java index fd0b937e069..db16f7372f1 100644 --- a/server/src/main/java/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java +++ b/server/src/main/java/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java @@ -25,9 +25,6 @@ import java.util.Set; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.utils.fsm.StateMachine2; - -import org.apache.log4j.Logger; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; @@ -39,6 +36,7 @@ import org.apache.cloudstack.api.command.user.affinitygroup.CreateAffinityGroupC import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.PublishScope; +import org.apache.log4j.Logger; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -62,6 +60,7 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.fsm.StateListener; +import com.cloud.utils.fsm.StateMachine2; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Event; @@ -163,6 +162,7 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro if (s_logger.isDebugEnabled()) { s_logger.debug("Created affinity group =" + affinityGroupName); } + CallContext.current().putContextParameter(AffinityGroup.class, group.getUuid()); return group; } diff --git a/server/src/main/java/org/apache/cloudstack/annotation/AnnotationManagerImpl.java b/server/src/main/java/org/apache/cloudstack/annotation/AnnotationManagerImpl.java index c151b5cd37e..ecbce898d6d 100644 --- a/server/src/main/java/org/apache/cloudstack/annotation/AnnotationManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/annotation/AnnotationManagerImpl.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.annotation; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -25,6 +26,29 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.acl.ControlledEntity; +import org.apache.cloudstack.acl.Role; +import org.apache.cloudstack.acl.RoleService; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.command.admin.annotation.AddAnnotationCmd; +import org.apache.cloudstack.api.command.admin.annotation.ListAnnotationsCmd; +import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd; +import org.apache.cloudstack.api.command.admin.annotation.UpdateAnnotationVisibilityCmd; +import org.apache.cloudstack.api.response.AnnotationResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -60,33 +84,14 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.Pair; -import com.cloud.utils.StringUtils; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.component.PluggableService; +import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.InstanceGroupDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.snapshot.dao.VMSnapshotDao; -import org.apache.cloudstack.acl.ControlledEntity; -import org.apache.cloudstack.acl.Role; -import org.apache.cloudstack.acl.RoleService; -import org.apache.cloudstack.acl.RoleType; -import org.apache.cloudstack.annotation.dao.AnnotationDao; -import org.apache.cloudstack.api.command.admin.annotation.AddAnnotationCmd; -import org.apache.cloudstack.api.command.admin.annotation.ListAnnotationsCmd; -import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd; -import org.apache.cloudstack.api.command.admin.annotation.UpdateAnnotationVisibilityCmd; -import org.apache.cloudstack.api.response.AnnotationResponse; -import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.log4j.Logger; import static org.apache.commons.lang.StringUtils.isBlank; import static org.apache.commons.lang.StringUtils.isNotBlank; @@ -149,9 +154,40 @@ public final class AnnotationManagerImpl extends ManagerBase implements Annotati private DiskOfferingDao diskOfferingDao; @Inject private NetworkOfferingDao networkOfferingDao; + @Inject + EntityManager entityManager; private static final List adminRoles = Collections.singletonList(RoleType.Admin); private List kubernetesClusterHelpers; + public static final Map s_typeMap = new HashMap<>(); + + static { + s_typeMap.put(EntityType.VM, ApiCommandResourceType.VirtualMachine); + s_typeMap.put(EntityType.VOLUME, ApiCommandResourceType.Volume); + s_typeMap.put(EntityType.SNAPSHOT, ApiCommandResourceType.Snapshot); + s_typeMap.put(EntityType.VM_SNAPSHOT, ApiCommandResourceType.VmSnapshot); + s_typeMap.put(EntityType.INSTANCE_GROUP, ApiCommandResourceType.None); + s_typeMap.put(EntityType.SSH_KEYPAIR, ApiCommandResourceType.None); + s_typeMap.put(EntityType.NETWORK, ApiCommandResourceType.Network); + s_typeMap.put(EntityType.VPC, ApiCommandResourceType.Vpc); + s_typeMap.put(EntityType.PUBLIC_IP_ADDRESS, ApiCommandResourceType.IpAddress); + s_typeMap.put(EntityType.VPN_CUSTOMER_GATEWAY, ApiCommandResourceType.None); + s_typeMap.put(EntityType.TEMPLATE, ApiCommandResourceType.Template); + s_typeMap.put(EntityType.ISO, ApiCommandResourceType.Iso); + s_typeMap.put(EntityType.KUBERNETES_CLUSTER, ApiCommandResourceType.None); + s_typeMap.put(EntityType.SERVICE_OFFERING, ApiCommandResourceType.ServiceOffering); + s_typeMap.put(EntityType.DISK_OFFERING, ApiCommandResourceType.DiskOffering); + s_typeMap.put(EntityType.NETWORK_OFFERING, ApiCommandResourceType.NetworkOffering); + s_typeMap.put(EntityType.ZONE, ApiCommandResourceType.Zone); + s_typeMap.put(EntityType.POD, ApiCommandResourceType.Pod); + s_typeMap.put(EntityType.CLUSTER, ApiCommandResourceType.Cluster); + s_typeMap.put(EntityType.HOST, ApiCommandResourceType.Host); + s_typeMap.put(EntityType.DOMAIN, ApiCommandResourceType.Domain); + s_typeMap.put(EntityType.PRIMARY_STORAGE, ApiCommandResourceType.StoragePool); + s_typeMap.put(EntityType.SECONDARY_STORAGE, ApiCommandResourceType.ImageStore); + s_typeMap.put(EntityType.VR, ApiCommandResourceType.DomainRouter); + s_typeMap.put(EntityType.SYSTEM_VM, ApiCommandResourceType.SystemVm); + } public List getKubernetesClusterHelpers() { return kubernetesClusterHelpers; @@ -191,6 +227,7 @@ public final class AnnotationManagerImpl extends ManagerBase implements Annotati String userUuid = userVO.getUuid(); checkAnnotationPermissions(type, userVO); isEntityOwnedByTheUser(type.name(), uuid, userVO); + updateResourceDetailsInContext(uuid, type); AnnotationVO annotation = new AnnotationVO(text, type, uuid, adminsOnly); annotation.setUserUuid(userUuid); @@ -213,6 +250,17 @@ public final class AnnotationManagerImpl extends ManagerBase implements Annotati } } + private void updateResourceDetailsInContext(String resourceUuid, EntityType resourceType) { + ApiCommandResourceType type = s_typeMap.get(resourceType); + if (type != null && !ApiCommandResourceType.None.equals(type)) { + CallContext.current().setEventResourceType(type); + Object obj = entityManager.findByUuid(type.getAssociatedClass(), resourceUuid); + if (obj != null) { + CallContext.current().setEventResourceId(((InternalIdentity)obj).getId()); + } + } + } + @Override @ActionEvent(eventType = EventTypes.EVENT_ANNOTATION_REMOVE, eventDescription = "removing an annotation on an entity") public AnnotationResponse removeAnnotation(RemoveAnnotationCmd removeAnnotationCmd) { @@ -225,6 +273,7 @@ public final class AnnotationManagerImpl extends ManagerBase implements Annotati if(LOGGER.isDebugEnabled()) { LOGGER.debug(String.format("Removing annotation uuid: %s - type: %s", uuid, annotation.getEntityType().name())); } + updateResourceDetailsInContext(annotation.getEntityUuid(), annotation.getEntityType()); annotationDao.remove(annotation.getId()); return createAnnotationResponse(annotation); @@ -313,7 +362,7 @@ public final class AnnotationManagerImpl extends ManagerBase implements Annotati } else { annotations = getAllAnnotations(annotationFilter, userUuid, callingUserUuid, isCallerAdmin, keyword); } - List paginated = StringUtils.applyPagination(annotations, cmd.getStartIndex(), cmd.getPageSizeVal()); + List paginated = com.cloud.utils.StringUtils.applyPagination(annotations, cmd.getStartIndex(), cmd.getPageSizeVal()); return (paginated != null) ? new Pair<>(paginated, annotations.size()) : new Pair<>(annotations, annotations.size()); } diff --git a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java index 0ef2ada2800..45eba15c1d9 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -31,6 +31,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.backup.DeleteBackupOfferingCmd; import org.apache.cloudstack.api.command.admin.backup.ImportBackupOfferingCmd; @@ -65,6 +66,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.api.ApiDispatcher; @@ -110,7 +112,6 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; -import com.google.common.base.Strings; import com.google.gson.Gson; public class BackupManagerImpl extends ManagerBase implements BackupManager { @@ -586,7 +587,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { @Override @ActionEvent(eventType = EventTypes.EVENT_VM_BACKUP_RESTORE, eventDescription = "restoring VM from backup", async = true) public boolean restoreBackupVolumeAndAttachToVM(final String backedUpVolumeUuid, final Long backupId, final Long vmId) throws Exception { - if (Strings.isNullOrEmpty(backedUpVolumeUuid)) { + if (StringUtils.isEmpty(backedUpVolumeUuid)) { throw new CloudRuntimeException("Invalid volume ID passed"); } final BackupVO backup = backupDao.findById(backupId); @@ -747,7 +748,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { } public BackupProvider getBackupProvider(final String name) { - if (Strings.isNullOrEmpty(name)) { + if (StringUtils.isEmpty(name)) { throw new CloudRuntimeException("Invalid backup provider name provided"); } if (!backupProvidersMap.containsKey(name)) { @@ -923,7 +924,9 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { tmpBackupScheduleVO = backupScheduleDao.acquireInLockTable(backupScheduleId); final Long eventId = ActionEventUtils.onScheduledActionEvent(User.UID_SYSTEM, vm.getAccountId(), - EventTypes.EVENT_VM_BACKUP_CREATE, "creating backup for VM ID:" + vm.getUuid(), true, 0); + EventTypes.EVENT_VM_BACKUP_CREATE, "creating backup for VM ID:" + vm.getUuid(), + vmId, ApiCommandResourceType.VirtualMachine.toString(), + true, 0); final Map params = new HashMap(); params.put(ApiConstants.VIRTUAL_MACHINE_ID, "" + vmId); params.put("ctxUserId", "1"); @@ -938,7 +941,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { AsyncJobVO job = new AsyncJobVO("", User.UID_SYSTEM, vm.getAccountId(), CreateBackupCmd.class.getName(), ApiGsonHelper.getBuilder().create().toJson(params), vmId, - cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null, null); + cmd.getApiResourceType() != null ? cmd.getApiResourceType().toString() : null, null); job.setDispatcher(asyncJobDispatcher.getName()); final long jobId = asyncJobManager.submitAsyncJob(job); diff --git a/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java b/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java index 242dc865b93..49b87d27949 100644 --- a/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/direct/download/DirectDownloadManagerImpl.java @@ -52,6 +52,7 @@ import org.apache.cloudstack.agent.directdownload.MetalinkDirectDownloadCommand; import org.apache.cloudstack.agent.directdownload.NfsDirectDownloadCommand; import org.apache.cloudstack.agent.directdownload.RevokeDirectDownloadCertificateCommand; import org.apache.cloudstack.agent.directdownload.SetupDirectDownloadCertificateCommand; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -376,7 +377,7 @@ public class DirectDownloadManagerImpl extends ManagerBase implements DirectDown } String description = "Direct Download for template Id: " + template.getId() + " on pool Id: " + poolId + " failed"; s_logger.error(description); - ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), template.getAccountId(), EventVO.LEVEL_INFO, event, description, 0); + ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), template.getAccountId(), EventVO.LEVEL_INFO, event, description, template.getId(), ApiCommandResourceType.Template.toString(), 0); } /** diff --git a/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java b/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java index 947e45203d4..5d045609f88 100644 --- a/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java @@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.admin.ha.ConfigureHAForHostCmd; @@ -54,13 +55,14 @@ import org.apache.cloudstack.ha.task.HealthCheckTask; import org.apache.cloudstack.ha.task.RecoveryTask; import org.apache.cloudstack.kernel.Partition; import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.cloudstack.management.ManagementServerHost; import org.apache.cloudstack.poll.BackgroundPollManager; import org.apache.cloudstack.poll.BackgroundPollTask; import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.cluster.ClusterManagerListener; -import org.apache.cloudstack.management.ManagementServerHost; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; import com.cloud.dc.DataCenter; @@ -86,7 +88,6 @@ import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateListener; import com.cloud.utils.fsm.StateMachine2; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; public final class HAManagerImpl extends ManagerBase implements HAManager, ClusterManagerListener, PluggableService, Configurable, StateListener { public static final Logger LOG = Logger.getLogger(HAManagerImpl.class); @@ -160,7 +161,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust if (nextState == HAConfig.HAState.Recovering || nextState == HAConfig.HAState.Fencing || nextState == HAConfig.HAState.Fenced) { ActionEventUtils.onActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), - Domain.ROOT_DOMAIN, EventTypes.EVENT_HA_STATE_TRANSITION, message); + Domain.ROOT_DOMAIN, EventTypes.EVENT_HA_STATE_TRANSITION, message, haConfig.getResourceId(), ApiCommandResourceType.Host.toString()); } } return result; @@ -244,7 +245,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust return true; } final DataCenterDetailVO zoneDetails = dataCenterDetailsDao.findDetail(resource.getDataCenterId(), HA_ENABLED_DETAIL); - return zoneDetails == null || Strings.isNullOrEmpty(zoneDetails.getValue()) || Boolean.valueOf(zoneDetails.getValue()); + return zoneDetails == null || StringUtils.isEmpty(zoneDetails.getValue()) || Boolean.valueOf(zoneDetails.getValue()); } private boolean isHAEnabledForCluster(final HAResource resource) { @@ -252,7 +253,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust return true; } final ClusterDetailsVO clusterDetails = clusterDetailsDao.findDetail(resource.getClusterId(), HA_ENABLED_DETAIL); - return clusterDetails == null || Strings.isNullOrEmpty(clusterDetails.getValue()) || Boolean.valueOf(clusterDetails.getValue()); + return clusterDetails == null || StringUtils.isEmpty(clusterDetails.getValue()) || Boolean.valueOf(clusterDetails.getValue()); } private boolean isHAEligibleForResource(final HAResource resource) { @@ -352,7 +353,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust } haConfig.setResourceId(resourceId); haConfig.setResourceType(resourceType); - if (Strings.isNullOrEmpty(haConfig.getHaProvider())) { + if (StringUtils.isEmpty(haConfig.getHaProvider())) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, String.format("HAProvider is not provided for the resource [%s], failing configuration.", resourceId)); } if (haConfigDao.persist(haConfig) != null) { @@ -365,7 +366,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust if (haProvider != null) { haConfig.setHaProvider(haProvider); } - if (Strings.isNullOrEmpty(haConfig.getHaProvider())) { + if (StringUtils.isEmpty(haConfig.getHaProvider())) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, String.format("HAProvider is not provided for the resource [%s], failing configuration.", resourceId)); } return haConfigDao.update(haConfig.getId(), haConfig); @@ -380,7 +381,7 @@ public final class HAManagerImpl extends ManagerBase implements HAManager, Clust public boolean configureHA(final Long resourceId, final HAResource.ResourceType resourceType, final String haProvider) { Preconditions.checkArgument(resourceId != null && resourceId > 0L); Preconditions.checkArgument(resourceType != null); - Preconditions.checkArgument(!Strings.isNullOrEmpty(haProvider)); + Preconditions.checkArgument(StringUtils.isNotEmpty(haProvider)); if (!haProviderMap.containsKey(haProvider.toLowerCase())) { throw new CloudRuntimeException(String.format("Given HA provider [%s] does not exist.", haProvider)); diff --git a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java index e4e221daca2..39cea17d9f0 100644 --- a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java +++ b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java @@ -16,6 +16,36 @@ // under the License. package org.apache.cloudstack.outofbandmanagement; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.response.OutOfBandManagementResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao; +import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverChangePasswordCommand; +import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverPowerCommand; +import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverResponse; +import org.apache.cloudstack.poll.BackgroundPollManager; +import org.apache.cloudstack.poll.BackgroundPollTask; +import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import com.cloud.alert.AlertManager; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; @@ -37,36 +67,9 @@ import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; -import com.google.common.base.Strings; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableMap; -import org.apache.cloudstack.api.response.OutOfBandManagementResponse; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; -import org.apache.cloudstack.managed.context.ManagedContextRunnable; -import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao; -import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverChangePasswordCommand; -import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverPowerCommand; -import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverResponse; -import org.apache.cloudstack.poll.BackgroundPollManager; -import org.apache.cloudstack.poll.BackgroundPollTask; -import org.apache.cloudstack.utils.identity.ManagementServerNode; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; @Component public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOfBandManagementService, Manager, Configurable { @@ -110,7 +113,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf } private OutOfBandManagementDriver getDriver(final OutOfBandManagement outOfBandManagementConfig) { - if (!Strings.isNullOrEmpty(outOfBandManagementConfig.getDriver())) { + if (StringUtils.isNotEmpty(outOfBandManagementConfig.getDriver())) { final OutOfBandManagementDriver driver = outOfBandManagementDriversMap.get(outOfBandManagementConfig.getDriver()); if (driver != null) { return driver; @@ -128,7 +131,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf } for (OutOfBandManagement.Option option: options.keySet()) { final String value = options.get(option); - if (Strings.isNullOrEmpty(value)) { + if (StringUtils.isEmpty(value)) { continue; } switch (option) { @@ -213,7 +216,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf LOG.debug(message); if (newPowerState == OutOfBandManagement.PowerState.Unknown) { ActionEventUtils.onActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), Domain.ROOT_DOMAIN, - EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION, message); + EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION, message, host.getId(), ApiCommandResourceType.Host.toString()); } } return result; @@ -228,7 +231,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf return true; } final DataCenterDetailVO zoneDetails = dataCenterDetailsDao.findDetail(zoneId, OOBM_ENABLED_DETAIL); - if (zoneDetails != null && !Strings.isNullOrEmpty(zoneDetails.getValue()) && !Boolean.valueOf(zoneDetails.getValue())) { + if (zoneDetails != null && StringUtils.isNotEmpty(zoneDetails.getValue()) && !Boolean.valueOf(zoneDetails.getValue())) { return false; } return true; @@ -239,7 +242,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf return true; } final ClusterDetailsVO clusterDetails = clusterDetailsDao.findDetail(clusterId, OOBM_ENABLED_DETAIL); - if (clusterDetails != null && !Strings.isNullOrEmpty(clusterDetails.getValue()) && !Boolean.valueOf(clusterDetails.getValue())) { + if (clusterDetails != null && StringUtils.isNotEmpty(clusterDetails.getValue()) && !Boolean.valueOf(clusterDetails.getValue())) { return false; } return true; @@ -376,7 +379,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf outOfBandManagementConfig = outOfBandManagementDao.persist(new OutOfBandManagementVO(host.getId())); } outOfBandManagementConfig = updateConfig(outOfBandManagementConfig, options); - if (Strings.isNullOrEmpty(outOfBandManagementConfig.getDriver()) || !outOfBandManagementDriversMap.containsKey(outOfBandManagementConfig.getDriver().toLowerCase())) { + if (StringUtils.isEmpty(outOfBandManagementConfig.getDriver()) || !outOfBandManagementDriversMap.containsKey(outOfBandManagementConfig.getDriver().toLowerCase())) { throw new CloudRuntimeException("Out-of-band management driver is not available. Please provide a valid driver name."); } @@ -445,13 +448,13 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD, eventDescription = "updating out-of-band management password") public OutOfBandManagementResponse changePassword(final Host host, final String newPassword) { checkOutOfBandManagementEnabledByZoneClusterHost(host); - if (Strings.isNullOrEmpty(newPassword)) { + if (StringUtils.isEmpty(newPassword)) { throw new CloudRuntimeException(String.format("Cannot change out-of-band management password as provided new-password is null or empty for %s.", host)); } final OutOfBandManagement outOfBandManagementConfig = outOfBandManagementDao.findByHost(host.getId()); final ImmutableMap options = getOptions(outOfBandManagementConfig); - if (!(options.containsKey(OutOfBandManagement.Option.PASSWORD) && !Strings.isNullOrEmpty(options.get(OutOfBandManagement.Option.PASSWORD)))) { + if (!(options.containsKey(OutOfBandManagement.Option.PASSWORD) && StringUtils.isNotEmpty(options.get(OutOfBandManagement.Option.PASSWORD)))) { throw new CloudRuntimeException(String.format("Cannot change out-of-band management password as we've no previously configured password for %s.", host)); } final OutOfBandManagementDriver driver = getDriver(outOfBandManagementConfig); diff --git a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java index 0bb197761e2..8d037f2fc99 100644 --- a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java +++ b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java @@ -17,12 +17,14 @@ package org.apache.cloudstack.outofbandmanagement; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; + import com.cloud.event.ActionEventUtils; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.host.Host; -import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; public class PowerOperationTask implements Runnable { public static final Logger LOG = Logger.getLogger(PowerOperationTask.class); @@ -54,7 +56,7 @@ public class PowerOperationTask implements Runnable { .format("Error while issuing out-of-band management action %s for host: %s", powerOperation.name(), host.getName()); ActionEventUtils.onCreatedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_WARN, - EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, true, eventMessage); + EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, true, eventMessage, host.getId(), ApiCommandResourceType.Host.toString()); } } } diff --git a/server/src/test/java/com/cloud/api/ApiDispatcherTest.java b/server/src/test/java/com/cloud/api/ApiDispatcherTest.java new file mode 100644 index 00000000000..98ece498d94 --- /dev/null +++ b/server/src/test/java/com/cloud/api/ApiDispatcherTest.java @@ -0,0 +1,94 @@ +// 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 com.cloud.api; + +import java.util.HashMap; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.context.CallContext; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.test.util.ReflectionTestUtils; + +import com.cloud.api.dispatch.DispatchChain; +import com.cloud.api.dispatch.DispatchTask; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; + +public class ApiDispatcherTest { + protected static final Long resourceId = 1L; + protected static final ApiCommandResourceType resourceType = ApiCommandResourceType.Account; + + ApiDispatcher apiDispatcher; + + @Before + public void injectMocks() throws SecurityException, NoSuchFieldException, + IllegalArgumentException, IllegalAccessException { + apiDispatcher = new ApiDispatcher(); + DispatchChain dispatchChain = Mockito.mock(DispatchChain.class); + Mockito.doNothing().when(dispatchChain).dispatch(Mockito.any(DispatchTask.class)); + ReflectionTestUtils.setField(apiDispatcher, "standardDispatchChain", dispatchChain); + } + + @Test + public void testBaseCmdDispatchCallContext() { + TesBaseCmd cmd = new TesBaseCmd(); + try { + apiDispatcher.dispatch(cmd, new HashMap(), false); + } catch (Exception e) { + e.printStackTrace(); + } + Assert.assertEquals(CallContext.current().getEventResourceId(), resourceId); + Assert.assertEquals(CallContext.current().getEventResourceType(), resourceType); + } + + protected class TesBaseCmd extends BaseCmd { + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + + } + + @Override + public String getCommandName() { + return "testCommand"; + } + + @Override + public long getEntityOwnerId() { + return 1L; + } + + @Override + public Long getApiResourceId() { + return resourceId; + } + + @Override + public ApiCommandResourceType getApiResourceType() { + return resourceType; + } + } +} \ No newline at end of file diff --git a/server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java b/server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java new file mode 100644 index 00000000000..6a03aa29573 --- /dev/null +++ b/server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java @@ -0,0 +1,190 @@ +// 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 com.cloud.api.query; + +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.command.user.event.ListEventsCmd; +import org.apache.cloudstack.api.response.EventResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.context.CallContext; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.event.dao.EventJoinDao; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.network.Network; +import com.cloud.network.dao.NetworkVO; +import com.cloud.projects.Project; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.UserVO; +import com.cloud.utils.Pair; +import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.vm.VirtualMachine; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ComponentContext.class, ViewResponseHelper.class}) +public class QueryManagerImplTest { + public static final long USER_ID = 1; + public static final long ACCOUNT_ID = 1; + + @Mock + EntityManager entityManager; + @Mock + AccountManager accountManager; + @Mock + EventJoinDao eventJoinDao; + + private AccountVO account; + private UserVO user; + + @Before + public void setUp() throws Exception { + setupCommonMocks(); + } + + @InjectMocks + private QueryManagerImpl queryManager = new QueryManagerImpl(); + + private void setupCommonMocks() { + account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid"); + account.setId(ACCOUNT_ID); + user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", + UUID.randomUUID().toString(), User.Source.UNKNOWN); + CallContext.register(user, account); + Mockito.when(accountManager.isRootAdmin(account.getId())).thenReturn(false); + Mockito.doNothing().when(accountManager).buildACLSearchParameters(Mockito.any(Account.class), Mockito.anyLong(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyList(), + Mockito.any(), Mockito.anyBoolean(), Mockito.anyBoolean()); + Mockito.doNothing().when(accountManager).buildACLSearchBuilder(Mockito.any(SearchBuilder.class), Mockito.anyLong(), Mockito.anyBoolean(), Mockito.anyList(), + Mockito.any(Project.ListProjectResourcesCriteria.class)); + Mockito.doNothing().when(accountManager).buildACLViewSearchCriteria(Mockito.any(), Mockito.anyLong(), Mockito.anyBoolean(), Mockito.anyList(), + Mockito.any(Project.ListProjectResourcesCriteria.class)); + final SearchBuilder searchBuilder = Mockito.mock(SearchBuilder.class); + final SearchCriteria searchCriteria = Mockito.mock(SearchCriteria.class); + final EventJoinVO eventJoinVO = Mockito.mock(EventJoinVO.class); + when(searchBuilder.entity()).thenReturn(eventJoinVO); + when(searchBuilder.create()).thenReturn(searchCriteria); + Mockito.when(eventJoinDao.createSearchBuilder()).thenReturn(searchBuilder); + Mockito.when(eventJoinDao.createSearchCriteria()).thenReturn(searchCriteria); + } + + private ListEventsCmd setupMockListEventsCmd() { + ListEventsCmd cmd = Mockito.mock(ListEventsCmd.class); + Mockito.when(cmd.getEntryTime()).thenReturn(null); + Mockito.when(cmd.listAll()).thenReturn(true); + return cmd; + } + + @Test + public void searchForEventsSuccess() { + ListEventsCmd cmd = setupMockListEventsCmd(); + String uuid = UUID.randomUUID().toString(); + Mockito.when(cmd.getResourceId()).thenReturn(uuid); + Mockito.when(cmd.getResourceType()).thenReturn(ApiCommandResourceType.Network.toString()); + List events = new ArrayList<>(); + events.add(Mockito.mock(EventJoinVO.class)); + events.add(Mockito.mock(EventJoinVO.class)); + events.add(Mockito.mock(EventJoinVO.class)); + Pair, Integer> pair = new Pair<>(events, events.size()); + NetworkVO network = Mockito.mock(NetworkVO.class); + Mockito.when(network.getId()).thenReturn(1L); + Mockito.when(network.getAccountId()).thenReturn(account.getId()); + Mockito.when(entityManager.findByUuidIncludingRemoved(Network.class, uuid)).thenReturn(network); + Mockito.doNothing().when(accountManager).checkAccess(account, SecurityChecker.AccessType.ListEntry, true, network); + Mockito.when(eventJoinDao.searchAndCount(Mockito.any(), Mockito.any(Filter.class))).thenReturn(pair); + List respList = new ArrayList(); + for (EventJoinVO vt : events) { + respList.add(eventJoinDao.newEventResponse(vt)); + } + PowerMockito.mockStatic(ViewResponseHelper.class); + Mockito.when(ViewResponseHelper.createEventResponse(Mockito.any())).thenReturn(respList); + ListResponse result = queryManager.searchForEvents(cmd); + Assert.assertEquals((int) result.getCount(), events.size()); + } + + @Test(expected = InvalidParameterValueException.class) + public void searchForEventsFailResourceTypeNull() { + ListEventsCmd cmd = setupMockListEventsCmd(); + String uuid = UUID.randomUUID().toString(); + Mockito.when(cmd.getResourceId()).thenReturn(uuid); + Mockito.when(cmd.getResourceType()).thenReturn(null); + queryManager.searchForEvents(cmd); + } + + @Test(expected = InvalidParameterValueException.class) + public void searchForEventsFailResourceTypeInvalid() { + ListEventsCmd cmd = setupMockListEventsCmd(); + Mockito.when(cmd.getResourceType()).thenReturn("Some"); + queryManager.searchForEvents(cmd); + } + + @Test(expected = InvalidParameterValueException.class) + public void searchForEventsFailResourceIdInvalid() { + ListEventsCmd cmd = setupMockListEventsCmd(); + Mockito.when(cmd.getResourceId()).thenReturn("random"); + Mockito.when(cmd.getResourceType()).thenReturn(ApiCommandResourceType.VirtualMachine.toString()); + queryManager.searchForEvents(cmd); + } + + @Test(expected = InvalidParameterValueException.class) + public void searchForEventsFailResourceNotFound() { + ListEventsCmd cmd = setupMockListEventsCmd(); + String uuid = UUID.randomUUID().toString(); + Mockito.when(cmd.getResourceId()).thenReturn(uuid); + Mockito.when(cmd.getResourceType()).thenReturn(ApiCommandResourceType.VirtualMachine.toString()); + Mockito.when(entityManager.findByUuidIncludingRemoved(VirtualMachine.class, uuid)).thenReturn(null); + queryManager.searchForEvents(cmd); + } + + @Test(expected = PermissionDeniedException.class) + public void searchForEventsFailPermissionDenied() { + ListEventsCmd cmd = setupMockListEventsCmd(); + String uuid = UUID.randomUUID().toString(); + Mockito.when(cmd.getResourceId()).thenReturn(uuid); + Mockito.when(cmd.getResourceType()).thenReturn(ApiCommandResourceType.Network.toString()); + NetworkVO network = Mockito.mock(NetworkVO.class); + Mockito.when(network.getId()).thenReturn(1L); + Mockito.when(network.getAccountId()).thenReturn(2L); + Mockito.when(entityManager.findByUuidIncludingRemoved(Network.class, uuid)).thenReturn(network); + Mockito.doThrow(new PermissionDeniedException("Denied")).when(accountManager).checkAccess(account, SecurityChecker.AccessType.ListEntry, false, network); + queryManager.searchForEvents(cmd); + } +} \ No newline at end of file diff --git a/server/src/test/java/com/cloud/event/ActionEventInterceptorTest.java b/server/src/test/java/com/cloud/event/ActionEventInterceptorTest.java new file mode 100644 index 00000000000..ee51d446bfc --- /dev/null +++ b/server/src/test/java/com/cloud/event/ActionEventInterceptorTest.java @@ -0,0 +1,319 @@ +// 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 com.cloud.event; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.inject.Inject; + +import org.aopalliance.intercept.MethodInvocation; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.events.Event; +import org.apache.cloudstack.framework.events.EventBus; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.configuration.Config; +import com.cloud.event.dao.EventDao; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.UserVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.EntityManager; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ComponentContext.class) +public class ActionEventInterceptorTest { + //Predictable constants used throughout this test. + public static final long EVENT_ID = 1; + public static final long USER_ID = 1; + public static final long ACCOUNT_ID = 1; + + //Keep track of the static field values between tests. + //A horrid abuse of reflection required due to the strange + //static/inject pattern found in ActionEventUtils. + protected Map staticFieldValues = new HashMap<>(); + + protected List persistedEvents = new ArrayList<>(); + //List of events published on the event bus. Handled via a mocked method. + //Cleared on every run. + protected List publishedEvents = new ArrayList<>(); + + //Mock fields. These are injected into ActionEventUtils by the setup() method. + @Mock + protected EventDao eventDao; + + @Mock + protected AccountDao accountDao; + + @Mock + protected UserDao userDao; + + @Mock + protected ProjectDao projectDao; + + @Mock + protected EntityManager entityMgr; + + @Mock + protected ConfigurationDao configDao; + + @Mock + protected EventBus eventBus; + + private AccountVO account; + private UserVO user; + + @InjectMocks + private ActionEventInterceptor actionEventInterceptor = new ActionEventInterceptor(); + + protected static final String eventType = EventTypes.EVENT_VM_START; + protected static final String eventDescription = "Starting VM"; + + /** + * This setup method injects the mocked beans into the ActionEventUtils class. + * Because ActionEventUtils has static methods, we must also remember these fields + * and restore them later, as otherwise strange behavior can result in other unit + * tests due to the way the JVM handles static fields. + * @throws Exception + */ + @Before + public void setup() throws Exception { + publishedEvents = new ArrayList<>(); + staticFieldValues = new HashMap<>(); + setupCommonMocks(); + + ActionEventUtils utils = new ActionEventUtils(); + + for (Field field : ActionEventUtils.class.getDeclaredFields()) { + if (field.getAnnotation(Inject.class) != null) { + field.setAccessible(true); + + try { + //Inject the mocked field from this class into the ActionEventUtils + //and keep track of its original value. + Field mockField = this.getClass().getDeclaredField(field.getName()); + field.set(utils, mockField.get(this)); + Field staticField = ActionEventUtils.class.getDeclaredField("s_" + field.getName()); + staticFieldValues.put(field.getName(), staticField.get(null)); + } + catch (Exception e) { + // ignore missing fields + } + } + } + + utils.init(); + } + + /** + * Set up the common specialized mocks that are needed to make the ActionEventUtils class behave in a + * predictable way. This method only mocks things that are common to all the tests. Each individual test + * also mocks some other methods (e.g. find user/account) by itself. + */ + public void setupCommonMocks() throws Exception { + //Some basic mocks. + Mockito.when(configDao.getValue(Config.PublishActionEvent.key())).thenReturn("true"); + PowerMockito.mockStatic(ComponentContext.class); + Mockito.when(ComponentContext.getComponent(EventBus.class)).thenReturn(eventBus); + + //Needed for persist to actually set an ID that can be returned from the ActionEventUtils + //methods. + Mockito.when(eventDao.persist(Mockito.any(EventVO.class))).thenAnswer(new Answer() { + @Override + public EventVO answer(InvocationOnMock invocation) throws Throwable { + EventVO event = (EventVO)invocation.getArguments()[0]; + Field id = event.getClass().getDeclaredField("id"); + id.setAccessible(true); + id.set(event, EVENT_ID); + persistedEvents.add(event); + return event; + } + }); + + //Needed to record events published on the bus. + Mockito.doAnswer(new Answer() { + @Override public Void answer(InvocationOnMock invocation) throws Throwable { + Event event = (Event)invocation.getArguments()[0]; + publishedEvents.add(event); + return null; + } + + }).when(eventBus).publish(Mockito.any(Event.class)); + + account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); + account.setId(ACCOUNT_ID); + user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", + UUID.randomUUID().toString(), User.Source.UNKNOWN); + + Mockito.when(accountDao.findById(ACCOUNT_ID)).thenReturn(account); + Mockito.when(userDao.findById(USER_ID)).thenReturn(user); + } + + /** + * This teardown method restores the ActionEventUtils static field values to their original values, + * keeping the mocked mess inside this class. + */ + @After + public void teardown() { + ActionEventUtils utils = new ActionEventUtils(); + + for (String fieldName : staticFieldValues.keySet()) { + try { + Field field = ActionEventUtils.class.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(utils, staticFieldValues.get(fieldName)); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + utils.init(); + } + + @Test + public void testInvokeSuccess() throws Throwable { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + MethodInvocation invocation = Mockito.mock(MethodInvocation.class); + Method m = tester.getClass().getMethod("testMethod"); + Mockito.when(invocation.getMethod()).thenReturn(m); + Mockito.when(invocation.getThis()).thenReturn(tester); + Boolean o = tester.testMethod(); + Mockito.when(invocation.proceed()).thenReturn(o); + Object result = actionEventInterceptor.invoke(invocation); + Assert.assertEquals(result, o); + } + + @Test + public void testInterceptStartNonAsync() throws NoSuchMethodException { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod1"); + Object event = actionEventInterceptor.interceptStart(m, tester); + Assert.assertNull(event); + } + + @Test + public void testInterceptStartAsync() throws NoSuchMethodException { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod"); + Object event = actionEventInterceptor.interceptStart(m, tester); + Assert.assertNull(event); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getType(), EventTypes.EVENT_VM_START); + Assert.assertEquals(eventVO.getDescription(), "Starting VM"); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Started); + } + + @Test + public void testInterceptComplete() throws NoSuchMethodException { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod"); + actionEventInterceptor.interceptComplete(m, tester, null); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getType(), eventType); + Assert.assertTrue(eventVO.getDescription().endsWith(eventDescription)); + Assert.assertEquals(eventVO.getLevel(), EventVO.LEVEL_INFO); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Completed); + } + + @Test + public void testInterceptException() throws NoSuchMethodException { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod"); + actionEventInterceptor.interceptException(m, tester, null); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getType(), eventType); + Assert.assertTrue(eventVO.getDescription().endsWith(eventDescription)); + Assert.assertEquals(eventVO.getLevel(), EventVO.LEVEL_ERROR); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Completed); + } + + @Test + public void testInterceptExceptionResource() throws NoSuchMethodException { + CallContext.register(user, account); + Long resourceId = 1L; + ApiCommandResourceType resourceType = ApiCommandResourceType.VirtualMachine; + CallContext.current().setEventResourceId(resourceId); + CallContext.current().setEventResourceType(resourceType); + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod"); + actionEventInterceptor.interceptException(m, tester, null); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getType(), eventType); + Assert.assertTrue(eventVO.getDescription().endsWith(eventDescription)); + Assert.assertEquals(eventVO.getLevel(), EventVO.LEVEL_ERROR); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Completed); + Assert.assertEquals(eventVO.getResourceId(), resourceId); + Assert.assertEquals(eventVO.getResourceType(), resourceType.toString()); + CallContext.unregister(); + } + + @Test + public void testNeedToIntercept() throws NoSuchMethodException { + TestActionEventManagerImpl tester = new TestActionEventManagerImpl(); + Method m = tester.getClass().getMethod("testMethod"); + Assert.assertTrue(actionEventInterceptor.needToIntercept(m)); + m = tester.getClass().getMethod("noEventMethod"); + Assert.assertFalse(actionEventInterceptor.needToIntercept(m)); + } + + protected class TestActionEventManagerImpl { + @ActionEvent(eventType = ActionEventInterceptorTest.eventType, eventDescription = ActionEventInterceptorTest.eventDescription, async = true) + public Boolean testMethod() { + return true; + } + @ActionEvent(eventType = ActionEventInterceptorTest.eventType, eventDescription = ActionEventInterceptorTest.eventDescription) + public Boolean testMethod1() { + return false; + } + public Boolean noEventMethod() { + return false; + } + } +} \ No newline at end of file diff --git a/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java b/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java index 17d3909e6c8..65a97169767 100644 --- a/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java +++ b/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java @@ -25,9 +25,10 @@ import java.util.UUID; import javax.inject.Inject; -import org.apache.cloudstack.framework.events.Event; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.events.Event; import org.apache.cloudstack.framework.events.EventBus; import org.junit.After; import org.junit.Assert; @@ -42,11 +43,12 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; - import com.cloud.configuration.Config; import com.cloud.event.dao.EventDao; import com.cloud.network.IpAddress; import com.cloud.projects.dao.ProjectDao; +import com.cloud.storage.Snapshot; +import com.cloud.storage.Volume; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserVO; @@ -55,6 +57,7 @@ import com.cloud.user.dao.UserDao; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.db.EntityManager; import com.cloud.vm.VirtualMachine; +import com.cloud.vm.snapshot.VMSnapshot; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -71,6 +74,7 @@ public class ActionEventUtilsTest { //static/inject pattern found in ActionEventUtils. protected Map staticFieldValues = new HashMap<>(); + protected List persistedEvents = new ArrayList<>(); //List of events published on the event bus. Handled via a mocked method. //Cleared on every run. protected List publishedEvents = new ArrayList<>(); @@ -97,6 +101,9 @@ public class ActionEventUtilsTest { @Mock protected EventBus eventBus; + private AccountVO account; + private UserVO user; + /** * This setup method injects the mocked beans into the ActionEventUtils class. * Because ActionEventUtils has static methods, we must also remember these fields @@ -153,6 +160,7 @@ public class ActionEventUtilsTest { Field id = event.getClass().getDeclaredField("id"); id.setAccessible(true); id.set(event, EVENT_ID); + persistedEvents.add(event); return event; } }); @@ -166,6 +174,14 @@ public class ActionEventUtilsTest { } }).when(eventBus).publish(Mockito.any(Event.class)); + + account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); + account.setId(ACCOUNT_ID); + user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", + UUID.randomUUID().toString(), User.Source.UNKNOWN); + + Mockito.when(accountDao.findById(ACCOUNT_ID)).thenReturn(account); + Mockito.when(userDao.findById(USER_ID)).thenReturn(user); } /** @@ -192,14 +208,6 @@ public class ActionEventUtilsTest { @Test public void testPopulateFirstClassEntities() { - AccountVO account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); - account.setId(ACCOUNT_ID); - UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", - UUID.randomUUID().toString(), User.Source.UNKNOWN); - - Mockito.when(accountDao.findById(ACCOUNT_ID)).thenReturn(account); - Mockito.when(userDao.findById(USER_ID)).thenReturn(user); - CallContext.register(user, account); //Inject some entity UUIDs into the call context @@ -208,7 +216,7 @@ public class ActionEventUtilsTest { CallContext.current().putContextParameter(VirtualMachine.class, instanceUuid); CallContext.current().putContextParameter(IpAddress.class, ipUuid); - ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), "StaticNat", "Test event"); + ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), "StaticNat", "Test event", null, null); //Assertions Assert.assertNotEquals(publishedEvents.size(), 0); @@ -226,4 +234,174 @@ public class ActionEventUtilsTest { CallContext.unregister(); } + + private void checkEventResourceAndUnregisterContext(Long resourceId, String resourceUuid, String resourceType) { + Assert.assertEquals(publishedEvents.size(), 1); + Event event = publishedEvents.get(0); + JsonObject json = new JsonParser().parse(event.getDescription()).getAsJsonObject(); + Assert.assertTrue(json.has("entity")); + Assert.assertTrue(json.has("entityuuid")); + Assert.assertEquals(json.get("entity").getAsString(), resourceType); + Assert.assertEquals(json.get("entityuuid").getAsString(), resourceUuid); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getResourceType(), resourceType); + Assert.assertEquals(eventVO.getResourceId(), resourceId); + + CallContext.unregister(); + } + + @Test + public void testPublishedEventResource() { + CallContext.register(user, account); + + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getUuid()).thenReturn(resourceUuid); + Mockito.when(entityMgr.validEntityType(VirtualMachine.class)).thenReturn(true); + Mockito.when(entityMgr.findByIdIncludingRemoved(VirtualMachine.class, resourceId)).thenReturn(vm); + ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), EventTypes.EVENT_VM_START, "Test event", resourceId, resourceType); + + checkEventResourceAndUnregisterContext(resourceId, resourceUuid, resourceType); + } + + @Test + public void testPublishedEventResourceWithCallContext() { + CallContext.register(user, account); + + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getId()).thenReturn(resourceId); + Mockito.when(entityMgr.validEntityType(VirtualMachine.class)).thenReturn(true); + Mockito.when(entityMgr.findByUuidIncludingRemoved(VirtualMachine.class, resourceUuid)).thenReturn(vm); + CallContext.current().putContextParameter(VirtualMachine.class, resourceUuid); + ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), EventTypes.EVENT_VM_START, "Test event", null, null); + + checkEventResourceAndUnregisterContext(resourceId, resourceUuid, resourceType); + } + + @Test + public void testScheduledEvent() { + CallContext.register(user, account); + + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getId()).thenReturn(resourceId); + Mockito.when(entityMgr.findByUuidIncludingRemoved(VirtualMachine.class, resourceUuid)).thenReturn(vm); + CallContext.current().putContextParameter(VirtualMachine.class, resourceUuid); + ActionEventUtils.onScheduledActionEvent(USER_ID, ACCOUNT_ID, EventTypes.EVENT_VM_START, "Test event", resourceId, resourceType, true, 0L); + + + Assert.assertEquals(publishedEvents.size(), 1); + Event event = publishedEvents.get(0); + JsonObject json = new JsonParser().parse(event.getDescription()).getAsJsonObject(); + Assert.assertTrue(json.has("status")); + Assert.assertEquals(json.get("status").getAsString(), com.cloud.event.Event.State.Scheduled.toString()); + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Scheduled); + + CallContext.unregister(); + } + + @Test + public void testCreatedEvent() { + CallContext.register(user, account); + + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getId()).thenReturn(resourceId); + Mockito.when(entityMgr.findByUuidIncludingRemoved(VirtualMachine.class, resourceUuid)).thenReturn(vm); + CallContext.current().putContextParameter(VirtualMachine.class, resourceUuid); + ActionEventUtils.onCreatedActionEvent(USER_ID, ACCOUNT_ID, EventVO.LEVEL_INFO, EventTypes.EVENT_VM_START, true, "Test event", resourceId, resourceType); + + + Assert.assertEquals(publishedEvents.size(), 1); + Event event = publishedEvents.get(0); + JsonObject json = new JsonParser().parse(event.getDescription()).getAsJsonObject(); + Assert.assertTrue(json.has("status")); + Assert.assertEquals(json.get("status").getAsString(), com.cloud.event.Event.State.Created.toString()); + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Created); + + CallContext.unregister(); + } + + @Test + public void testNestedEvent() { + CallContext.register(user, account); + + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getId()).thenReturn(resourceId); + Mockito.when(entityMgr.findByUuidIncludingRemoved(VirtualMachine.class, resourceUuid)).thenReturn(vm); + CallContext.current().putContextParameter(VirtualMachine.class, resourceUuid); + ActionEventUtils.startNestedActionEvent(EventTypes.EVENT_VM_START, "Test event", resourceId, resourceType); + + Assert.assertEquals(persistedEvents.size(), 1); + EventVO eventVO = persistedEvents.get(0); + Assert.assertEquals(eventVO.getState(), com.cloud.event.Event.State.Started); + + CallContext.unregister(); + } + + @Test + public void testSnapshotEventResource() { + CallContext.register(user, account); + + final Long snapshotResourceId = 100L; + final String snapshotResourceType = ApiCommandResourceType.Snapshot.toString(); + final String snapshotResourceUuid = UUID.randomUUID().toString(); + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.Volume.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + Snapshot snapshot = Mockito.mock(Snapshot.class); + Mockito.when(snapshot.getUuid()).thenReturn(snapshotResourceUuid); + Mockito.when(snapshot.getVolumeId()).thenReturn(resourceId); + Volume volume = Mockito.mock(Volume.class); + Mockito.when(volume.getUuid()).thenReturn(resourceUuid); + Mockito.when(entityMgr.validEntityType(Snapshot.class)).thenReturn(true); + Mockito.when(entityMgr.validEntityType(Volume.class)).thenReturn(true); + Mockito.when(entityMgr.findByIdIncludingRemoved(Snapshot.class, snapshotResourceId)).thenReturn(snapshot); + Mockito.when(entityMgr.findByIdIncludingRemoved(Volume.class, resourceId)).thenReturn(volume); + ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), EventTypes.EVENT_SNAPSHOT_CREATE, "Test event", snapshotResourceId, snapshotResourceType); + + checkEventResourceAndUnregisterContext(resourceId, resourceUuid, resourceType); + } + + @Test + public void testVmSnapshotEventResource() { + CallContext.register(user, account); + + final Long vmSnapshotResourceId = 100L; + final String vmSnapshotResourceType = ApiCommandResourceType.VmSnapshot.toString(); + final String vmSnapshotResourceUuid = UUID.randomUUID().toString(); + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + VMSnapshot vmSnapshot = Mockito.mock(VMSnapshot.class); + Mockito.when(vmSnapshot.getUuid()).thenReturn(vmSnapshotResourceUuid); + Mockito.when(vmSnapshot.getVmId()).thenReturn(resourceId); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getUuid()).thenReturn(resourceUuid); + Mockito.when(entityMgr.validEntityType(VMSnapshot.class)).thenReturn(true); + Mockito.when(entityMgr.validEntityType(VirtualMachine.class)).thenReturn(true); + Mockito.when(entityMgr.findByIdIncludingRemoved(VMSnapshot.class, vmSnapshotResourceId)).thenReturn(vmSnapshot); + Mockito.when(entityMgr.findByIdIncludingRemoved(VirtualMachine.class, resourceId)).thenReturn(vm); + ActionEventUtils.onActionEvent(USER_ID, ACCOUNT_ID, account.getDomainId(), EventTypes.EVENT_VM_SNAPSHOT_CREATE, "Test event", vmSnapshotResourceId, vmSnapshotResourceType); + + checkEventResourceAndUnregisterContext(resourceId, resourceUuid, resourceType); + } } diff --git a/server/src/test/java/com/cloud/event/dao/EventJoinDaoImplTest.java b/server/src/test/java/com/cloud/event/dao/EventJoinDaoImplTest.java new file mode 100644 index 00000000000..a83f6f4a17e --- /dev/null +++ b/server/src/test/java/com/cloud/event/dao/EventJoinDaoImplTest.java @@ -0,0 +1,69 @@ +// 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 com.cloud.event.dao; + +import java.util.UUID; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.response.EventResponse; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.EntityManager; +import com.cloud.vm.VirtualMachine; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ComponentContext.class) +public class EventJoinDaoImplTest { + + @Mock + protected EntityManager entityManager; + + @InjectMocks + private EventJoinDaoImpl dao = new EventJoinDaoImpl(); + + @Test + public void testNewEventViewResource() { + final Long resourceId = 1L; + final String resourceType = ApiCommandResourceType.VirtualMachine.toString(); + final String resourceUuid = UUID.randomUUID().toString(); + final String resourceName = "TestVM"; + EventJoinVO event = Mockito.mock(EventJoinVO.class); + Mockito.when(event.getResourceId()).thenReturn(resourceId); + Mockito.when(event.getResourceType()).thenReturn(resourceType); + Mockito.when(event.getResourceType()).thenReturn(resourceType); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getUuid()).thenReturn(resourceUuid); + Mockito.when(vm.getHostName()).thenReturn(null); + Mockito.when(vm.getName()).thenReturn(resourceName); + Mockito.when(entityManager.validEntityType(VirtualMachine.class)).thenReturn(true); + Mockito.when(entityManager.findByIdIncludingRemoved(VirtualMachine.class, resourceId)).thenReturn(vm); + EventResponse response = dao.newEventResponse(event); + Assert.assertEquals(response.getResourceId(), resourceUuid); + Assert.assertEquals(response.getResourceType(), resourceType); + Assert.assertEquals(response.getResourceName(), resourceName); + } +} diff --git a/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java b/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java index 79d50d84ebc..1793456ab91 100644 --- a/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java +++ b/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java @@ -37,7 +37,6 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -import com.cloud.exception.InvalidParameterValueException; import org.apache.cloudstack.api.command.admin.host.CancelHostAsDegradedCmd; import org.apache.cloudstack.api.command.admin.host.DeclareHostAsDegradedCmd; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -48,9 +47,9 @@ import org.junit.runner.RunWith; import org.mockito.BDDMockito; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.Spy; -import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @@ -60,6 +59,7 @@ import com.cloud.agent.api.GetVncPortAnswer; import com.cloud.agent.api.GetVncPortCommand; import com.cloud.capacity.dao.CapacityDao; import com.cloud.event.ActionEventUtils; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.ha.HighAvailabilityManager; import com.cloud.host.Host; import com.cloud.host.HostVO; @@ -160,7 +160,7 @@ public class ResourceManagerImplTest { when(vmInstanceDao.listVmsMigratingFromHost(hostId)).thenReturn(new ArrayList<>()); when(vmInstanceDao.listNonMigratingVmsByHostEqualsLastHost(hostId)).thenReturn(new ArrayList<>()); PowerMockito.mockStatic(ActionEventUtils.class); - BDDMockito.given(ActionEventUtils.onCompletedActionEvent(anyLong(), anyLong(), anyString(), anyString(), anyString(), anyLong())) + BDDMockito.given(ActionEventUtils.onCompletedActionEvent(anyLong(), anyLong(), anyString(), anyString(), anyString(), anyLong(), anyString(), anyLong())) .willReturn(1L); when(getVncPortAnswerVm1.getAddress()).thenReturn(vm1VncAddress); when(getVncPortAnswerVm1.getPort()).thenReturn(vm1VncPort); diff --git a/server/src/test/java/com/cloud/resourceicon/ResourceIconManagerImplTest.java b/server/src/test/java/com/cloud/resourceicon/ResourceIconManagerImplTest.java new file mode 100644 index 00000000000..d32f7f2cc1a --- /dev/null +++ b/server/src/test/java/com/cloud/resourceicon/ResourceIconManagerImplTest.java @@ -0,0 +1,132 @@ +// 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 com.cloud.resourceicon; + +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.context.CallContext; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; + +import com.cloud.network.dao.NetworkVO; +import com.cloud.resource.icon.ResourceIconVO; +import com.cloud.resource.icon.dao.ResourceIconDao; +import com.cloud.server.ResourceManagerUtil; +import com.cloud.server.ResourceTag; +import com.cloud.storage.VMTemplateVO; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.UserVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +@RunWith(MockitoJUnitRunner.class) +public class ResourceIconManagerImplTest { + public static final long ACCOUNT_ID = 1L; + public static final Long RESOURCE_ID = 1L; + + @Mock + protected AccountDao accountDao; + @Mock + protected UserDao userDao; + @Mock + ResourceManagerUtil resourceManagerUtil; + @Mock + ResourceIconDao resourceIconDao; + @Mock + EntityManager entityMgr; + + @Spy + @InjectMocks + private ResourceIconManagerImpl resourceIconManager = new ResourceIconManagerImpl(); + + private AccountVO account; + private UserVO user; + + @Before + public void setup() throws Exception { + account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); + account.setId(ACCOUNT_ID); + user = new UserVO(ACCOUNT_ID, "testuser", "password", "firstname", "lastName", "email", "timezone", + UUID.randomUUID().toString(), User.Source.UNKNOWN); + } + + @Test + public void testUploadIconActionEventResourceDetailsUpdate() { + CallContext.register(user, account); + String uuid = UUID.randomUUID().toString(); + ResourceTag.ResourceObjectType resourceType = ResourceTag.ResourceObjectType.Network; + List resourceIds = new ArrayList<>(); + resourceIds.add(uuid); + Mockito.when(resourceManagerUtil.getResourceId(uuid, resourceType)).thenReturn(RESOURCE_ID); + NetworkVO network = Mockito.mock(NetworkVO.class); + Mockito.when(network.getAccountId()).thenReturn(1L); + Mockito.when((network.getDomainId())).thenReturn(1L); + Mockito.when(entityMgr.findById(NetworkVO.class, RESOURCE_ID)).thenReturn(network); + Mockito.doNothing().when(resourceManagerUtil).checkResourceAccessible(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString()); + Mockito.when(resourceIconDao.persist(Mockito.any(ResourceIconVO.class))).thenReturn(Mockito.mock(ResourceIconVO.class)); + resourceIconManager.uploadResourceIcon(resourceIds, resourceType, "Something"); + Assert.assertEquals(RESOURCE_ID, CallContext.current().getEventResourceId()); + Assert.assertEquals(ApiCommandResourceType.Network, CallContext.current().getEventResourceType()); + } + + @Test + public void testDeleteIconActionEventResourceDetailsUpdate() { + CallContext.register(user, account); + String uuid = UUID.randomUUID().toString(); + String iconUuid = UUID.randomUUID().toString(); + ResourceTag.ResourceObjectType resourceType = ResourceTag.ResourceObjectType.Template; + List resourceIds = new ArrayList<>(); + resourceIds.add(uuid); + List resourceIcons = new ArrayList<>(); + ResourceIconVO resourceIcon = Mockito.mock(ResourceIconVO.class); + Mockito.when(resourceIcon.getResourceUuid()).thenReturn(uuid); + resourceIcons.add(resourceIcon); + Mockito.when(resourceManagerUtil.getResourceId(uuid, resourceType)).thenReturn(RESOURCE_ID); + Mockito.when(resourceManagerUtil.getUuid(uuid, resourceType)).thenReturn(iconUuid); + SearchBuilder searchBuilder = Mockito.mock(SearchBuilder.class); + SearchCriteria searchCriteria = Mockito.mock(SearchCriteria.class); + when(searchBuilder.create()).thenReturn(searchCriteria); + when(searchBuilder.entity()).thenReturn(resourceIcon); + Mockito.when(resourceIconDao.createSearchBuilder()).thenReturn(searchBuilder); + Mockito.when(resourceIconDao.search(Mockito.any(), Mockito.any())).thenReturn(resourceIcons); + VMTemplateVO template = Mockito.mock(VMTemplateVO.class); + Mockito.when(template.getAccountId()).thenReturn(1L); + Mockito.when((template.getDomainId())).thenReturn(1L); + Mockito.when(entityMgr.findById(VMTemplateVO.class, RESOURCE_ID)).thenReturn(template); + Mockito.doNothing().when(resourceManagerUtil).checkResourceAccessible(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString()); + Mockito.when(resourceIconDao.remove(Mockito.anyLong())).thenReturn(true); + resourceIconManager.deleteResourceIcon(resourceIds, resourceType); + Assert.assertEquals(RESOURCE_ID, CallContext.current().getEventResourceId()); + Assert.assertEquals(ApiCommandResourceType.Template, CallContext.current().getEventResourceType()); + } +} \ No newline at end of file diff --git a/server/src/test/java/com/cloud/storage/dao/AsyncJobJoinDaoTest.java b/server/src/test/java/com/cloud/storage/dao/AsyncJobJoinDaoTest.java index ed936985a21..3fb95d17034 100644 --- a/server/src/test/java/com/cloud/storage/dao/AsyncJobJoinDaoTest.java +++ b/server/src/test/java/com/cloud/storage/dao/AsyncJobJoinDaoTest.java @@ -20,7 +20,7 @@ package com.cloud.storage.dao; import com.cloud.api.query.dao.AsyncJobJoinDaoImpl; import com.cloud.api.query.vo.AsyncJobJoinVO; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.response.AsyncJobResponse; import org.junit.Assert; import org.junit.Test; @@ -50,7 +50,7 @@ public class AsyncJobJoinDaoTest { ReflectionTestUtils.setField(job,"result",null); ReflectionTestUtils.setField(job,"created",new Date()); ReflectionTestUtils.setField(job,"removed",new Date()); - ReflectionTestUtils.setField(job,"instanceType",ApiCommandJobType.VirtualMachine); + ReflectionTestUtils.setField(job,"instanceType", ApiCommandResourceType.VirtualMachine); ReflectionTestUtils.setField(job,"instanceId",3L); final AsyncJobResponse response = dao.newAsyncJobResponse(job); Assert.assertEquals(job.getUuid(),response.getJobId()); diff --git a/server/src/test/java/com/cloud/vpc/MockSite2SiteVpnManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockSite2SiteVpnManagerImpl.java index 0d6674e5d4f..692369317ce 100644 --- a/server/src/test/java/com/cloud/vpc/MockSite2SiteVpnManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockSite2SiteVpnManagerImpl.java @@ -85,6 +85,15 @@ public class MockSite2SiteVpnManagerImpl extends ManagerBase implements Site2Sit return null; } + /* (non-Javadoc) + * @see com.cloud.network.vpn.Site2SiteVpnService#getCustomerGateway(java.lang.Long) + */ + @Override + public Site2SiteCustomerGateway getCustomerGateway(Long customerGatewayId) { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see com.cloud.network.vpn.Site2SiteVpnService#createVpnConnection(org.apache.cloudstack.api.commands.CreateVpnConnectionCmd) */ diff --git a/server/src/test/java/org/apache/cloudstack/annotation/AnnotationManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/annotation/AnnotationManagerImplTest.java new file mode 100644 index 00000000000..976f39054e5 --- /dev/null +++ b/server/src/test/java/org/apache/cloudstack/annotation/AnnotationManagerImplTest.java @@ -0,0 +1,192 @@ +// 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.annotation; + +import java.util.UUID; + +import org.apache.cloudstack.acl.Role; +import org.apache.cloudstack.acl.RoleService; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.annotation.dao.AnnotationDao; +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.dao.HostDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.Site2SiteCustomerGatewayDao; +import com.cloud.network.vpc.dao.VpcDao; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.AccountService; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.UserVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.SSHKeyPairDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.db.EntityManager; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.dao.InstanceGroupDao; +import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.vm.snapshot.dao.VMSnapshotDao; + +@RunWith(MockitoJUnitRunner.class) +public class AnnotationManagerImplTest { + public static final long ACCOUNT_ID = 1L; + public static final long USER_ID = 0L; + public static final Long ENTITY_ID = 1L; + + @Mock + AnnotationDao annotationDao; + @Mock + UserDao userDao; + @Mock + AccountDao accountDao; + @Mock + RoleService roleService; + @Mock + AccountService accountService; + @Mock + VMInstanceDao vmInstanceDao; + @Mock + VolumeDao volumeDao; + @Mock + SnapshotDao snapshotDao; + @Mock + VMSnapshotDao vmSnapshotDao; + @Mock + InstanceGroupDao instanceGroupDao; + @Mock + SSHKeyPairDao sshKeyPairDao; + @Mock + NetworkDao networkDao; + @Mock + VpcDao vpcDao; + @Mock + IPAddressDao ipAddressDao; + @Mock + Site2SiteCustomerGatewayDao customerGatewayDao; + @Mock + VMTemplateDao templateDao; + @Mock + DataCenterDao dataCenterDao; + @Mock + HostPodDao hostPodDao; + @Mock + ClusterDao clusterDao; + @Mock + HostDao hostDao; + @Mock + PrimaryDataStoreDao primaryDataStoreDao; + @Mock + ImageStoreDao imageStoreDao; + @Mock + DomainDao domainDao; + @Mock + ServiceOfferingDao serviceOfferingDao; + @Mock + DiskOfferingDao diskOfferingDao; + @Mock + NetworkOfferingDao networkOfferingDao; + @Mock + EntityManager entityManager; + + @InjectMocks + private AnnotationManagerImpl annotationManager = new AnnotationManagerImpl(); + + private AccountVO account; + private UserVO user; + + @Before + public void setup() throws Exception { + account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); + account.setId(ACCOUNT_ID); + user = new UserVO(ACCOUNT_ID, "testuser", "password", "firstname", "lastName", "email", "timezone", + UUID.randomUUID().toString(), User.Source.UNKNOWN); + + Mockito.when(accountDao.findById(ACCOUNT_ID)).thenReturn(account); + Mockito.when(userDao.findById(USER_ID)).thenReturn(user); + } + + @Test + public void testAddAnnotationResourceDetailsUpdate() { + CallContext.register(user, account); + String uuid = UUID.randomUUID().toString(); + VolumeVO volume = Mockito.mock(VolumeVO.class); + Mockito.when(volume.getId()).thenReturn(ENTITY_ID); + Mockito.when(volumeDao.findByUuid(uuid)).thenReturn(volume); + Mockito.doNothing().when(accountService).checkAccess(user, volume); + Role role = Mockito.mock(Role.class); + Mockito.when(role.getRoleType()).thenReturn(RoleType.User); + Mockito.when(roleService.findRole(Mockito.anyLong())).thenReturn(role); + AnnotationVO annotationVO = Mockito.mock(AnnotationVO.class); + AnnotationService.EntityType type = AnnotationService.EntityType.VOLUME; + Mockito.when(annotationVO.getEntityType()).thenReturn(type); + Mockito.when(annotationDao.persist(Mockito.any())).thenReturn(annotationVO); + Mockito.when(entityManager.findByUuid(Volume.class, uuid)).thenReturn(volume); + annotationManager.addAnnotation("Some text", type, uuid, false); + Assert.assertEquals(ENTITY_ID, CallContext.current().getEventResourceId()); + Assert.assertEquals(ApiCommandResourceType.Volume, CallContext.current().getEventResourceType()); + } + + @Test + public void testRemoveAnnotationResourceDetailsUpdate() { + CallContext.register(user, account); + String uuid = UUID.randomUUID().toString(); + String annotationUuid = UUID.randomUUID().toString(); + VirtualMachine vm = Mockito.mock(VirtualMachine.class); + Mockito.when(vm.getId()).thenReturn(ENTITY_ID); + Role role = Mockito.mock(Role.class); + Mockito.when(role.getRoleType()).thenReturn(RoleType.User); + Mockito.when(roleService.findRole(Mockito.anyLong())).thenReturn(role); + AnnotationVO annotationVO = Mockito.mock(AnnotationVO.class); + AnnotationService.EntityType type = AnnotationService.EntityType.VM; + Mockito.when(annotationVO.getUuid()).thenReturn(annotationUuid); + Mockito.when(annotationVO.getUserUuid()).thenReturn(user.getUuid()); + Mockito.when(annotationVO.getEntityType()).thenReturn(type); + Mockito.when(annotationVO.getEntityUuid()).thenReturn(uuid); + Mockito.when(annotationDao.findByUuid(annotationUuid)).thenReturn(annotationVO); + Mockito.when(entityManager.findByUuid(VirtualMachine.class, uuid)).thenReturn(vm); + RemoveAnnotationCmd cmd = Mockito.mock(RemoveAnnotationCmd.class); + Mockito.when(cmd.getUuid()).thenReturn(annotationUuid); + annotationManager.removeAnnotation(cmd); + Assert.assertEquals(ENTITY_ID, CallContext.current().getEventResourceId()); + Assert.assertEquals(ApiCommandResourceType.VirtualMachine, CallContext.current().getEventResourceType()); + } +} \ No newline at end of file diff --git a/test/integration/smoke/test_events_resource.py b/test/integration/smoke/test_events_resource.py new file mode 100644 index 00000000000..3e78b3acbd0 --- /dev/null +++ b/test/integration/smoke/test_events_resource.py @@ -0,0 +1,197 @@ +# 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. +""" BVT tests for Events Resource +""" +import os +import tempfile +import time +import unittest +import urllib.error +import urllib.parse +import urllib.request + +from datetime import datetime + +from marvin.cloudstackAPI import (listEvents) + +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.codes import SUCCESS, FAILED +from marvin.lib.base import (ServiceOffering, + VirtualMachine, + NetworkOffering, + Network, + Domain, + Account, + Volume, + Host, + DiskOffering) +from marvin.lib.common import (get_domain, + get_suitable_test_template, + get_zone) + +from nose.plugins.attrib import attr + +_multiprocess_shared_ = True + + +class TestEventsResource(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + testClient = super(TestEventsResource, cls).getClsTestClient() + cls.apiclient = testClient.getApiClient() + cls.services = testClient.getParsedTestDataConfig() + # Get Zone, Domain and templates + cls.domain = get_domain(cls.apiclient) + cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) + cls._cleanup = [] + cls.hypervisor = testClient.getHypervisorInfo() + cls.services['mode'] = cls.zone.networktype + + def setUp(self): + + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + self.cleanup = [] + + @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="true") + def test_01_events_resource(self): + """Test Events resources while doing some operation on VM, volume, template, account, etc + + # Validate the following + # 1. Note start time + # 2. Deploy VM for a new account + # 3. Check resource id and resource type of all concerned events during the period + """ + now = datetime.now() # current date and time + start_time = now.strftime("%Y-%m-%d %H:%M:%S") + + template = get_suitable_test_template( + self.apiclient, + self.zone.id, + self.services["ostype"], + self.hypervisor + ) + if template == FAILED: + self.fail("get_suitable_test_template() failed to return template with description %s" % + self.services["ostype"]) + + self.disk_offering = DiskOffering.create( + self.apiclient, + self.services["disk_offering"] + ) + self.cleanup.append(self.disk_offering) + self.service_offering = ServiceOffering.create( + self.apiclient, + self.services["service_offerings"]["tiny"] + ) + self.cleanup.append(self.service_offering) + self.network_offering = NetworkOffering.create( + self.apiclient, + self.services["network_offering"], + ) + self.network_offering.update(self.apiclient, state='Enabled') + self.services["network"]["networkoffering"] = self.network_offering.id + self.cleanup.append(self.network_offering) + self.services["zoneid"] = self.zone.id + self.services["template"] = template.id + self.services["network"]["zoneid"] = self.zone.id + + domain1 = Domain.create(self.apiclient, + self.services["domain"], + parentdomainid=self.domain.id + ) + self.services["domainid"] = domain1.id + + account = Account.create( + self.apiclient, + self.services["account"], + domainid=domain1.id + ) + + account_network = Network.create( + self.apiclient, + self.services["network"], + account.name, + account.domainid + ) + virtual_machine = VirtualMachine.create( + self.apiclient, + self.services, + accountid=account.name, + domainid=account.domainid, + networkids=account_network.id, + serviceofferingid=self.service_offering.id + ) + volume = Volume.create( + self.apiclient, + self.services, + zoneid=self.zone.id, + account=account.name, + domainid=account.domainid, + diskofferingid=self.disk_offering.id + ) + virtual_machine.attach_volume( + self.apiclient, + volume + ) + account_network.restart(self.apiclient, cleanup=False) + virtual_machine.stop(self.apiclient) + time.sleep(self.services["sleep"]) + virtual_machine.restore(self.apiclient) + time.sleep(self.services["sleep"]) + virtual_machine.detach_volume(self.apiclient, volume) + volume.delete(self.apiclient) + ts = str(time.time()) + virtual_machine.update(self.apiclient, displayname=ts) + virtual_machine.delete(self.apiclient) + account_network.update(self.apiclient, name=account_network.name + ts) + account_network.delete(self.apiclient) + account.update(self.apiclient, newname=account.name + ts) + account.disable(self.apiclient) + account.delete(self.apiclient) + domain1.delete(self.apiclient) + + cmd = listEvents.listEventsCmd() + cmd.startdate = start_time + cmd.listall = True + events = self.apiclient.listEvents(cmd) + self.assertEqual( + isinstance(events, list), + True, + "List Events response was not a valid list" + ) + self.assertNotEqual( + len(events), + 0, + "List Events returned an empty list" + ) + + for event in events: + if event.type.startswith("VM.") or (event.type.startswith("NETWORK.") and not event.type.startswith("NETWORK.ELEMENT")) or event.type.startswith("VOLUME.") or event.type.startswith("ACCOUNT.") or event.type.startswith("DOMAIN.") or event.type.startswith("TEMPLATE."): + if event.resourceid is None or event.resourcetype is None: + self.debug("Failed event:: %" % event) + self.fail("resourceid or resourcetype for the event not found!") + else: + self.debug("Event %s at %s:: Resource Type: %s, Resource ID: %s" % (event.type, event.created, event.resourcetype, event.resourceid)) + + def tearDown(self): + super(TestEventsResource, self).tearDown() + + @classmethod + def tearDownClass(cls): + super(TestEventsResource, cls).tearDownClass() \ No newline at end of file diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 6be9e8e0b6c..4e8d2b42ea6 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -625,6 +625,7 @@ "label.congratulations": "Congratulations!", "label.connectiontimeout": "Connection Timeout", "label.conservemode": "Conserve mode", +"label.consoleproxy": "Console proxy", "label.console.proxy": "Console proxy", "label.console.proxy.vm": "Console Proxy VM", "label.continue": "Continue", @@ -846,6 +847,7 @@ "label.domainid": "Domain", "label.domainname": "Domain", "label.domainpath": "Domain", +"label.domainrouter": "Virtual Router", "label.domains": "Domains", "label.done": "Done", "label.double.quotes.are.not.allowed": "Double quotes are not allowed", @@ -1880,6 +1882,7 @@ "label.resourcename": "Resource Name", "label.resources": "Resources", "label.resourcestate": "Resource state", +"label.resourcetype": "Resource Type", "label.response.timeout.in.sec": "Response Timeout (in sec)", "label.restart.network": "Restart network", "label.restart.vpc": "Restart VPC", @@ -2165,6 +2168,7 @@ "label.system.vm.scaled.up": "System VM Scaled Up", "label.system.vms": "System VMs", "label.system.wide.capacity": "System-wide capacity", +"label.systemvm": "System VM", "label.systemvmtype": "System VM Type", "label.tag.key": "Tag Key", "label.tag.value": "Tag Value", @@ -2340,6 +2344,7 @@ "label.virtual.appliance": "Virtual Appliance", "label.virtual.appliance.details": "Virtual applicance details", "label.virtual.appliances": "Virtual Appliances", +"label.virtualmachine": "Instance", "label.virtual.machine": "Virtual Machine", "label.virtual.machines": "Virtual Machines", "label.virtual.network": "Virtual Network", diff --git a/ui/src/components/view/EventsTab.vue b/ui/src/components/view/EventsTab.vue new file mode 100644 index 00000000000..7e64967e2a0 --- /dev/null +++ b/ui/src/components/view/EventsTab.vue @@ -0,0 +1,151 @@ +// 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. + + + + diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 6b61dad2c13..e94fd1e1d35 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -368,6 +368,12 @@ {{ resource.keypair }} +
+
{{ $t('label.resource') }}
+
+ +
+
{{ $t('label.vmname') }}
@@ -704,6 +710,7 @@ import TooltipButton from '@/components/widgets/TooltipButton' import UploadResourceIcon from '@/components/view/UploadResourceIcon' import eventBus from '@/config/eventBus' import ResourceIcon from '@/components/view/ResourceIcon' +import ResourceLabel from '@/components/widgets/ResourceLabel' export default { name: 'InfoCard', @@ -713,7 +720,8 @@ export default { Status, TooltipButton, UploadResourceIcon, - ResourceIcon + ResourceIcon, + ResourceLabel }, props: { resource: { @@ -821,6 +829,9 @@ export default { return this.resource.icon.base64image } return null + }, + routeFromResourceType () { + return this.$getRouteFromResourceType(this.resource.resourcetype) } }, async mounted () { diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index e570684770f..f060b16ea7b 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -249,9 +249,11 @@ {{ text }} + + + {{ text }} - {{ text }} {{ text }} @@ -376,6 +378,7 @@ import InfoCard from '@/components/view/InfoCard' import QuickView from '@/components/view/QuickView' import TooltipButton from '@/components/widgets/TooltipButton' import ResourceIcon from '@/components/view/ResourceIcon' +import ResourceLabel from '@/components/widgets/ResourceLabel' export default { name: 'ListView', @@ -386,7 +389,8 @@ export default { InfoCard, QuickView, TooltipButton, - ResourceIcon + ResourceIcon, + ResourceLabel }, props: { columns: { diff --git a/ui/src/components/view/ResourceView.vue b/ui/src/components/view/ResourceView.vue index fb23bef9160..03528decfd6 100644 --- a/ui/src/components/view/ResourceView.vue +++ b/ui/src/components/view/ResourceView.vue @@ -44,7 +44,14 @@ :tab="$t('label.' + tab.name)" :key="tab.name" v-if="showTab(tab)"> - + + diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue index 6876c2009be..d4c6621baa4 100644 --- a/ui/src/components/view/SearchView.vue +++ b/ui/src/components/view/SearchView.vue @@ -108,6 +108,16 @@
+
item.name === 'resourcetype') + this.fields[resourceTypeIndex].loading = true + this.fields[resourceTypeIndex].opts = [ + { value: 'Account' }, + { value: 'Domain' }, + { value: 'Iso' }, + { value: 'Network' }, + { value: 'Template' }, + { value: 'User' }, + { value: 'VirtualMachine' }, + { value: 'Volume' } + ] + this.fields[resourceTypeIndex].loading = false + } + Promise.all(promises).then(response => { if (zoneIndex > -1) { const zones = response.filter(item => item.type === 'zoneid') @@ -517,6 +545,7 @@ export default { return } this.isFiltered = true + console.log(values) for (const key in values) { const input = values[key] if (input === '' || input === null || input === undefined) { diff --git a/ui/src/components/view/TreeView.vue b/ui/src/components/view/TreeView.vue index 9bf1908ce50..909e8d263ee 100644 --- a/ui/src/components/view/TreeView.vue +++ b/ui/src/components/view/TreeView.vue @@ -63,6 +63,15 @@ :key="tab.name" v-if="checkShowTabDetail(tab)"> + +
+ + + + {{ resourceType }} + {{ resourceName || resourceId }} + {{ resourceName || resourceId }} +
+ + + diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js index 701553ab789..fd3fb9486b4 100644 --- a/ui/src/config/section/account.js +++ b/ui/src/config/section/account.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'account', title: 'label.accounts', @@ -50,6 +52,12 @@ export default { name: 'settings', component: () => import('@/components/view/SettingsTab.vue'), show: (record, route, user) => { return ['Admin'].includes(user.roletype) } + }, + { + name: 'events', + resourceType: 'Account', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } } ], actions: [ diff --git a/ui/src/config/section/domain.js b/ui/src/config/section/domain.js index 21e023d6bb5..ea66dc96d64 100644 --- a/ui/src/config/section/domain.js +++ b/ui/src/config/section/domain.js @@ -14,6 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. +import store from '@/store' export default { name: 'domain', @@ -54,7 +55,14 @@ export default { name: 'settings', component: () => import('@/components/view/SettingsTab.vue'), show: (record, route, user) => { return ['Admin'].includes(user.roletype) } - }, { + }, + { + name: 'events', + resourceType: 'Domain', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, + { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') } diff --git a/ui/src/config/section/event.js b/ui/src/config/section/event.js index e4e85327552..472ef6214fe 100644 --- a/ui/src/config/section/event.js +++ b/ui/src/config/section/event.js @@ -21,9 +21,9 @@ export default { icon: 'schedule', docHelp: 'adminguide/events.html', permission: ['listEvents'], - columns: ['level', 'type', 'state', 'description', 'username', 'account', 'domain', 'created'], - details: ['username', 'id', 'description', 'state', 'level', 'type', 'account', 'domain', 'created'], - searchFilters: ['level', 'domainid', 'account', 'keyword'], + columns: ['level', 'type', 'state', 'description', 'resource', 'username', 'account', 'domain', 'created'], + details: ['username', 'id', 'description', 'resourcetype', 'resourceid', 'state', 'level', 'type', 'account', 'domain', 'created'], + searchFilters: ['level', 'domainid', 'account', 'keyword', 'resourcetype'], related: [{ name: 'event', title: 'label.event.timeline', diff --git a/ui/src/config/section/image.js b/ui/src/config/section/image.js index 3bd6d578cd7..a93dc20032e 100644 --- a/ui/src/config/section/image.js +++ b/ui/src/config/section/image.js @@ -68,6 +68,12 @@ export default { name: 'settings', component: () => import('@/components/view/DetailSettings') }, + { + name: 'events', + resourceType: 'Template', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') @@ -202,6 +208,12 @@ export default { name: 'zones', component: () => import('@/views/image/IsoZones.vue') }, + { + name: 'events', + resourceType: 'Iso', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/pods.js b/ui/src/config/section/infra/pods.js index 89c60a2a580..5135f048096 100644 --- a/ui/src/config/section/infra/pods.js +++ b/ui/src/config/section/infra/pods.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'pod', title: 'label.pods', @@ -38,6 +40,11 @@ export default { }, { name: 'resources', component: () => import('@/views/infra/Resources.vue') + }, { + name: 'events', + resourceType: 'Pod', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/primaryStorages.js b/ui/src/config/section/infra/primaryStorages.js index ab9241f2139..060c79075ea 100644 --- a/ui/src/config/section/infra/primaryStorages.js +++ b/ui/src/config/section/infra/primaryStorages.js @@ -46,6 +46,11 @@ export default { }, { name: 'settings', component: () => import('@/components/view/SettingsTab.vue') + }, { + name: 'events', + resourceType: 'StoragePool', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/routers.js b/ui/src/config/section/infra/routers.js index 00b2a90e5e3..f14cc5ed75a 100644 --- a/ui/src/config/section/infra/routers.js +++ b/ui/src/config/section/infra/routers.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'router', title: 'label.virtual.routers', @@ -36,6 +38,11 @@ export default { name: 'router.health.checks', show: (record, route, user) => { return ['Running'].includes(record.state) && ['Admin'].includes(user.roletype) }, component: () => import('@views/infra/routers/RouterHealthCheck.vue') + }, { + name: 'events', + resourceType: 'DomainRouter', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/secondaryStorages.js b/ui/src/config/section/infra/secondaryStorages.js index b0d20e003d8..b077bed7067 100644 --- a/ui/src/config/section/infra/secondaryStorages.js +++ b/ui/src/config/section/infra/secondaryStorages.js @@ -46,6 +46,11 @@ export default { }, { name: 'settings', component: () => import('@/components/view/SettingsTab.vue') + }, { + name: 'events', + resourceType: 'ImageStore', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/systemVms.js b/ui/src/config/section/infra/systemVms.js index 2c0bd1d6e59..2309fe3022b 100644 --- a/ui/src/config/section/infra/systemVms.js +++ b/ui/src/config/section/infra/systemVms.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'systemvm', title: 'label.system.vms', @@ -29,6 +31,12 @@ export default { name: 'details', component: () => import('@/components/view/DetailsTab.vue') }, + { + name: 'events', + resourceType: 'SystemVm', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/infra/zones.js b/ui/src/config/section/infra/zones.js index 4df57a54056..0d358f4ac1a 100644 --- a/ui/src/config/section/infra/zones.js +++ b/ui/src/config/section/infra/zones.js @@ -69,6 +69,11 @@ export default { }, { name: 'settings', component: () => import('@/components/view/SettingsTab.vue') + }, { + name: 'events', + resourceType: 'Zone', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index 43992e81ced..638e894143e 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -71,6 +71,12 @@ export default { component: () => import('@/views/network/GuestIpRanges.vue'), show: (record) => { return 'listVlanIpRanges' in store.getters.apis && (record.type === 'Shared' || (record.service && record.service.filter(x => x.name === 'SourceNat').count === 0)) } }, + { + name: 'events', + resourceType: 'Network', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') @@ -299,6 +305,12 @@ export default { component: () => import('@/views/network/VpnDetails.vue'), show: (record) => { return record.issourcenat } }, + { + name: 'events', + resourceType: 'IpAddress', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/project.js b/ui/src/config/section/project.js index 53ae68e85f3..01393a3c847 100644 --- a/ui/src/config/section/project.js +++ b/ui/src/config/section/project.js @@ -52,6 +52,12 @@ export default { name: 'limits', show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) }, component: () => import('@/components/view/ResourceLimitTab.vue') + }, + { + name: 'events', + resourceType: 'Project', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } } ], actions: [ diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js index 48f10d08547..964a44af3cb 100644 --- a/ui/src/config/section/storage.js +++ b/ui/src/config/section/storage.js @@ -67,6 +67,12 @@ export default { name: 'details', component: () => import('@/components/view/DetailsTab.vue') }, + { + name: 'events', + resourceType: 'Volume', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') @@ -295,6 +301,12 @@ export default { name: 'details', component: () => import('@/components/view/DetailsTab.vue') }, + { + name: 'events', + resourceType: 'Snapshot', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') @@ -377,6 +389,12 @@ export default { name: 'details', component: () => import('@/components/view/DetailsTab.vue') }, + { + name: 'events', + resourceType: 'VmSnapshot', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: () => import('@/components/view/AnnotationsTab.vue') diff --git a/ui/src/config/section/user.js b/ui/src/config/section/user.js index 0ff016ef4c6..089a92f9db2 100644 --- a/ui/src/config/section/user.js +++ b/ui/src/config/section/user.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. +import store from '@/store' + export default { name: 'accountuser', title: 'label.users', @@ -24,6 +26,18 @@ export default { permission: ['listUsers'], columns: ['username', 'state', 'firstname', 'lastname', 'email', 'account'], details: ['username', 'id', 'firstname', 'lastname', 'email', 'usersource', 'timezone', 'rolename', 'roletype', 'account', 'domain', 'created'], + tabs: [ + { + name: 'details', + component: () => import('@/components/view/DetailsTab.vue') + }, + { + name: 'events', + resourceType: 'User', + component: () => import('@/components/view/EventsTab.vue'), + show: () => { return 'listEvents' in store.getters.apis } + } + ], actions: [ { api: 'createUser', diff --git a/ui/src/utils/plugins.js b/ui/src/utils/plugins.js index 556996aeeec..a1539a5c71f 100644 --- a/ui/src/utils/plugins.js +++ b/ui/src/utils/plugins.js @@ -353,6 +353,62 @@ export const resourceTypePlugin = { return type } } + + Vue.prototype.$getRouteFromResourceType = function (resourceType) { + switch (resourceType) { + case 'VirtualMachine': + return 'vm' + case 'DomainRouter': + return 'router' + case 'ConsoleProxy': + return 'systemvm' + case 'User': + return 'accountuser' + case 'Network': + return 'guestnetwork' + case 'ServiceOffering': + return 'computeoffering' + case 'IpAddress': + return 'publicip' + case 'NetworkAcl': + return 'acllist' + case 'SystemVm': + case 'PhysicalNetwork': + case 'Backup': + case 'SecurityGroup': + case 'StoragePool': + case 'ImageStore': + case 'Template': + case 'Iso': + case 'Host': + case 'Volume': + case 'Account': + case 'Snapshot': + case 'Project': + case 'Domain': + case 'DiskOffering': + case 'NetworkOffering': + case 'VpcOffering': + case 'BackupOffering': + case 'Zone': + case 'Vpc': + case 'VmSnapshot': + case 'Pod': + case 'Cluster': + case 'Role': + case 'AffinityGroup': + case 'VpnCustomerGateway': + return resourceType.toLowerCase() + } + return '' + } + + Vue.prototype.$getIconFromResourceType = function (resourceType) { + var routePath = this.$getRouteFromResourceType(resourceType) + if (!routePath) return '' + var route = this.$router.resolve('/' + routePath) + return route?.route?.meta?.icon || '' + } } } diff --git a/ui/src/views/compute/InstanceTab.vue b/ui/src/views/compute/InstanceTab.vue index c44b3f958df..909006fc7e1 100644 --- a/ui/src/views/compute/InstanceTab.vue +++ b/ui/src/views/compute/InstanceTab.vue @@ -138,6 +138,9 @@ + + + {{ $toLocaleDate(event.created) }}
- {{ event.type }}
+ {{ event.type }}
+ ({{ event.username }}) {{ event.description }} @@ -132,12 +133,14 @@ import { api } from '@/api' import ChartCard from '@/components/widgets/ChartCard' import ResourceIcon from '@/components/view/ResourceIcon' +import ResourceLabel from '@/components/widgets/ResourceLabel' export default { name: 'CapacityDashboard', components: { ChartCard, - ResourceIcon + ResourceIcon, + ResourceLabel }, data () { return { diff --git a/ui/src/views/dashboard/UsageDashboard.vue b/ui/src/views/dashboard/UsageDashboard.vue index 66b8395c7b3..c30eb7e21d2 100644 --- a/ui/src/views/dashboard/UsageDashboard.vue +++ b/ui/src/views/dashboard/UsageDashboard.vue @@ -83,6 +83,7 @@ :color="getEventColour(event)"> {{ $toLocaleDate(event.created) }}
{{ event.type }}
+ ({{ event.username }}) {{ event.description }} @@ -99,12 +100,14 @@ import store from '@/store' import ChartCard from '@/components/widgets/ChartCard' import UsageDashboardChart from '@/views/dashboard/UsageDashboardChart' +import ResourceLabel from '@/components/widgets/ResourceLabel' export default { name: 'UsageDashboard', components: { ChartCard, - UsageDashboardChart + UsageDashboardChart, + ResourceLabel }, props: { resource: { diff --git a/ui/src/views/network/VpcTab.vue b/ui/src/views/network/VpcTab.vue index 7d5fedcad02..de41f475b3c 100644 --- a/ui/src/views/network/VpcTab.vue +++ b/ui/src/views/network/VpcTab.vue @@ -317,6 +317,9 @@ + + + T findByIdIncludingRemoved(Class entityType, K id); + public boolean validEntityType(Class entityType); + public static final String MESSAGE_REMOVE_ENTITY_EVENT = "Message.RemoveEntity.Event"; public static final String MESSAGE_GRANT_ENTITY_EVENT = "Message.GrantEntity.Event";