mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-874: Ability to delete Events and Alerts
This feature will provide the functionality to delete or archive the Alerts/Events. Delete or archive alerts APIs are available only for root-admin, delete or archive events are available for regular users.
This commit is contained in:
		
							parent
							
								
									bd4508589b
								
							
						
					
					
						commit
						f539f40e35
					
				| @ -30,4 +30,5 @@ public interface Alert extends Identity, InternalIdentity { | ||||
|     Date getCreatedDate(); | ||||
|     Date getLastSent(); | ||||
|     Date getResolved(); | ||||
|     boolean getArchived(); | ||||
| } | ||||
|  | ||||
| @ -40,4 +40,5 @@ public interface Event extends ControlledEntity, Identity, InternalIdentity { | ||||
|     String getLevel(); | ||||
|     long getStartId(); | ||||
|     String getParameters(); | ||||
|     boolean getArchived(); | ||||
| } | ||||
|  | ||||
| @ -29,6 +29,8 @@ import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd; | ||||
| import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; | ||||
| import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd; | ||||
| import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd; | ||||
| import org.apache.cloudstack.api.command.admin.resource.ArchiveAlertsCmd; | ||||
| import org.apache.cloudstack.api.command.admin.resource.DeleteAlertsCmd; | ||||
| import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd; | ||||
| import org.apache.cloudstack.api.command.admin.resource.ListCapacityCmd; | ||||
| import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd; | ||||
| @ -40,12 +42,12 @@ import org.apache.cloudstack.api.command.admin.systemvm.UpgradeSystemVMCmd; | ||||
| import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd; | ||||
| import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd; | ||||
| import org.apache.cloudstack.api.command.user.config.ListCapabilitiesCmd; | ||||
| import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd; | ||||
| import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd; | ||||
| import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd; | ||||
| import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd; | ||||
| import org.apache.cloudstack.api.command.user.iso.ListIsosCmd; | ||||
| import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd; | ||||
| import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd; | ||||
| import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd; | ||||
| import org.apache.cloudstack.api.command.user.ssh.CreateSSHKeyPairCmd; | ||||
| import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd; | ||||
| import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd; | ||||
| @ -55,12 +57,10 @@ import org.apache.cloudstack.api.command.user.template.UpdateTemplateCmd; | ||||
| import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd; | ||||
| import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd; | ||||
| import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd; | ||||
| import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd; | ||||
| 
 | ||||
