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 6471742e8fe..842697f3f0b 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; @@ -972,9 +974,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); @@ -1014,6 +1016,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 70ae1819739..db8eaf808d1 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -335,6 +335,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 7b68296fcbd..7d1150597f6 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,6 +19,7 @@ package org.apache.cloudstack.api.command.admin.account; import java.util.Collection; import java.util.Map; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -207,4 +208,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 d23d80465ef..2a8ee2b8313 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; @@ -114,4 +115,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 3e4b528acf4..61a2d8a8fdc 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 1992ed8caa1..b628ce44f1a 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; @@ -334,4 +335,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 b0e2262aff9..f05c74eef7c 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 487cb534d50..42532932dca 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; @@ -189,6 +190,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 884c982dc02..63d532bd275 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/DeletePrivateGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java index 1126779f45b..063faf96a98 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 @@ -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.BaseAsyncCmd; @@ -109,8 +109,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 23279e652c0..0d1a57a6612 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 255cdeb293e..1ccb18ffaa6 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 5ebb3bebd70..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 org.apache.commons.lang3.StringUtils; @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}) @@ -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 06880f1b5cc..66a4d91172a 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/ReserveIPAddrCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ReserveIPAddrCmd.java index 7280e785093..030a16b7a98 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/address/ReserveIPAddrCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/address/ReserveIPAddrCmd.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; @@ -161,4 +162,13 @@ public class ReserveIPAddrCmd extends BaseCmd implements UserCmd { } } + @Override + public Long getApiResourceId() { + return getIpAddressId(); + } + + @Override + 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 dab7d10ddd3..65539346a13 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 @@ -25,7 +25,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 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 ca6c8018512..7fd75719b93 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 c8e49f414f3..9f2106139f8 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,13 +16,10 @@ // under the License. package org.apache.cloudstack.api.command.user.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.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; @@ -31,6 +28,7 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; @@ -107,13 +105,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 d4db584149a..c59dffc3efb 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,12 +16,10 @@ // under the License. package org.apache.cloudstack.api.command.user.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.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; @@ -29,6 +27,7 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -132,16 +131,6 @@ public class RestartNetworkCmd extends BaseAsyncCmd { return EventTypes.EVENT_NETWORK_RESTART; } - @Override - public Long getInstanceId() { - return getNetworkId(); - } - - @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Network; - } - @Override public long getEntityOwnerId() { Network network = _networkService.getNetwork(id); @@ -151,4 +140,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 5abd0492f16..bb27579992f 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,7 +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.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; @@ -145,16 +145,6 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd implements UserCmd { return s_name; } - @Override - public Long getInstanceId() { - return getId(); - } - - @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.Network; - } - @Override public long getEntityOwnerId() { Network network = _networkService.getNetwork(id); @@ -225,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 9d9553a28d5..0e1c172bd5b 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 41abc461738..503b64397b7 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 0db47b1022d..9b616ea28fe 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 a98a0874573..bbd6a2fe30b 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 07ae40368bf..45aa9313f9a 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 79936eecf87..a21cbfbdef7 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 88f4a3f54b5..d974783f629 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; @@ -700,8 +700,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 11a81df83d6..078ea55d52a 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,35 +20,34 @@ 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.BackupOfferingResponse; 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.ResourceIconResponse; +import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; 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; @@ -263,8 +262,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 41509b0cf6b..259cfebbad5 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; @@ -127,8 +127,8 @@ public class ResetVMSSHKeyCmd extends BaseAsyncCmd implements UserCmd { } @Override - public ApiCommandJobType getInstanceType() { - return ApiCommandJobType.VirtualMachine; + public ApiCommandResourceType getApiResourceType() { + return ApiCommandResourceType.VirtualMachine; } @Override @@ -147,7 +147,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 8243e1cda7d..193a3b1c059 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; @@ -166,6 +166,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 87ecc5700e4..b7e10be074a 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; @@ -88,12 +88,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 d3183dbf318..a0a50c5b9fc 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; @@ -30,6 +30,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; @@ -142,4 +143,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 ceb208b3580..6ad512ad29a 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/CreatePrivateGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreatePrivateGatewayCmd.java index 5e5e43cf609..8527bd0e7fb 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreatePrivateGatewayCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreatePrivateGatewayCmd.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.BaseAsyncCmd; @@ -211,7 +211,7 @@ public class CreatePrivateGatewayCmd extends BaseAsyncCreateCmd implements UserC } @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/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 ac22e669159..a3fd58aa070 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; @@ -137,4 +138,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/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 32916f0c676..48f22f906ec 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -746,3 +746,51 @@ from (`cloud`.`mshost` left join `cloud`.`mshost_status` on ((`cloud`.`mshost`.`uuid` = `cloud`.`mshost_status`.`ms_id`))); + +-- 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; 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 45f4a1fceba..7cb50edb4ef 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.lang3.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 c67e502a2c1..62841501d7c 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 Account.Type getAccountType() { return Account.Type.getFromValue(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 46c9ae571e6..a5ef8933eb5 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 bd11136b633..c874aa19b57 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; @@ -1663,7 +1663,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 @@ -1671,118 +1671,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 f5eaf30510b..76b592a9d90 100644 --- a/server/src/main/java/com/cloud/api/ApiServer.java +++ b/server/src/main/java/com/cloud/api/ApiServer.java @@ -728,7 +728,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; @@ -738,7 +738,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(); @@ -746,7 +746,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()); @@ -801,9 +801,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/dispatch/ParamProcessWorker.java b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java index 45c1d7cb595..b3dd82425d9 100644 --- a/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java +++ b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java @@ -38,7 +38,7 @@ import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.ApiArgValidator; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.BaseAsyncCreateCmd; @@ -49,6 +49,7 @@ import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.context.CallContext; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.exception.InvalidParameterValueException; @@ -58,7 +59,6 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.UuidUtils; import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; -import org.apache.commons.lang3.StringUtils; public class ParamProcessWorker implements DispatchWorker { @@ -293,7 +293,7 @@ public class ParamProcessWorker implements DispatchWorker { if (entityOwners != null) { owners = entityOwners.stream().map(id -> _accountMgr.getAccount(id)).toArray(Account[]::new); } else { - if (cmd.getEntityOwnerId() == Account.ACCOUNT_ID_SYSTEM && cmd instanceof BaseAsyncCmd && ((BaseAsyncCmd)cmd).getInstanceType() == ApiCommandJobType.Network) { + if (cmd.getEntityOwnerId() == Account.ACCOUNT_ID_SYSTEM && cmd instanceof BaseAsyncCmd && ((BaseAsyncCmd)cmd).getApiResourceType() == ApiCommandResourceType.Network) { if (s_logger.isDebugEnabled()) { s_logger.debug("Skipping access check on the network owner if the owner is ROOT/system."); } 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 4bc5ccd56d9..430bb0e117f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -26,21 +26,25 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; -import com.cloud.storage.VolumeApiServiceImpl; +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; @@ -126,6 +130,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.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -195,8 +200,8 @@ import com.cloud.network.dao.RouterHealthCheckResultVO; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.security.SecurityGroupVMMapVO; import com.cloud.network.security.dao.SecurityGroupVMMapDao; -import com.cloud.org.Grouping; import com.cloud.offering.DiskOffering; +import com.cloud.org.Grouping; import com.cloud.projects.Project; import com.cloud.projects.Project.ListProjectResourcesCriteria; import com.cloud.projects.ProjectInvitation; @@ -215,17 +220,18 @@ import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.StoragePoolTagVO; -import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; +import com.cloud.storage.VolumeApiServiceImpl; +import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.StoragePoolTagsDao; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; @@ -241,6 +247,7 @@ import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; 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; @@ -258,7 +265,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 org.apache.commons.lang3.StringUtils; @Component public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements QueryService, Configurable { @@ -445,6 +451,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(); @@ -654,6 +663,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(); @@ -665,6 +675,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); @@ -688,6 +729,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 @@ -733,6 +776,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; 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 d68987b4653..a4db864367f 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,10 +25,10 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; -import com.cloud.user.Account; -import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.framework.jobs.AsyncJob; +import com.cloud.user.Account; import com.cloud.utils.db.GenericDao; @Entity @@ -95,7 +95,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; @@ -192,7 +192,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 d94e7b28ca2..bf731e0dbd6 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 @@ -97,6 +97,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; @@ -165,6 +171,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 d954f715561..e1c02e16d53 100755 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -117,6 +117,7 @@ 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.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -269,7 +270,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 org.apache.commons.lang3.StringUtils; import com.google.common.collect.Sets; import com.googlecode.ipv6.IPv6Address; @@ -1390,6 +1390,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(); @@ -1897,6 +1898,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()); } @@ -2010,6 +2012,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)) { @@ -2095,6 +2098,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; } }); @@ -3028,6 +3033,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } CallContext.current().setEventDetails("Service offering id=" + serviceOffering.getId()); + CallContext.current().putContextParameter(ServiceOffering.class, serviceOffering.getId()); return serviceOffering; } else { return null; @@ -3451,6 +3457,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; @@ -5891,6 +5898,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; } 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..a177d8d556d 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", "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 dcd89fa5698..ccba7f54b52 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; @@ -1720,7 +1721,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 3a87cee0b11..8cb28664642 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -601,7 +601,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 @@ -3474,6 +3478,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; } }); @@ -4854,8 +4860,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 76086271001..0d13712679b 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 a29afa775e9..0ff82f54732 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 cd676aa6292..2512e9c5206 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; @@ -45,10 +47,9 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.offering.DiskOffering; -import com.cloud.server.ManagementServer; 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; @@ -209,6 +210,7 @@ import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcService; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpn.Site2SiteVpnManager; +import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.NetworkOfferingVO; @@ -216,6 +218,7 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; import com.cloud.serializer.GsonHelper; import com.cloud.server.ConfigurationServer; +import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ProvisioningType; @@ -274,8 +277,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. @@ -1247,7 +1248,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 4daca16be5b..63489a11c8a 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -65,6 +65,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; @@ -3861,10 +3862,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"); @@ -3888,10 +3889,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; @@ -3912,13 +3913,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); } @@ -3943,10 +3944,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 8c6d5104e2b..a8a8ec74243 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -33,13 +33,6 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; -import com.cloud.api.query.dao.ServiceOfferingJoinDao; -import com.cloud.api.query.vo.ServiceOfferingJoinVO; -import com.cloud.server.ManagementService; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.vm.DiskProfile; -import com.cloud.vm.UserVmDetailVO; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; @@ -102,6 +95,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.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.log4j.Logger; @@ -114,6 +108,8 @@ import com.cloud.agent.api.ModifyTargetsCommand; import com.cloud.agent.api.to.DataTO; import com.cloud.agent.api.to.DiskTO; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.dao.ServiceOfferingJoinDao; +import com.cloud.api.query.vo.ServiceOfferingJoinVO; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.Resource.ResourceType; @@ -142,8 +138,11 @@ import com.cloud.offering.DiskOffering; import com.cloud.org.Grouping; import com.cloud.resource.ResourceState; import com.cloud.serializer.GsonHelper; +import com.cloud.server.ManagementService; import com.cloud.server.ResourceTag; import com.cloud.server.TaggedResourceService; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.dao.DiskOfferingDao; @@ -183,6 +182,8 @@ import com.cloud.utils.db.UUIDManager; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; +import com.cloud.vm.DiskProfile; +import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmService; import com.cloud.vm.UserVmVO; @@ -207,7 +208,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 org.apache.commons.lang3.StringUtils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; @@ -593,6 +593,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 @@ -908,7 +909,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); 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 207cf5d7623..961c0422048 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,8 +61,11 @@ 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.CollectionUtils; 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 { @@ -561,7 +562,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); } @@ -1525,6 +1526,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 af4c16154dd..a9c402c86be 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 bd324787ac2..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.lang3.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 3c70a2e7a0f..c8b6cfdae40 100755 --- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java @@ -325,6 +325,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"); @@ -351,6 +352,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"); @@ -1933,6 +1935,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 664bb1a4992..2945580effe 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -40,7 +40,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; @@ -52,6 +51,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; @@ -74,6 +74,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; @@ -159,6 +160,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; @@ -186,7 +188,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); @@ -1194,6 +1195,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); @@ -2363,7 +2365,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... } @@ -2502,7 +2504,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 549f1642978..899f27d79af 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; @@ -741,7 +742,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 { @@ -2559,7 +2560,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 41c4d491a22..aea16523d9f 100644 --- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -454,6 +454,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; } }); @@ -513,7 +514,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()); } @@ -539,7 +544,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 dff79b13599..fc2a7e86160 100644 --- a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java @@ -148,7 +148,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 e28f2f76621..1a60b66d9d8 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; @@ -62,31 +86,12 @@ import com.cloud.user.dao.UserDao; import com.cloud.utils.Pair; 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.commons.lang3.StringUtils; -import org.apache.log4j.Logger; /** * @since 4.11 @@ -146,9 +151,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; @@ -188,6 +224,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); @@ -210,6 +247,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) { @@ -222,6 +270,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); 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 f4430d18c90..387bd8a4e23 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; @@ -111,7 +113,6 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; -import org.apache.commons.lang3.StringUtils; import com.google.gson.Gson; public class BackupManagerImpl extends ManagerBase implements BackupManager { @@ -944,7 +945,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"); @@ -959,7 +962,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 5ee837b71c2..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 org.apache.commons.lang3.StringUtils; 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; 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 855ca81c2ab..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 org.apache.commons.lang3.StringUtils; 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 { @@ -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; 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..e0093743845 --- /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", Account.Type.NORMAL, "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..6a4a324f606 --- /dev/null +++ b/server/src/test/java/com/cloud/event/ActionEventInterceptorTest.java @@ -0,0 +1,320 @@ +// 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.Account; +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", Account.Type.NORMAL, "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 622810f343e..e541f2a8be6 100644 --- a/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java +++ b/server/src/test/java/com/cloud/event/ActionEventUtilsTest.java @@ -25,10 +25,10 @@ import java.util.UUID; import javax.inject.Inject; -import com.cloud.user.Account; -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; @@ -43,11 +43,13 @@ 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.Account; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserVO; @@ -56,6 +58,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; @@ -72,6 +75,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<>(); @@ -98,6 +102,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 @@ -154,6 +161,7 @@ public class ActionEventUtilsTest { Field id = event.getClass().getDeclaredField("id"); id.setAccessible(true); id.set(event, EVENT_ID); + persistedEvents.add(event); return event; } }); @@ -167,6 +175,14 @@ public class ActionEventUtilsTest { } }).when(eventBus).publish(Mockito.any(Event.class)); + + account = new AccountVO("testaccount", 1L, "networkdomain", Account.Type.NORMAL, "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); } /** @@ -193,14 +209,6 @@ public class ActionEventUtilsTest { @Test public void testPopulateFirstClassEntities() { - AccountVO account = new AccountVO("testaccount", 1L, "networkdomain", Account.Type.NORMAL, "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 @@ -209,7 +217,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); @@ -227,4 +235,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..3d983280212 --- /dev/null +++ b/server/src/test/java/com/cloud/resourceicon/ResourceIconManagerImplTest.java @@ -0,0 +1,133 @@ +// 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.Account; +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", Account.Type.NORMAL, "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..fb36e0f7962 --- /dev/null +++ b/server/src/test/java/org/apache/cloudstack/annotation/AnnotationManagerImplTest.java @@ -0,0 +1,193 @@ +// 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.Account; +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", Account.Type.NORMAL, "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..352771443b2 --- /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 + ) + virtual_machine.stop(self.apiclient) + account_network.restart(self.apiclient, cleanup=False) + 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 f56bb0ba294..2ec4c84a562 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -641,6 +641,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", @@ -870,6 +871,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", @@ -1933,6 +1935,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", @@ -2227,6 +2230,7 @@ "label.systemmemoryused": "Used System Memory", "label.systemmemoryvirtualsize": "Virtual Total Process Size", "label.systemtotalcpucycles": "Total CPU capacity for all cores in MHz", +"label.systemvm": "System VM", "label.systemvmtype": "System VM Type", "label.tag.key": "Tag Key", "label.tag.value": "Tag Value", @@ -2414,6 +2418,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..66f8ae7fcd2 --- /dev/null +++ b/ui/src/components/view/EventsTab.vue @@ -0,0 +1,171 @@ +// 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 014b4d5c12a..4c4516f905c 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -366,6 +366,12 @@ +
+
{{ $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: { @@ -833,6 +841,9 @@ export default { return this.resource.icon.base64image } return null + }, + routeFromResourceType () { + return this.$getRouteFromResourceType(this.resource.resourcetype) } }, methods: { diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index 4822abfe24c..292460541a6 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -268,6 +268,9 @@ {{ text }} + diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue index ac1961b841a..b8eb0c307b7 100644 --- a/ui/src/components/view/SearchView.vue +++ b/ui/src/components/view/SearchView.vue @@ -105,6 +105,14 @@
+
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') @@ -558,6 +584,7 @@ export default { this.formRef.value.validate().then(() => { const values = toRaw(this.form) 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 283e216cb2f..47f199b2cf5 100644 --- a/ui/src/components/view/TreeView.vue +++ b/ui/src/components/view/TreeView.vue @@ -64,6 +64,15 @@ + +
+ + + + {{ resourceType }} + {{ resourceName || resourceId }} + {{ resourceName || resourceId }} +
+ + + diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js index f1d67cfc3f7..4de0cc6f5a4 100644 --- a/ui/src/config/section/account.js +++ b/ui/src/config/section/account.js @@ -53,6 +53,12 @@ export default { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/SettingsTab.vue'))), show: () => { return 'listConfigurations' in store.getters.apis } + }, + { + name: 'events', + resourceType: 'Account', + component: shallowRef(defineAsyncComponent(() => 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 96766333bf4..b11a2b3818c 100644 --- a/ui/src/config/section/domain.js +++ b/ui/src/config/section/domain.js @@ -57,7 +57,14 @@ export default { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/SettingsTab.vue'))), show: () => { return 'listConfigurations' in store.getters.apis } - }, { + }, + { + name: 'events', + resourceType: 'Domain', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, + { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) } diff --git a/ui/src/config/section/event.js b/ui/src/config/section/event.js index 5f8dd8f3dfe..4673a64ad0d 100644 --- a/ui/src/config/section/event.js +++ b/ui/src/config/section/event.js @@ -21,9 +21,9 @@ export default { icon: 'ScheduleOutlined', 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 7a4feaa7271..bf56bcea023 100644 --- a/ui/src/config/section/image.js +++ b/ui/src/config/section/image.js @@ -69,6 +69,12 @@ export default { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailSettings'))) }, + { + name: 'events', + resourceType: 'Template', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) @@ -203,6 +209,12 @@ export default { name: 'zones', component: shallowRef(defineAsyncComponent(() => import('@/views/image/IsoZones.vue'))) }, + { + name: 'events', + resourceType: 'Iso', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/pods.js b/ui/src/config/section/infra/pods.js index 9128cc9fcb6..70674ac7fbb 100644 --- a/ui/src/config/section/infra/pods.js +++ b/ui/src/config/section/infra/pods.js @@ -16,6 +16,8 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' + export default { name: 'pod', title: 'label.pods', @@ -39,6 +41,11 @@ export default { }, { name: 'resources', component: shallowRef(defineAsyncComponent(() => import('@/views/infra/Resources.vue'))) + }, { + name: 'events', + resourceType: 'Pod', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/primaryStorages.js b/ui/src/config/section/infra/primaryStorages.js index b889f72a4d7..ff5bb41be65 100644 --- a/ui/src/config/section/infra/primaryStorages.js +++ b/ui/src/config/section/infra/primaryStorages.js @@ -47,6 +47,11 @@ export default { }, { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/SettingsTab.vue'))) + }, { + name: 'events', + resourceType: 'StoragePool', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/routers.js b/ui/src/config/section/infra/routers.js index cf5145637ed..4c66d273f3e 100644 --- a/ui/src/config/section/infra/routers.js +++ b/ui/src/config/section/infra/routers.js @@ -16,6 +16,7 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' export default { name: 'router', @@ -42,6 +43,11 @@ export default { name: 'router.health.checks', show: (record, route, user) => { return ['Running'].includes(record.state) && ['Admin'].includes(user.roletype) }, component: shallowRef(defineAsyncComponent(() => import('@views/infra/routers/RouterHealthCheck.vue'))) + }, { + name: 'events', + resourceType: 'DomainRouter', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/secondaryStorages.js b/ui/src/config/section/infra/secondaryStorages.js index 5dff731b9d2..93c54dc1d79 100644 --- a/ui/src/config/section/infra/secondaryStorages.js +++ b/ui/src/config/section/infra/secondaryStorages.js @@ -48,6 +48,11 @@ export default { }, { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/SettingsTab.vue'))) + }, { + name: 'events', + resourceType: 'ImageStore', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/systemVms.js b/ui/src/config/section/infra/systemVms.js index 9808f72fa51..1de07fa04ef 100644 --- a/ui/src/config/section/infra/systemVms.js +++ b/ui/src/config/section/infra/systemVms.js @@ -16,6 +16,7 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' export default { name: 'systemvm', @@ -31,6 +32,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'SystemVm', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/infra/zones.js b/ui/src/config/section/infra/zones.js index 3b7ca990866..d6208586092 100644 --- a/ui/src/config/section/infra/zones.js +++ b/ui/src/config/section/infra/zones.js @@ -70,6 +70,11 @@ export default { }, { name: 'settings', component: shallowRef(defineAsyncComponent(() => import('@/components/view/SettingsTab.vue'))) + }, { + name: 'events', + resourceType: 'Zone', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index 2421c024c87..0c32a7c482b 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -76,6 +76,12 @@ export default { component: shallowRef(defineAsyncComponent(() => import('@/views/network/NetworkPermissions.vue'))), show: (record, route, user) => { return 'listNetworkPermissions' in store.getters.apis && record.acltype === 'Account' && !('vpcid' in record) && (['Admin', 'DomainAdmin'].includes(user.roletype) || record.account === user.account) } }, + { + name: 'events', + resourceType: 'Network', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) @@ -313,6 +319,12 @@ export default { component: shallowRef(defineAsyncComponent(() => import('@/views/network/VpnDetails.vue'))), show: (record) => { return record.issourcenat } }, + { + name: 'events', + resourceType: 'IpAddress', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/project.js b/ui/src/config/section/project.js index 7a9ec6e8672..a8f5335df97 100644 --- a/ui/src/config/section/project.js +++ b/ui/src/config/section/project.js @@ -54,6 +54,12 @@ export default { name: 'limits', show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) }, component: shallowRef(defineAsyncComponent(() => import('@/components/view/ResourceLimitTab.vue'))) + }, + { + name: 'events', + resourceType: 'Project', + component: shallowRef(defineAsyncComponent(() => 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 338dc14b43d..03688ff0002 100644 --- a/ui/src/config/section/storage.js +++ b/ui/src/config/section/storage.js @@ -68,6 +68,12 @@ export default { name: 'details', component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) }, + { + name: 'events', + resourceType: 'Volume', + component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))), + show: () => { return 'listEvents' in store.getters.apis } + }, { name: 'comments', component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue'))) diff --git a/ui/src/config/section/user.js b/ui/src/config/section/user.js index cbd0a55f6ad..e17e998179e 100644 --- a/ui/src/config/section/user.js +++ b/ui/src/config/section/user.js @@ -16,6 +16,7 @@ // under the License. import { shallowRef, defineAsyncComponent } from 'vue' +import store from '@/store' export default { name: 'accountuser', @@ -26,6 +27,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: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue'))) + }, + { + name: 'events', + resourceType: 'User', + component: shallowRef(defineAsyncComponent(() => 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 03bb602daf6..0a62bce8df2 100644 --- a/ui/src/utils/plugins.js +++ b/ui/src/utils/plugins.js @@ -354,6 +354,60 @@ export const resourceTypePlugin = { return type } } + + app.config.globalProperties.$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 '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 '' + } + + app.config.globalProperties.$getIconFromResourceType = function (resourceType) { + var routePath = this.$getRouteFromResourceType(resourceType) + if (!routePath) return '' + var route = this.$router.resolve('/' + routePath) + return route?.meta?.icon || '' + } } } diff --git a/ui/src/views/compute/InstanceTab.vue b/ui/src/views/compute/InstanceTab.vue index 90639ceb846..78751d3df3a 100644 --- a/ui/src/views/compute/InstanceTab.vue +++ b/ui/src/views/compute/InstanceTab.vue @@ -139,6 +139,9 @@ + + + {{ $toLocaleDate(event.created) }}
{{ event.type }}
+ ({{ event.username }}) {{ event.description }} @@ -133,12 +134,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/network/VpcTab.vue b/ui/src/views/network/VpcTab.vue index d3482fa17e5..e8b0c13314a 100644 --- a/ui/src/views/network/VpcTab.vue +++ b/ui/src/views/network/VpcTab.vue @@ -354,6 +354,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";