| import com.cloud.alert.Alert; | ||||
| import com.cloud.capacity.Capacity; | ||||
| import com.cloud.configuration.Configuration; | ||||
| import com.cloud.dc.DataCenter; | ||||
| import com.cloud.dc.Pod; | ||||
| import com.cloud.dc.Vlan; | ||||
| import com.cloud.domain.Domain; | ||||
| @ -72,8 +72,6 @@ import com.cloud.host.Host; | ||||
| import com.cloud.hypervisor.Hypervisor.HypervisorType; | ||||
| import com.cloud.hypervisor.HypervisorCapabilities; | ||||
| import com.cloud.network.IpAddress; | ||||
| import com.cloud.offering.DiskOffering; | ||||
| import com.cloud.offering.ServiceOffering; | ||||
| import com.cloud.org.Cluster; | ||||
| import com.cloud.storage.GuestOS; | ||||
| import com.cloud.storage.GuestOsCategory; | ||||
| @ -194,6 +192,34 @@ public interface ManagementService { | ||||
|      */ | ||||
|     Pair<List<? extends Alert>, Integer> searchForAlerts(ListAlertsCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * Archive alerts | ||||
|      * @param cmd | ||||
|      * @return True on success. False otherwise. | ||||
|      */ | ||||
|     boolean archiveAlerts(ArchiveAlertsCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * Delete alerts | ||||
|      * @param cmd | ||||
|      * @return True on success. False otherwise. | ||||
|      */ | ||||
|     boolean deleteAlerts(DeleteAlertsCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * Archive events | ||||
|      * @param cmd | ||||
|      * @return True on success. False otherwise. | ||||
|      */ | ||||
|     boolean archiveEvents(ArchiveEventsCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * Delete events | ||||
|      * @param cmd | ||||
|      * @return True on success. False otherwise. | ||||
|      */ | ||||
|     boolean deleteEvents(DeleteEventsCmd cmd); | ||||
| 
 | ||||
|     /** | ||||
|      * list all the capacity rows in capacity operations table | ||||
|      * | ||||
|  | ||||
| @ -459,6 +459,7 @@ public class ApiConstants { | ||||
|     public static final String UCS_BLADE_DN = "bladedn"; | ||||
|     public static final String UCS_BLADE_ID = "bladeid"; | ||||
|     public static final String VM_GUEST_IP = "vmguestip"; | ||||
|     public static final String OLDER_THAN = "olderthan"; | ||||
| 
 | ||||
|     public enum HostDetails { | ||||
|         all, capacity, events, stats, min; | ||||
|  | ||||
| @ -0,0 +1,100 @@ | ||||
| // 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.command.admin.resource; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.APICommand; | ||||
| 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.response.AlertResponse; | ||||
| import org.apache.cloudstack.api.response.ConditionResponse; | ||||
| import org.apache.cloudstack.api.response.SuccessResponse; | ||||
| import org.apache.log4j.Logger; | ||||
| 
 | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.user.Account; | ||||
| 
 | ||||
| @APICommand(name = "archiveAlerts", description = "Archive one or more alerts.", responseObject = SuccessResponse.class) | ||||
| public class ArchiveAlertsCmd extends BaseCmd { | ||||
| 
 | ||||
|     public static final Logger s_logger = Logger.getLogger(ArchiveAlertsCmd.class.getName()); | ||||
| 
 | ||||
|     private static final String s_name = "archivealertsresponse"; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ////////////// API parameters ///////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = AlertResponse.class, | ||||
|             description = "the IDs of the alerts") | ||||
|     private List<Long> ids; | ||||
| 
 | ||||
|     @Parameter(name=ApiConstants.OLDER_THAN, type=CommandType.DATE, description="archive alerts older than this date (use format \"yyyy-MM-dd\")") | ||||
|     private Date olderThan; | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "archive by alert type") | ||||
|     private String type; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////////// Accessors /////////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     public List<Long> getIds() { | ||||
|         return ids; | ||||
|     } | ||||
| 
 | ||||
|     public Date getOlderThan() { | ||||
|         return olderThan; | ||||
|     } | ||||
| 
 | ||||
|     public String getType() { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////// API Implementation/////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Override | ||||
|     public String getCommandName() { | ||||
|         return s_name; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public long getEntityOwnerId() { | ||||
|         return Account.ACCOUNT_ID_SYSTEM; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void execute() { | ||||
|         if(ids == null && type == null && olderThan == null) { | ||||
|             throw new InvalidParameterValueException("either ids, type or olderthan must be specified"); | ||||
|         } | ||||
|         boolean result = _mgr.archiveAlerts(this); | ||||
|         if (result) { | ||||
|             SuccessResponse response = new SuccessResponse(getCommandName()); | ||||
|             this.setResponseObject(response); | ||||
|         } else { | ||||
|             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to archive Alerts, one or more parameters has invalid values"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,99 @@ | ||||
| // 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.command.admin.resource; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.APICommand; | ||||
| 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.response.AlertResponse; | ||||
| import org.apache.cloudstack.api.response.SuccessResponse; | ||||
| import org.apache.log4j.Logger; | ||||
| 
 | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.user.Account; | ||||
| 
 | ||||
| @APICommand(name = "deleteAlerts", description = "Delete one or more alerts.", responseObject = SuccessResponse.class) | ||||
| public class DeleteAlertsCmd extends BaseCmd { | ||||
| 
 | ||||
|     public static final Logger s_logger = Logger.getLogger(DeleteAlertsCmd.class.getName()); | ||||
| 
 | ||||
|     private static final String s_name = "deletealertsresponse"; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ////////////// API parameters ///////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.IDS, type = CommandType.LIST,  collectionType = CommandType.UUID, entityType = AlertResponse.class, | ||||
|             description = "the IDs of the alerts") | ||||
|     private List<Long> ids; | ||||
| 
 | ||||
|     @Parameter(name=ApiConstants.OLDER_THAN, type=CommandType.DATE, description="delete alerts older than (including) this date (use format \"yyyy-MM-dd\")") | ||||
|     private Date olderThan; | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "delete by alert type") | ||||
|     private String type; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////////// Accessors /////////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     public List<Long> getIds() { | ||||
|         return ids; | ||||
|     } | ||||
| 
 | ||||
|     public Date getOlderThan() { | ||||
|         return olderThan; | ||||
|     } | ||||
| 
 | ||||
|     public String getType() { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////// API Implementation/////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Override | ||||
|     public String getCommandName() { | ||||
|         return s_name; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public long getEntityOwnerId() { | ||||
|         return Account.ACCOUNT_ID_SYSTEM; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void execute() { | ||||
|         if(ids == null && type == null && olderThan == null) { | ||||
|             throw new InvalidParameterValueException("either ids, type or olderthan must be specified"); | ||||
|         } | ||||
|         boolean result = _mgr.deleteAlerts(this); | ||||
|         if (result) { | ||||
|             SuccessResponse response = new SuccessResponse(getCommandName()); | ||||
|             this.setResponseObject(response); | ||||
|         } else { | ||||
|             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to delete Alerts, one or more parameters has invalid values"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,105 @@ | ||||
| //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.command.user.event; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.APICommand; | ||||
| 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.response.AlertResponse; | ||||
| import org.apache.cloudstack.api.response.EventResponse; | ||||
| import org.apache.cloudstack.api.response.SuccessResponse; | ||||
| import org.apache.log4j.Logger; | ||||
| 
 | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.user.Account; | ||||
| import com.cloud.user.UserContext; | ||||
| 
 | ||||
| @APICommand(name = "archiveEvents", description = "Archive one or more events.", responseObject = SuccessResponse.class) | ||||
| public class ArchiveEventsCmd extends BaseCmd { | ||||
| 
 | ||||
|     public static final Logger s_logger = Logger.getLogger(ArchiveEventsCmd.class.getName()); | ||||
| 
 | ||||
|     private static final String s_name = "archiveeventsresponse"; | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////// | ||||
|     //////////////// API parameters ///////////////////// | ||||
|     ///////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.IDS, type = CommandType.LIST,  collectionType = CommandType.UUID, entityType = EventResponse.class, | ||||
|             description = "the IDs of the events") | ||||
|     private List<Long> ids; | ||||
| 
 | ||||
|     @Parameter(name=ApiConstants.OLDER_THAN, type=CommandType.DATE, description="archive events older than (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")") | ||||
|     private Date olderThan; | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "archive by event type") | ||||
|     private String type; | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////// | ||||
|     /////////////////// Accessors /////////////////////// | ||||
|     ///////////////////////////////////////////////////// | ||||
| 
 | ||||
|     public List<Long> getIds() { | ||||
|         return ids; | ||||
|     } | ||||
| 
 | ||||
|     public Date getOlderThan() { | ||||
|         return olderThan; | ||||
|     } | ||||
| 
 | ||||
|     public String getType() { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////// | ||||
|     /////////////// API Implementation/////////////////// | ||||
|     ///////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Override | ||||
|     public String getCommandName() { | ||||
|         return s_name; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public long getEntityOwnerId() { | ||||
|         Account account = UserContext.current().getCaller(); | ||||
|         if (account != null) { | ||||
|             return account.getId(); | ||||
|         } | ||||
|         return Account.ACCOUNT_ID_SYSTEM; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void execute() { | ||||
|         if(ids == null && type == null && olderThan == null) { | ||||
|             throw new InvalidParameterValueException("either ids, type or olderthan must be specified"); | ||||
|         } | ||||
|         boolean result = _mgr.archiveEvents(this); | ||||
|         if (result) { | ||||
|             SuccessResponse response = new SuccessResponse(getCommandName()); | ||||
|             this.setResponseObject(response); | ||||
|         } else { | ||||
|             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to archive Events, one or more parameters has invalid values"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,105 @@ | ||||
| //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.command.user.event; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.APICommand; | ||||
| 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.response.AlertResponse; | ||||
| import org.apache.cloudstack.api.response.EventResponse; | ||||
| import org.apache.cloudstack.api.response.SuccessResponse; | ||||
| import org.apache.log4j.Logger; | ||||
| 
 | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.user.Account; | ||||
| import com.cloud.user.UserContext; | ||||
| 
 | ||||
| @APICommand(name = "deleteEvents", description = "Delete one or more events.", responseObject = SuccessResponse.class) | ||||
| public class DeleteEventsCmd extends BaseCmd { | ||||
| 
 | ||||
|     public static final Logger s_logger = Logger.getLogger(DeleteEventsCmd.class.getName()); | ||||
| 
 | ||||
|     private static final String s_name = "deleteeventsresponse"; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ////////////// API parameters ///////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.IDS, type = CommandType.LIST,  collectionType = CommandType.UUID, entityType = EventResponse.class, | ||||
|             description = "the IDs of the events") | ||||
|     private List<Long> ids; | ||||
| 
 | ||||
|     @Parameter(name=ApiConstants.OLDER_THAN, type=CommandType.DATE, description="delete events older than (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")") | ||||
|     private Date olderThan; | ||||
| 
 | ||||
|     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "delete by event type") | ||||
|     private String type; | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////////// Accessors /////////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     public List<Long> getIds() { | ||||
|         return ids; | ||||
|     } | ||||
| 
 | ||||
|     public Date getOlderThan() { | ||||
|         return olderThan; | ||||
|     } | ||||
| 
 | ||||
|     public String getType() { | ||||
|         return type; | ||||
|     } | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////// | ||||
|     // ///////////// API Implementation/////////////////// | ||||
|     // /////////////////////////////////////////////////// | ||||
| 
 | ||||
|     @Override | ||||
|     public String getCommandName() { | ||||
|         return s_name; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public long getEntityOwnerId() { | ||||
|         Account account = UserContext.current().getCaller(); | ||||
|         if (account != null) { | ||||
|             return account.getId(); | ||||
|         } | ||||
|         return Account.ACCOUNT_ID_SYSTEM; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void execute() { | ||||
|         if(ids == null && type == null && olderThan == null) { | ||||
|             throw new InvalidParameterValueException("either ids, type or enddate must be specified"); | ||||
|         } | ||||
|         boolean result = _mgr.deleteEvents(this); | ||||
|         if (result) { | ||||
|             SuccessResponse response = new SuccessResponse(getCommandName()); | ||||
|             this.setResponseObject(response); | ||||
|         } else { | ||||
|             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to delete Events, one or more parameters has invalid values"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -218,9 +218,13 @@ listZones=15 | ||||
| #### events commands | ||||
| listEvents=15 | ||||
| listEventTypes=15 | ||||
| archiveEvents=15 | ||||
| deleteEvents=15 | ||||
| 
 | ||||
| #### alerts commands | ||||
| listAlerts=3 | ||||
| archiveAlerts=1 | ||||
| deleteAlerts=1 | ||||
| 
 | ||||
| #### system capacity commands | ||||
| listCapacity=3 | ||||
|  | ||||
| @ -28,9 +28,7 @@ import javax.persistence.Table; | ||||
| import javax.persistence.Temporal; | ||||
| import javax.persistence.TemporalType; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.Identity; | ||||
| import com.cloud.utils.db.GenericDao; | ||||
| import org.apache.cloudstack.api.InternalIdentity; | ||||
| 
 | ||||
| @Entity | ||||
| @Table(name="alert") | ||||
| @ -72,12 +70,15 @@ public class AlertVO implements Alert { | ||||
|     @Column(name="uuid") | ||||
|     private String uuid; | ||||
| 
 | ||||
|     @Column(name="archived") | ||||
|     private boolean archived; | ||||
| 
 | ||||
|     public AlertVO() { | ||||
|     	this.uuid = UUID.randomUUID().toString(); | ||||
|         this.uuid = UUID.randomUUID().toString(); | ||||
|     } | ||||
|     public AlertVO(Long id) { | ||||
|         this.id = id; | ||||
|     	this.uuid = UUID.randomUUID().toString(); | ||||
|         this.uuid = UUID.randomUUID().toString(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -103,12 +104,12 @@ public class AlertVO implements Alert { | ||||
|     } | ||||
| 
 | ||||
|     public Long getClusterId() { | ||||
| 		return clusterId; | ||||
| 	} | ||||
| 	public void setClusterId(Long clusterId) { | ||||
| 		this.clusterId = clusterId; | ||||
| 	} | ||||
| 	@Override | ||||
|         return clusterId; | ||||
|     } | ||||
|     public void setClusterId(Long clusterId) { | ||||
|         this.clusterId = clusterId; | ||||
|     } | ||||
|     @Override | ||||
|     public Long getPodId() { | ||||
|         return podId; | ||||
|     } | ||||
| @ -164,10 +165,19 @@ public class AlertVO implements Alert { | ||||
|      | ||||
|     @Override | ||||
|     public String getUuid() { | ||||
|     	return this.uuid; | ||||
|         return this.uuid; | ||||
|     } | ||||
| 
 | ||||
|     public void setUuid(String uuid) { | ||||
|     	this.uuid = uuid; | ||||
|         this.uuid = uuid; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean getArchived() { | ||||
|         return archived; | ||||
|     } | ||||
| 
 | ||||
|     public void setArchived(Boolean archived) { | ||||
|         this.archived = archived; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -29,74 +29,75 @@ import javax.persistence.Id; | ||||
| import javax.persistence.Table; | ||||
| import javax.persistence.Transient; | ||||
| 
 | ||||
| import org.apache.cloudstack.api.Identity; | ||||
| import com.cloud.utils.db.GenericDao; | ||||
| import org.apache.cloudstack.api.InternalIdentity; | ||||
| 
 | ||||
| @Entity | ||||
| @Table(name="event") | ||||
| public class EventVO implements Event { | ||||
| 	@Id | ||||
|     @Id | ||||
|     @GeneratedValue(strategy=GenerationType.IDENTITY) | ||||
|     @Column(name="id") | ||||
| 	private long id = -1; | ||||
|     private long id = -1; | ||||
| 
 | ||||
| 	@Column(name="type") | ||||
| 	private String type; | ||||
|     @Column(name="type") | ||||
|     private String type; | ||||
| 
 | ||||
| 	@Enumerated(value=EnumType.STRING) | ||||
| 	@Column(name="state") | ||||
|     @Enumerated(value=EnumType.STRING) | ||||
|     @Column(name="state") | ||||
|     private State state = State.Completed; | ||||
| 
 | ||||
| 	@Column(name="description", length=1024) | ||||
| 	private String description; | ||||
|     @Column(name="description", length=1024) | ||||
|     private String description; | ||||
| 
 | ||||
| 	@Column(name=GenericDao.CREATED_COLUMN) | ||||
| 	private Date createDate; | ||||
|     @Column(name=GenericDao.CREATED_COLUMN) | ||||
|     private Date createDate; | ||||
| 
 | ||||
|     @Column(name="user_id") | ||||
|     private long userId; | ||||
| 
 | ||||
| 	@Column(name="account_id") | ||||
| 	private long accountId; | ||||
|     @Column(name="account_id") | ||||
|     private long accountId; | ||||
| 
 | ||||
|     @Column(name="domain_id") | ||||
|     private long domainId; | ||||
| 
 | ||||
| 	@Column(name="level") | ||||
| 	private String level = LEVEL_INFO; | ||||
|     @Column(name="level") | ||||
|     private String level = LEVEL_INFO; | ||||
| 
 | ||||
| 	@Column(name="start_id") | ||||
|     @Column(name="start_id") | ||||
|     private long startId; | ||||
| 
 | ||||
| 	@Column(name="parameters", length=1024) | ||||
| 	private String parameters; | ||||
|     @Column(name="parameters", length=1024) | ||||
|     private String parameters; | ||||
| 
 | ||||
| 	@Column(name="uuid") | ||||
| 	private String uuid; | ||||
|     @Column(name="uuid") | ||||
|     private String uuid; | ||||
| 
 | ||||
| 	@Transient | ||||
| 	private int totalSize; | ||||
|     @Column(name="archived") | ||||
|     private boolean archived; | ||||
| 
 | ||||
| 	public static final String LEVEL_INFO = "INFO"; | ||||
| 	public static final String LEVEL_WARN = "WARN"; | ||||
| 	public static final String LEVEL_ERROR = "ERROR"; | ||||
|     @Transient | ||||
|     private int totalSize; | ||||
| 
 | ||||
| 	public EventVO() { | ||||
| 		this.uuid = UUID.randomUUID().toString(); | ||||
| 	} | ||||
|     public static final String LEVEL_INFO = "INFO"; | ||||
|     public static final String LEVEL_WARN = "WARN"; | ||||
|     public static final String LEVEL_ERROR = "ERROR"; | ||||
| 
 | ||||
| 	public long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
| 	@Override | ||||
|     public EventVO() { | ||||
|         this.uuid = UUID.randomUUID().toString(); | ||||
|     } | ||||
| 
 | ||||
|     public long getId() { | ||||
|         return id; | ||||
|     } | ||||
|     @Override | ||||
|     public String getType() { | ||||
| 		return type; | ||||
| 	} | ||||
| 	public void setType(String type) { | ||||
| 		this.type = type; | ||||
| 	} | ||||
| 	@Override | ||||
|         return type; | ||||
|     } | ||||
|     public void setType(String type) { | ||||
|         this.type = type; | ||||
|     } | ||||
|     @Override | ||||
|     public State getState() { | ||||
|         return state; | ||||
|     } | ||||
| @ -105,27 +106,27 @@ public class EventVO implements Event { | ||||
|         this.state = state; | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
|     @Override | ||||
|     public String getDescription() { | ||||
| 		return description; | ||||
| 	} | ||||
| 	public void setDescription(String description) { | ||||
| 		this.description = description; | ||||
| 	} | ||||
| 	@Override | ||||
|         return description; | ||||
|     } | ||||
|     public void setDescription(String description) { | ||||
|         this.description = description; | ||||
|     } | ||||
|     @Override | ||||
|     public Date getCreateDate() { | ||||
| 		return createDate; | ||||
| 	} | ||||
| 	public void setCreatedDate(Date createdDate) { | ||||
| 	    createDate = createdDate; | ||||
| 	} | ||||
| 	@Override | ||||
|         return createDate; | ||||
|     } | ||||
|     public void setCreatedDate(Date createdDate) { | ||||
|         createDate = createdDate; | ||||
|     } | ||||
|     @Override | ||||
|     public long getUserId() { | ||||
| 		return userId; | ||||
| 	} | ||||
| 	public void setUserId(long userId) { | ||||
| 		this.userId = userId; | ||||
| 	} | ||||
|         return userId; | ||||
|     } | ||||
|     public void setUserId(long userId) { | ||||
|         this.userId = userId; | ||||
|     } | ||||
|     @Override | ||||
|     public long getAccountId() { | ||||
|         return accountId; | ||||
| @ -165,21 +166,29 @@ public class EventVO implements Event { | ||||
|         this.startId = startId; | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
|     @Override | ||||
|     public String getParameters() { | ||||
| 		return parameters; | ||||
| 	} | ||||
| 	public void setParameters(String parameters) { | ||||
| 		this.parameters = parameters; | ||||
| 	} | ||||
|         return parameters; | ||||
|     } | ||||
|     public void setParameters(String parameters) { | ||||
|         this.parameters = parameters; | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
| 	public String getUuid() { | ||||
| 		return this.uuid; | ||||
| 	} | ||||
|     @Override | ||||
|     public String getUuid() { | ||||
|         return this.uuid; | ||||
|     } | ||||
| 
 | ||||
| 	public void setUuid(String uuid) { | ||||
| 		this.uuid = uuid; | ||||
| 	} | ||||
|     public void setUuid(String uuid) { | ||||
|         this.uuid = uuid; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean getArchived() { | ||||
|         return archived; | ||||
|     } | ||||
| 
 | ||||
|     public void setArchived(Boolean archived) { | ||||
|         this.archived = archived; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -30,4 +30,9 @@ public interface EventDao extends GenericDao<EventVO, Long> { | ||||
|     public List<EventVO> listOlderEvents(Date oldTime); | ||||
| 
 | ||||
|     EventVO findCompletedEvent(long startId); | ||||
| 
 | ||||
|     public List<EventVO> listToArchiveOrDeleteEvents(List<Long> ids, String type, Date olderThan, Long accountId); | ||||
| 
 | ||||
|     public void archiveEvents(List<EventVO> events); | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -30,24 +30,34 @@ import com.cloud.utils.db.Filter; | ||||
| import com.cloud.utils.db.GenericDaoBase; | ||||
| import com.cloud.utils.db.SearchBuilder; | ||||
| import com.cloud.utils.db.SearchCriteria; | ||||
| import com.cloud.utils.db.Transaction; | ||||
| import com.cloud.utils.db.SearchCriteria.Op; | ||||
| 
 | ||||
| @Component | ||||
| @Local(value={EventDao.class}) | ||||
| public class EventDaoImpl extends GenericDaoBase<EventVO, Long> implements EventDao { | ||||
| 	public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName()); | ||||
| 	protected final SearchBuilder<EventVO> CompletedEventSearch; | ||||
|     public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName()); | ||||
|     protected final SearchBuilder<EventVO> CompletedEventSearch; | ||||
|     protected final SearchBuilder<EventVO> ToArchiveOrDeleteEventSearch; | ||||
| 
 | ||||
| 	public EventDaoImpl () { | ||||
| 	    CompletedEventSearch = createSearchBuilder(); | ||||
| 	    CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ); | ||||
| 	    CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ); | ||||
| 	    CompletedEventSearch.done(); | ||||
| 	} | ||||
|     public EventDaoImpl () { | ||||
|         CompletedEventSearch = createSearchBuilder(); | ||||
|         CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ); | ||||
|         CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ); | ||||
|         CompletedEventSearch.done(); | ||||
| 
 | ||||
| 	@Override | ||||
| 	public List<EventVO> searchAllEvents(SearchCriteria<EventVO> sc, Filter filter) { | ||||
| 	    return listIncludingRemovedBy(sc, filter); | ||||
| 	} | ||||
|         ToArchiveOrDeleteEventSearch = createSearchBuilder(); | ||||
|         ToArchiveOrDeleteEventSearch.and("id", ToArchiveOrDeleteEventSearch.entity().getId(), Op.IN); | ||||
|         ToArchiveOrDeleteEventSearch.and("type", ToArchiveOrDeleteEventSearch.entity().getType(), Op.EQ); | ||||
|         ToArchiveOrDeleteEventSearch.and("accountId", ToArchiveOrDeleteEventSearch.entity().getAccountId(), Op.EQ); | ||||
|         ToArchiveOrDeleteEventSearch.and("createDateL", ToArchiveOrDeleteEventSearch.entity().getCreateDate(), Op.LT); | ||||
|         ToArchiveOrDeleteEventSearch.done(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<EventVO> searchAllEvents(SearchCriteria<EventVO> sc, Filter filter) { | ||||
|         return listIncludingRemovedBy(sc, filter); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<EventVO> listOlderEvents(Date oldTime) { | ||||
| @ -55,7 +65,6 @@ public class EventDaoImpl extends GenericDaoBase<EventVO, Long> implements Event | ||||
|         SearchCriteria<EventVO> sc = createSearchCriteria(); | ||||
|         sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); | ||||
|         return listIncludingRemovedBy(sc, null); | ||||
|          | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -65,4 +74,36 @@ public class EventDaoImpl extends GenericDaoBase<EventVO, Long> implements Event | ||||
|         sc.setParameters("startId", startId); | ||||
|         return findOneIncludingRemovedBy(sc); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<EventVO> listToArchiveOrDeleteEvents(List<Long> ids, String type, Date olderThan, Long accountId) { | ||||
|         SearchCriteria<EventVO> sc = ToArchiveOrDeleteEventSearch.create(); | ||||
|         if (ids != null) { | ||||
|             sc.setParameters("id", ids.toArray(new Object[ids.size()])); | ||||
|         } | ||||
|         if (type != null) { | ||||
|             sc.setParameters("type", type); | ||||
|         } | ||||
|         if (olderThan != null) { | ||||
|             sc.setParameters("createDateL", olderThan); | ||||
|         } | ||||
|         if (accountId != null) { | ||||
|             sc.setParameters("accountId", accountId); | ||||
|         } | ||||
|         return search(sc, null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void archiveEvents(List<EventVO> events) { | ||||
| 
 | ||||
|         Transaction txn = Transaction.currentTxn(); | ||||
|         txn.start(); | ||||
|         for (EventVO event : events) { | ||||
|             event = lockRow(event.getId(), true); | ||||
|             event.setArchived(true); | ||||
|             update(event.getId(), event); | ||||
|             txn.commit(); | ||||
|         } | ||||
|         txn.close(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -16,6 +16,9 @@ | ||||
| // under the License. | ||||
| package com.cloud.alert.dao; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.cloud.alert.AlertVO; | ||||
| import com.cloud.utils.db.GenericDao; | ||||
| 
 | ||||
| @ -23,4 +26,8 @@ public interface AlertDao extends GenericDao<AlertVO, Long> { | ||||
|     AlertVO getLastAlert(short type, long dataCenterId, Long podId, Long clusterId); | ||||
|     // This is for backward compatibility | ||||
|     AlertVO getLastAlert(short type, long dataCenterId, Long podId); | ||||
| 
 | ||||
|     public boolean deleteAlert(List<Long> Ids, String type, Date olderThan, Long zoneId); | ||||
|     public boolean archiveAlert(List<Long> Ids, String type, Date olderThan, Long zoneId); | ||||
|     public List<AlertVO> listOlderAlerts(Date oldTime); | ||||
| } | ||||
|  | ||||
| @ -16,6 +16,7 @@ | ||||
| // under the License. | ||||
| package com.cloud.alert.dao; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import javax.ejb.Local; | ||||
| @ -25,11 +26,26 @@ import org.springframework.stereotype.Component; | ||||
| import com.cloud.alert.AlertVO; | ||||
| import com.cloud.utils.db.Filter; | ||||
| import com.cloud.utils.db.GenericDaoBase; | ||||
| import com.cloud.utils.db.SearchBuilder; | ||||
| import com.cloud.utils.db.SearchCriteria; | ||||
| import com.cloud.utils.db.SearchCriteria.Op; | ||||
| import com.cloud.utils.db.Transaction; | ||||
| 
 | ||||
| @Component | ||||
| @Local(value = { AlertDao.class }) | ||||
| public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> implements AlertDao { | ||||
| 
 | ||||
|     protected final SearchBuilder<AlertVO> AlertSearchByIdsAndType; | ||||
| 
 | ||||
|     public AlertDaoImpl() { | ||||
|         AlertSearchByIdsAndType = createSearchBuilder(); | ||||
|         AlertSearchByIdsAndType.and("id", AlertSearchByIdsAndType.entity().getId(), Op.IN); | ||||
|         AlertSearchByIdsAndType.and("type", AlertSearchByIdsAndType.entity().getType(), Op.EQ); | ||||
|         AlertSearchByIdsAndType.and("createdDateL", AlertSearchByIdsAndType.entity().getCreatedDate(), Op.LT); | ||||
|         AlertSearchByIdsAndType.and("data_center_id", AlertSearchByIdsAndType.entity().getDataCenterId(), Op.EQ); | ||||
|         AlertSearchByIdsAndType.done(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public AlertVO getLastAlert(short type, long dataCenterId, Long podId, Long clusterId) { | ||||
|         Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1)); | ||||
| @ -68,4 +84,73 @@ public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> implements Alert | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean archiveAlert(List<Long> Ids, String type, Date olderThan, Long zoneId) { | ||||
|         SearchCriteria<AlertVO> sc = AlertSearchByIdsAndType.create(); | ||||
| 
 | ||||
|         if (Ids != null) { | ||||
|             sc.setParameters("id", Ids.toArray(new Object[Ids.size()])); | ||||
|         } | ||||
|         if(type != null) { | ||||
|             sc.setParameters("type", type); | ||||
|         } | ||||
|         if(zoneId != null) { | ||||
|             sc.setParameters("data_center_id", zoneId); | ||||
|         } | ||||
|         if(olderThan != null) { | ||||
|             sc.setParameters("createdDateL", olderThan); | ||||
|         } | ||||
|         boolean result = true;; | ||||
|         List<AlertVO> alerts = listBy(sc); | ||||
|         if (Ids != null && alerts.size() < Ids.size()) { | ||||
|             result = false; | ||||
|             return result; | ||||
|         } | ||||
|         Transaction txn = Transaction.currentTxn(); | ||||
|         txn.start(); | ||||
|         for (AlertVO alert : alerts) { | ||||
|             alert = lockRow(alert.getId(), true); | ||||
|             alert.setArchived(true); | ||||
|             update(alert.getId(), alert); | ||||
|             txn.commit(); | ||||
|         } | ||||
|         txn.close(); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean deleteAlert(List<Long> ids, String type, Date olderThan, Long zoneId) { | ||||
|         SearchCriteria<AlertVO> sc = AlertSearchByIdsAndType.create(); | ||||
| 
 | ||||
|         if (ids != null) { | ||||
|             sc.setParameters("id", ids.toArray(new Object[ids.size()])); | ||||
|         } | ||||
|         if(type != null) { | ||||
|             sc.setParameters("type", type); | ||||
|         } | ||||
|         if(zoneId != null) { | ||||
|             sc.setParameters("data_center_id", zoneId); | ||||
|         } | ||||
|         if(olderThan != null) { | ||||
|             sc.setParameters("createdDateL", olderThan); | ||||
|         } | ||||
|         boolean result = true; | ||||
|         List<AlertVO> alerts = listBy(sc); | ||||
|         if (ids != null && alerts.size() < ids.size()) { | ||||
|             result = false; | ||||
|             return result; | ||||
|         } | ||||
|         remove(sc); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<AlertVO> listOlderAlerts(Date oldTime) { | ||||
|         if (oldTime == null) return null; | ||||
|         SearchCriteria<AlertVO> sc = createSearchCriteria(); | ||||
|         sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); | ||||
|         return listIncludingRemovedBy(sc, null); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -50,6 +50,8 @@ import org.apache.cloudstack.api.InternalIdentity; | ||||
| import org.apache.cloudstack.api.Parameter; | ||||
| import org.apache.cloudstack.api.ServerApiException; | ||||
| import org.apache.cloudstack.api.Validate; | ||||
| import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd; | ||||
| import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd; | ||||
| import org.apache.cloudstack.api.command.user.event.ListEventsCmd; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| @ -391,7 +393,7 @@ public class ApiDispatcher { | ||||
|                 // This piece of code is for maintaining backward compatibility | ||||
|                 // and support both the date formats(Bug 9724) | ||||
|                 // Do the date messaging for ListEventsCmd only | ||||
|                 if (cmdObj instanceof ListEventsCmd) { | ||||
|                 if (cmdObj instanceof ListEventsCmd || cmdObj instanceof DeleteEventsCmd || cmdObj instanceof ArchiveEventsCmd) { | ||||
|                     boolean isObjInNewDateFormat = isObjInNewDateFormat(paramObj.toString()); | ||||
|                     if (isObjInNewDateFormat) { | ||||
|                         DateFormat newFormat = BaseCmd.NEW_INPUT_FORMAT; | ||||
| @ -406,6 +408,8 @@ public class ApiDispatcher { | ||||
|                                 date = messageDate(date, 0, 0, 0); | ||||
|                             } else if (field.getName().equals("endDate")) { | ||||
|                                 date = messageDate(date, 23, 59, 59); | ||||
|                             } else if (field.getName().equals("olderThan")) { | ||||
|                                 date = messageDate(date, 0, 0, 0); | ||||
|                             } | ||||
|                             field.set(cmdObj, date); | ||||
|                         } | ||||
|  | ||||
| @ -397,6 +397,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { | ||||
|         sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); | ||||
|         sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); | ||||
|         sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); | ||||
|         sb.and("archived", sb.entity().getArchived(), SearchCriteria.Op.EQ); | ||||
| 
 | ||||
|         SearchCriteria<EventJoinVO> sc = sb.create(); | ||||
|         // building ACL condition | ||||
| @ -430,6 +431,8 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { | ||||
|             sc.setParameters("createDateL", endDate); | ||||
|         } | ||||
| 
 | ||||
|         sc.setParameters("archived", false); | ||||
| 
 | ||||
|         Pair<List<EventJoinVO>, Integer> eventPair = null; | ||||
|         // event_view will not have duplicate rows for each event, so searchAndCount should be good enough. | ||||
|         if ((entryTime != null) && (duration != null)) { | ||||
|  | ||||
| @ -104,6 +104,8 @@ public class EventJoinVO extends BaseViewVO implements ControlledViewEntity { | ||||
|     @Column(name="project_name") | ||||
|     private String projectName; | ||||
| 
 | ||||
|     @Column(name="archived") | ||||
|     private boolean archived; | ||||
| 
 | ||||
| 
 | ||||
|     public EventJoinVO() { | ||||
| @ -313,5 +315,12 @@ public class EventJoinVO extends BaseViewVO implements ControlledViewEntity { | ||||
|         this.parameters = parameters; | ||||
|     } | ||||
| 
 | ||||
|     public boolean getArchived() { | ||||
|         return archived; | ||||
|     } | ||||
| 
 | ||||
|     public void setArchived(Boolean archived) { | ||||
|         this.archived = archived; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -204,9 +204,10 @@ public enum Config { | ||||
| 	SecStorageSessionMax("Advanced", AgentManager.class, Integer.class, "secstorage.session.max", "50", "The max number of command execution sessions that a SSVM can handle", null), | ||||
| 	SecStorageCmdExecutionTimeMax("Advanced", AgentManager.class, Integer.class, "secstorage.cmd.execution.time.max", "30", "The max command execution time in minute", null), | ||||
| 	SecStorageProxy("Advanced", AgentManager.class, String.class, "secstorage.proxy", null, "http proxy used by ssvm, in http://username:password@proxyserver:port format", null), | ||||
|     AlertPurgeInterval("Advanced", ManagementServer.class, Integer.class, "alert.purge.interval", "86400", "The interval (in seconds) to wait before running the alert purge thread", null), | ||||
|     AlertPurgeDelay("Advanced", ManagementServer.class, Integer.class, "alert.purge.delay", "0", "Alerts older than specified number days will be purged. Set this value to 0 to never delete alerts", null), | ||||
| 
 | ||||
| 
 | ||||
| 	DirectAttachNetworkEnabled("Advanced", ManagementServer.class, Boolean.class, "direct.attach.network.externalIpAllocator.enabled", "false", "Direct-attach VMs using external DHCP server", "true,false"), | ||||
|     DirectAttachNetworkEnabled("Advanced", ManagementServer.class, Boolean.class, "direct.attach.network.externalIpAllocator.enabled", "false", "Direct-attach VMs using external DHCP server", "true,false"), | ||||
| 	DirectAttachNetworkExternalAPIURL("Advanced", ManagementServer.class, String.class, "direct.attach.network.externalIpAllocator.url", null, "Direct-attach VMs using external DHCP server (API url)", null), | ||||
| 	CheckPodCIDRs("Advanced", ManagementServer.class, String.class, "check.pod.cidrs", "true", "If true, different pods must belong to different CIDR subnets.", "true,false"), | ||||
| 	NetworkGcWait("Advanced", ManagementServer.class, Integer.class, "network.gc.wait", "600", "Time (in seconds) to wait before shutting down a network that's not in used", null), | ||||
|  | ||||
| @ -47,6 +47,7 @@ import javax.management.MalformedObjectNameException; | ||||
| import javax.management.NotCompliantMBeanException; | ||||
| import javax.naming.ConfigurationException; | ||||
| 
 | ||||
| import org.apache.cloudstack.acl.ControlledEntity; | ||||
| import org.apache.cloudstack.acl.SecurityChecker.AccessType; | ||||
| import org.apache.cloudstack.api.ApiConstants; | ||||
| 
 | ||||
| @ -125,6 +126,7 @@ import com.cloud.alert.AlertManager; | ||||
| import com.cloud.alert.AlertVO; | ||||
| import com.cloud.alert.dao.AlertDao; | ||||
| import com.cloud.api.ApiDBUtils; | ||||
| import com.cloud.api.query.vo.EventJoinVO; | ||||
| import com.cloud.async.AsyncJobExecutor; | ||||
| import com.cloud.async.AsyncJobManager; | ||||
| import com.cloud.async.AsyncJobResult; | ||||
| @ -188,6 +190,7 @@ import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; | ||||
| import com.cloud.info.ConsoleProxyInfo; | ||||
| import com.cloud.keystore.KeystoreManager; | ||||
| import com.cloud.network.IpAddress; | ||||
| import com.cloud.network.as.ConditionVO; | ||||
| import com.cloud.network.dao.IPAddressDao; | ||||
| import com.cloud.network.dao.IPAddressVO; | ||||
| import com.cloud.network.dao.LoadBalancerDao; | ||||
| @ -262,6 +265,7 @@ import com.cloud.utils.db.GenericDaoBase; | ||||
| import com.cloud.utils.db.GlobalLock; | ||||
| import com.cloud.utils.db.JoinBuilder; | ||||
| import com.cloud.utils.db.JoinBuilder.JoinType; | ||||
| import com.cloud.utils.db.SearchCriteria.Op; | ||||
| import com.cloud.utils.db.SearchBuilder; | ||||
| import com.cloud.utils.db.SearchCriteria; | ||||
| import com.cloud.utils.db.Transaction; | ||||
| @ -295,7 +299,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|     public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName()); | ||||
| 
 | ||||
|     @Inject | ||||
|     private AccountManager _accountMgr; | ||||
|     public AccountManager _accountMgr; | ||||
|     @Inject | ||||
|     private AgentManager _agentMgr; | ||||
|     @Inject | ||||
| @ -311,7 +315,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|     @Inject | ||||
|     private SecondaryStorageVmDao _secStorageVmDao; | ||||
|     @Inject | ||||
|     private EventDao _eventDao; | ||||
|     public EventDao _eventDao; | ||||
|     @Inject | ||||
|     private DataCenterDao _dcDao; | ||||
|     @Inject | ||||
| @ -347,7 +351,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|     @Inject | ||||
|     private AccountDao _accountDao; | ||||
|     @Inject | ||||
|     private AlertDao _alertDao; | ||||
|     public AlertDao _alertDao; | ||||
|     @Inject | ||||
|     private CapacityDao _capacityDao; | ||||
|     @Inject | ||||
| @ -371,6 +375,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|     @Inject | ||||
|     private AsyncJobManager _asyncMgr; | ||||
|     private int _purgeDelay; | ||||
|     private int _alertPurgeDelay; | ||||
|     @Inject | ||||
|     private InstanceGroupDao _vmGroupDao; | ||||
|     @Inject | ||||
| @ -417,6 +422,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|     EventUtils	_forceEventUtilsRef; | ||||
| */ | ||||
|     private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker")); | ||||
|     private final ScheduledExecutorService _alertExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AlertChecker")); | ||||
|     private KeystoreManager _ksMgr; | ||||
| 
 | ||||
|     private Map<String, String> _configs; | ||||
| @ -446,6 +452,15 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|             _eventExecutor.scheduleAtFixedRate(new EventPurgeTask(), cleanup, cleanup, TimeUnit.SECONDS); | ||||
|         } | ||||
| 
 | ||||
|         //Alerts purge configurations | ||||
|         int alertPurgeInterval = NumbersUtil.parseInt(_configDao.getValue(Config.AlertPurgeInterval.key()), | ||||
|                 60 * 60 * 24); // 1 day. | ||||
|         _alertPurgeDelay = NumbersUtil.parseInt(_configDao.getValue(Config.AlertPurgeDelay.key()), 0); | ||||
|         if (_alertPurgeDelay != 0) { | ||||
|             _alertExecutor.scheduleAtFixedRate(new AlertPurgeTask(), alertPurgeInterval, alertPurgeInterval, | ||||
|                     TimeUnit.SECONDS); | ||||
|         } | ||||
| 
 | ||||
|         String[] availableIds = TimeZone.getAvailableIDs(); | ||||
|         _availableIdsMap = new HashMap<String, Boolean>(availableIds.length); | ||||
|         for (String id : availableIds) { | ||||
| @ -538,6 +553,42 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|         return _eventDao.search(sc, null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean archiveEvents(ArchiveEventsCmd cmd) { | ||||
|         List<Long> ids = cmd.getIds(); | ||||
|         boolean result =true; | ||||
| 
 | ||||
|         List<EventVO> events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), cmd.getEntityOwnerId()); | ||||
|         ControlledEntity[] sameOwnerEvents = events.toArray(new ControlledEntity[events.size()]); | ||||
|         _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEvents); | ||||
| 
 | ||||
|         if (ids != null && events.size() < ids.size()) { | ||||
|             result = false; | ||||
|             return result; | ||||
|         } | ||||
|         _eventDao.archiveEvents(events); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean deleteEvents(DeleteEventsCmd cmd) { | ||||
|         List<Long> ids = cmd.getIds(); | ||||
|         boolean result =true; | ||||
| 
 | ||||
|         List<EventVO> events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), cmd.getEntityOwnerId()); | ||||
|         ControlledEntity[] sameOwnerEvents = events.toArray(new ControlledEntity[events.size()]); | ||||
|         _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEvents); | ||||
| 
 | ||||
|         if (ids != null && events.size() < ids.size()) { | ||||
|             result = false; | ||||
|             return result; | ||||
|         } | ||||
|         for (EventVO event : events) { | ||||
|         _eventDao.remove(event.getId()); | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     private Date massageDate(Date date, int hourOfDay, int minute, int second) { | ||||
|         Calendar cal = Calendar.getInstance(); | ||||
|         cal.setTime(date); | ||||
| @ -1663,10 +1714,25 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|             sc.addAnd("type", SearchCriteria.Op.EQ, type); | ||||
|         } | ||||
| 
 | ||||
|         sc.addAnd("archived", SearchCriteria.Op.EQ, false); | ||||
|         Pair<List<AlertVO>, Integer> result = _alertDao.searchAndCount(sc, searchFilter); | ||||
|         return new Pair<List<? extends Alert>, Integer>(result.first(), result.second()); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean archiveAlerts(ArchiveAlertsCmd cmd) { | ||||
|         Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), null); | ||||
|         boolean result = _alertDao.archiveAlert(cmd.getIds(), cmd.getType(), cmd.getOlderThan(), zoneId); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean deleteAlerts(DeleteAlertsCmd cmd) { | ||||
|         Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), null); | ||||
|         boolean result = _alertDao.deleteAlert(cmd.getIds(), cmd.getType(), cmd.getOlderThan(), zoneId); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<CapacityVO> listTopConsumedResources(ListCapacityCmd cmd) { | ||||
| 
 | ||||
| @ -2168,6 +2234,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|         cmdList.add(AddIpToVmNicCmd.class); | ||||
|         cmdList.add(RemoveIpFromVmNicCmd.class); | ||||
|         cmdList.add(ListNicsCmd.class); | ||||
|         cmdList.add(ArchiveAlertsCmd.class); | ||||
|         cmdList.add(DeleteAlertsCmd.class); | ||||
|         cmdList.add(ArchiveEventsCmd.class); | ||||
|         cmdList.add(DeleteEventsCmd.class); | ||||
|         return cmdList; | ||||
|     } | ||||
| 
 | ||||
| @ -2205,6 +2275,39 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protected class AlertPurgeTask implements Runnable { | ||||
|         @Override | ||||
|         public void run() { | ||||
|             try { | ||||
|                 GlobalLock lock = GlobalLock.getInternLock("AlertPurge"); | ||||
|                 if (lock == null) { | ||||
|                     s_logger.debug("Couldn't get the global lock"); | ||||
|                     return; | ||||
|                 } | ||||
|                 if (!lock.lock(30)) { | ||||
|                     s_logger.debug("Couldn't lock the db"); | ||||
|                     return; | ||||
|                 } | ||||
|                 try { | ||||
|                     final Calendar purgeCal = Calendar.getInstance(); | ||||
|                     purgeCal.add(Calendar.DAY_OF_YEAR, - _alertPurgeDelay); | ||||
|                     Date purgeTime = purgeCal.getTime(); | ||||
|                     s_logger.debug("Deleting alerts older than: " + purgeTime.toString()); | ||||
|                     List<AlertVO> oldAlerts = _alertDao.listOlderAlerts(purgeTime); | ||||
|                     s_logger.debug("Found " + oldAlerts.size() + " events to be purged"); | ||||
|                     for (AlertVO alert : oldAlerts) { | ||||
|                         _alertDao.expunge(alert.getId()); | ||||
|                     } | ||||
|                 } catch (Exception e) { | ||||
|                     s_logger.error("Exception ", e); | ||||
|                 } finally { | ||||
|                     lock.unlock(); | ||||
|                 } | ||||
|             } catch (Exception e) { | ||||
|                 s_logger.error("Exception ", e); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Pair<List<StoragePoolVO>, Integer> searchForStoragePools(Criteria c) { | ||||
|  | ||||
							
								
								
									
										67
									
								
								server/test/com/cloud/alert/AlertControlsUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								server/test/com/cloud/alert/AlertControlsUnitTest.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| package com.cloud.alert; | ||||
| 
 | ||||
| import static org.mockito.Matchers.any; | ||||
| import static org.mockito.Matchers.anyList; | ||||
| import static org.mockito.Matchers.anyLong; | ||||
| import static org.mockito.Matchers.anyString; | ||||
| import static org.mockito.Mockito.doReturn; | ||||
| import static org.mockito.Mockito.when; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import junit.framework.TestCase; | ||||
| 
 | ||||
| import org.apache.log4j.Logger; | ||||
| import org.junit.After; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import org.mockito.Mock; | ||||
| import org.mockito.MockitoAnnotations; | ||||
| import org.mockito.Spy; | ||||
| 
 | ||||
| import com.cloud.alert.dao.AlertDao; | ||||
| import com.cloud.server.ManagementServerImpl; | ||||
| import com.cloud.user.Account; | ||||
| import com.cloud.user.AccountManager; | ||||
| 
 | ||||
| public class AlertControlsUnitTest extends TestCase { | ||||
|     private static final Logger s_logger = Logger.getLogger(AlertControlsUnitTest.class); | ||||
| 
 | ||||
|     @Spy ManagementServerImpl _mgmtServer = new ManagementServerImpl(); | ||||
|     @Mock AccountManager _accountMgr; | ||||
|     @Mock AlertDao _alertDao; | ||||
|     @Override | ||||
|     @Before | ||||
|     protected void setUp() { | ||||
|         MockitoAnnotations.initMocks(this); | ||||
|         _mgmtServer._alertDao = _alertDao; | ||||
|         _mgmtServer._accountMgr = _accountMgr; | ||||
|         doReturn(3L).when(_accountMgr).checkAccessAndSpecifyAuthority(any(Account.class), anyLong()); | ||||
|         when(_alertDao.archiveAlert(anyList(), anyString(), any(Date.class), anyLong())).thenReturn(true); | ||||
|         when(_alertDao.deleteAlert(anyList(), anyString(), any(Date.class), anyLong())).thenReturn(true); | ||||
|     } | ||||
| 
 | ||||
|     @After | ||||
|     public void tearDown() throws Exception { | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testInjected() throws Exception { | ||||
|         s_logger.info("Starting test to archive and delete alerts"); | ||||
|         archiveAlerts(); | ||||
|         deleteAlerts(); | ||||
|         s_logger.info("archive/delete alerts: TEST PASSED"); | ||||
|     } | ||||
| 
 | ||||
|     protected void archiveAlerts() { | ||||
|         // archive alerts | ||||
|         String msg = "Archive Alerts: TEST FAILED"; | ||||
|         assertNotNull(msg, _mgmtServer._alertDao.archiveAlert(null, "system alert",null, 2L)); | ||||
|     } | ||||
| 
 | ||||
|     protected void deleteAlerts() { | ||||
|         // delete alerts | ||||
|         String msg = "Delete Alerts: TEST FAILED"; | ||||
|         assertNotNull(msg, _mgmtServer._alertDao.deleteAlert(null, "system alert",null, 2L)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										68
									
								
								server/test/com/cloud/event/EventControlsUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								server/test/com/cloud/event/EventControlsUnitTest.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| package com.cloud.event; | ||||
| 
 | ||||
| import static org.mockito.Matchers.any; | ||||
| import static org.mockito.Matchers.anyList; | ||||
| import static org.mockito.Matchers.anyLong; | ||||
| import static org.mockito.Matchers.anyString; | ||||
| import static org.mockito.Mockito.doNothing; | ||||
| import static org.mockito.Mockito.when; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import junit.framework.TestCase; | ||||
| 
 | ||||
| import org.apache.cloudstack.acl.ControlledEntity; | ||||
| import org.apache.cloudstack.acl.SecurityChecker.AccessType; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.junit.After; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import org.mockito.Mock; | ||||
| import org.mockito.MockitoAnnotations; | ||||
| import org.mockito.Spy; | ||||
| 
 | ||||
| import com.cloud.event.dao.EventDao; | ||||
| import com.cloud.server.ManagementServerImpl; | ||||
| import com.cloud.user.Account; | ||||
| import com.cloud.user.AccountManager; | ||||
| 
 | ||||
| public class EventControlsUnitTest extends TestCase{ | ||||
|     private static final Logger s_logger = Logger.getLogger(EventControlsUnitTest.class); | ||||
| 
 | ||||
|     @Spy ManagementServerImpl _mgmtServer = new ManagementServerImpl(); | ||||
|     @Mock AccountManager _accountMgr; | ||||
|     @Mock EventDao _eventDao; | ||||
|     List<EventVO> _events = null; | ||||
| 
 | ||||
|     @Override | ||||
|     @Before | ||||
|     protected void setUp() { | ||||
|         MockitoAnnotations.initMocks(this); | ||||
|         _mgmtServer._eventDao = _eventDao; | ||||
|         _mgmtServer._accountMgr = _accountMgr; | ||||
|         doNothing().when(_accountMgr).checkAccess(any(Account.class), any(AccessType.class), any(Boolean.class), any(ControlledEntity.class)); | ||||
|         when(_eventDao.listToArchiveOrDeleteEvents(anyList(), anyString(), any(Date.class), anyLong())).thenReturn(_events); | ||||
|     } | ||||
| 
 | ||||
|     @After | ||||
|     public void tearDown() throws Exception { | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testInjected() throws Exception { | ||||
|         s_logger.info("Starting test to archive and delete events"); | ||||
|         archiveEvents(); | ||||
|         deleteEvents(); | ||||
|         s_logger.info("archive/delete events: TEST PASSED"); | ||||
|     } | ||||
| 
 | ||||
|     protected void archiveEvents() { | ||||
|         // archive alerts | ||||
|         doNothing().when(_eventDao).archiveEvents(_events); | ||||
|         } | ||||
| 
 | ||||
|     protected void deleteEvents() { | ||||
|         // delete alerts | ||||
|     } | ||||
| } | ||||
| @ -140,3 +140,48 @@ CREATE TABLE nic_secondary_ips ( | ||||
| 
 | ||||
| ALTER TABLE `cloud`.`nics` ADD COLUMN secondary_ip SMALLINT DEFAULT '0' COMMENT 'secondary ips configured for the nic'; | ||||
| ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN dnat_vmip VARCHAR(40); | ||||
| 
 | ||||
| ALTER TABLE `cloud`.`alert` ADD COLUMN `archived` tinyint(1) unsigned NOT NULL DEFAULT 0; | ||||
| ALTER TABLE `cloud`.`event` ADD COLUMN `archived` tinyint(1) unsigned NOT NULL DEFAULT 0; | ||||
| INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'alert.purge.interval', '86400', 'The interval (in seconds) to wait before running the alert purge thread'); | ||||
| INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'alert.purge.delay', '0', 'Alerts older than specified number days will be purged. Set this value to 0 to never delete alerts'); | ||||
| 
 | ||||
| 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.created, | ||||
|         event.level, | ||||
|         event.parameters, | ||||
|         event.start_id, | ||||
|         eve.uuid start_uuid, | ||||
|         event.user_id, | ||||
|         event.archived, | ||||
|         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; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user