Return-Path: X-Original-To: apmail-incubator-cloudstack-dev-archive@minotaur.apache.org Delivered-To: apmail-incubator-cloudstack-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D56DFE7F6 for ; Fri, 8 Mar 2013 19:33:15 +0000 (UTC) Received: (qmail 53684 invoked by uid 500); 8 Mar 2013 19:33:15 -0000 Delivered-To: apmail-incubator-cloudstack-dev-archive@incubator.apache.org Received: (qmail 53652 invoked by uid 500); 8 Mar 2013 19:33:15 -0000 Mailing-List: contact cloudstack-dev-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: cloudstack-dev@incubator.apache.org Delivered-To: mailing list cloudstack-dev@incubator.apache.org Received: (qmail 53644 invoked by uid 99); 8 Mar 2013 19:33:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 Mar 2013 19:33:15 +0000 X-ASF-Spam-Status: No, hits=-1.6 required=5.0 tests=RCVD_IN_DNSWL_MED,SPF_NEUTRAL,T_FILL_THIS_FORM_SHORT X-Spam-Check-By: apache.org Received-SPF: neutral (nike.apache.org: local policy) Received: from [74.125.149.244] (HELO na3sys009aog118.obsmtp.com) (74.125.149.244) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 08 Mar 2013 19:33:07 +0000 Received: from mail-gh0-f197.google.com ([209.85.160.197]) (using TLSv1) by na3sys009aob118.postini.com ([74.125.148.12]) with SMTP ID DSNKUTo83cV3uRfFTj4paHfyyVnLFwGaYZUL@postini.com; Fri, 08 Mar 2013 11:32:46 PST Received: by mail-gh0-f197.google.com with SMTP id f15so2929110ghb.8 for ; Fri, 08 Mar 2013 11:32:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-received:date:from:to:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent:x-gm-message-state; bh=Yx3pUZEMeLmWmWvZUy1BRS79JgZ2CDSPQX581iy8FsQ=; b=eIEihGg7ZZEmMPriv/vfgPpLpcP8RXQ+tdI7csFCXBBgO5RQqvd4T0LNr6VeFveABD epupU8J9LK2XsXy00iLaPxCvboFG1tU25lcAH4suIDmlRTiuj0lFhgalEaZ4eG6hufei Aa9NytvuadSKA2FytkHFocFwy8lWYxm4d3yuVf5wy/aoFizfNpMUFz/+rY4GlscvLrzi jtFiP14cp2jw9uQYsCRDC5M5/KyMU8/5rLkG6PKXfdkvkhKytV63iUtJ3dYi8Jt1kcP3 ZIvSM8lWtpqGvZ6dgGfMovu3YnhF/SOkD1ke9z9LeBaLdG5wMGeud/73wGitsf/FyEBh F8qw== X-Received: by 10.224.27.77 with SMTP id h13mr5730031qac.23.1362771165085; Fri, 08 Mar 2013 11:32:45 -0800 (PST) X-Received: by 10.224.27.77 with SMTP id h13mr5729994qac.23.1362771164651; Fri, 08 Mar 2013 11:32:44 -0800 (PST) Received: from USLT-205755.sungardas.corp ([216.203.6.11]) by mx.google.com with ESMTPS id ey8sm10262336qab.13.2013.03.08.11.32.43 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 08 Mar 2013 11:32:43 -0800 (PST) Received: by USLT-205755.sungardas.corp (Postfix, from userid 76098887) id 55AE9110B87C5; Fri, 8 Mar 2013 14:32:42 -0500 (EST) Date: Fri, 8 Mar 2013 14:32:42 -0500 From: Chip Childers To: cloudstack-dev@incubator.apache.org Subject: Re: git commit: refs/heads/master - CLOUDSTACK-874 Ability to delete Events and Alerts Message-ID: <20130308193242.GC94334@USLT-205755.sungardas.corp> References: <20130308185343.9269F504A@tyr.zones.apache.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130308185343.9269F504A@tyr.zones.apache.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Gm-Message-State: ALoCoQmt1qk9BtP3k3FfReu2M8AKue0YJuGs1ZE4SlQfNj3Hz1Eeuf10Cw7d5I5JPVrkEMoqXDlqw9H9/m7tyDrgVsqGi82+iyj0ZE1IWDQDuv5WEY85Loyr/uKZky9qzurbMP8Lby4pFCqBiruvUNKVFUavrIxeWwJd3BLIjXXmpUlPFlpMwO8I1PpjaYU8o2ewWR09mph8 X-Virus-Checked: Checked by ClamAV on apache.org -1 to this commit, since it breaks the build. I'm reverting it now, after confirming that the build works after the revert. On Fri, Mar 08, 2013 at 06:53:43PM +0000, mchen@apache.org wrote: > Updated Branches: > refs/heads/master ae3eeca8d -> 5e4c2c8a9 > > > CLOUDSTACK-874 Ability to delete Events and Alerts > > Signed-off-by: Min Chen > > > Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo > Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/5e4c2c8a > Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/5e4c2c8a > Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/5e4c2c8a > > Branch: refs/heads/master > Commit: 5e4c2c8a9eb339fb467aea15582a79cd2feef4bf > Parents: ae3eeca > Author: Sanjay Tripathi > Authored: Fri Mar 8 10:52:40 2013 -0800 > Committer: Min Chen > Committed: Fri Mar 8 10:52:40 2013 -0800 > > ---------------------------------------------------------------------- > api/src/com/cloud/alert/Alert.java | 1 + > api/src/com/cloud/event/Event.java | 1 + > api/src/com/cloud/server/ManagementService.java | 38 +++- > .../org/apache/cloudstack/api/ApiConstants.java | 1 + > client/tomcatconf/commands.properties.in | 4 + > core/src/com/cloud/alert/AlertVO.java | 38 ++-- > core/src/com/cloud/event/EventVO.java | 167 ++++++++------- > core/src/com/cloud/event/dao/EventDao.java | 5 + > core/src/com/cloud/event/dao/EventDaoImpl.java | 71 +++++-- > server/src/com/cloud/alert/dao/AlertDao.java | 7 + > server/src/com/cloud/alert/dao/AlertDaoImpl.java | 85 ++++++++ > server/src/com/cloud/api/ApiDispatcher.java | 6 +- > .../src/com/cloud/api/query/QueryManagerImpl.java | 3 + > server/src/com/cloud/api/query/vo/EventJoinVO.java | 9 + > server/src/com/cloud/configuration/Config.java | 5 +- > .../src/com/cloud/server/ManagementServerImpl.java | 109 +++++++++- > setup/db/db/schema-410to420.sql | 45 ++++ > 17 files changed, 475 insertions(+), 120 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/api/src/com/cloud/alert/Alert.java > ---------------------------------------------------------------------- > diff --git a/api/src/com/cloud/alert/Alert.java b/api/src/com/cloud/alert/Alert.java > index 050f97f..31768cf 100644 > --- a/api/src/com/cloud/alert/Alert.java > +++ b/api/src/com/cloud/alert/Alert.java > @@ -30,4 +30,5 @@ public interface Alert extends Identity, InternalIdentity { > Date getCreatedDate(); > Date getLastSent(); > Date getResolved(); > + boolean getArchived(); > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/api/src/com/cloud/event/Event.java > ---------------------------------------------------------------------- > diff --git a/api/src/com/cloud/event/Event.java b/api/src/com/cloud/event/Event.java > index 1a61636..b8def4c 100644 > --- a/api/src/com/cloud/event/Event.java > +++ b/api/src/com/cloud/event/Event.java > @@ -40,4 +40,5 @@ public interface Event extends ControlledEntity, Identity, InternalIdentity { > String getLevel(); > long getStartId(); > String getParameters(); > + boolean getArchived(); > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/api/src/com/cloud/server/ManagementService.java > ---------------------------------------------------------------------- > diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java > index 1736da3..1e6ca8d 100755 > --- a/api/src/com/cloud/server/ManagementService.java > +++ b/api/src/com/cloud/server/ManagementService.java > @@ -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; > @@ -195,6 +193,34 @@ public interface ManagementService { > Pair, 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 > * > * @param cmd > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/api/src/org/apache/cloudstack/api/ApiConstants.java > ---------------------------------------------------------------------- > diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java > index 1b544fd..b40b26c 100755 > --- a/api/src/org/apache/cloudstack/api/ApiConstants.java > +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java > @@ -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; > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/client/tomcatconf/commands.properties.in > ---------------------------------------------------------------------- > diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in > index dd0c3f8..5018236 100644 > --- a/client/tomcatconf/commands.properties.in > +++ b/client/tomcatconf/commands.properties.in > @@ -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 > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/core/src/com/cloud/alert/AlertVO.java > ---------------------------------------------------------------------- > diff --git a/core/src/com/cloud/alert/AlertVO.java b/core/src/com/cloud/alert/AlertVO.java > index f6089d6..3f014aa 100755 > --- a/core/src/com/cloud/alert/AlertVO.java > +++ b/core/src/com/cloud/alert/AlertVO.java > @@ -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") > @@ -68,16 +66,19 @@ public class AlertVO implements Alert { > @Temporal(TemporalType.TIMESTAMP) > @Column(name="resolved", updatable=true, nullable=true) > private Date resolved; > - > + > @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; > } > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/core/src/com/cloud/event/EventVO.java > ---------------------------------------------------------------------- > diff --git a/core/src/com/cloud/event/EventVO.java b/core/src/com/cloud/event/EventVO.java > index ac46f24..2c30ead 100644 > --- a/core/src/com/cloud/event/EventVO.java > +++ b/core/src/com/cloud/event/EventVO.java > @@ -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; > - > - @Enumerated(value=EnumType.STRING) > - @Column(name="state") > + @Column(name="type") > + private String type; > + > + @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="start_id") > + @Column(name="level") > + private String level = LEVEL_INFO; > + > + @Column(name="start_id") > private long startId; > > - @Column(name="parameters", length=1024) > - private String parameters; > - > - @Column(name="uuid") > - private String uuid; > - > - @Transient > - private int totalSize; > - > - public static final String LEVEL_INFO = "INFO"; > - public static final String LEVEL_WARN = "WARN"; > - public static final String LEVEL_ERROR = "ERROR"; > - > - public EventVO() { > - this.uuid = UUID.randomUUID().toString(); > - } > - > - public long getId() { > - return id; > - } > - @Override > + @Column(name="parameters", length=1024) > + private String parameters; > + > + @Column(name="uuid") > + private String uuid; > + > + @Column(name="archived") > + private boolean archived; > + > + @Transient > + private int totalSize; > + > + public static final String LEVEL_INFO = "INFO"; > + public static final String LEVEL_WARN = "WARN"; > + public static final String LEVEL_ERROR = "ERROR"; > + > + 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; > - } > - > - @Override > - public String getUuid() { > - return this.uuid; > - } > - > - public void setUuid(String uuid) { > - this.uuid = uuid; > - } > + return parameters; > + } > + public void setParameters(String parameters) { > + this.parameters = parameters; > + } > + > + @Override > + public String getUuid() { > + return this.uuid; > + } > + > + public void setUuid(String uuid) { > + this.uuid = uuid; > + } > > + @Override > + public boolean getArchived() { > + return archived; > + } > + > + public void setArchived(Boolean archived) { > + this.archived = archived; > + } > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/core/src/com/cloud/event/dao/EventDao.java > ---------------------------------------------------------------------- > diff --git a/core/src/com/cloud/event/dao/EventDao.java b/core/src/com/cloud/event/dao/EventDao.java > index bfcb818..da5f47a 100644 > --- a/core/src/com/cloud/event/dao/EventDao.java > +++ b/core/src/com/cloud/event/dao/EventDao.java > @@ -30,4 +30,9 @@ public interface EventDao extends GenericDao { > public List listOlderEvents(Date oldTime); > > EventVO findCompletedEvent(long startId); > + > + public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId); > + > + public void archiveEvents(List events); > + > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/core/src/com/cloud/event/dao/EventDaoImpl.java > ---------------------------------------------------------------------- > diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/core/src/com/cloud/event/dao/EventDaoImpl.java > index 44fbb03..6ba59c5 100644 > --- a/core/src/com/cloud/event/dao/EventDaoImpl.java > +++ b/core/src/com/cloud/event/dao/EventDaoImpl.java > @@ -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 implements EventDao { > - public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName()); > - protected final SearchBuilder CompletedEventSearch; > - > - 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 static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName()); > + protected final SearchBuilder CompletedEventSearch; > + protected final SearchBuilder ToArchiveOrDeleteEventSearch; > > - @Override > - public List searchAllEvents(SearchCriteria sc, Filter filter) { > - return listIncludingRemovedBy(sc, filter); > - } > + public EventDaoImpl () { > + CompletedEventSearch = createSearchBuilder(); > + CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ); > + CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ); > + CompletedEventSearch.done(); > + > + 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 searchAllEvents(SearchCriteria sc, Filter filter) { > + return listIncludingRemovedBy(sc, filter); > + } > > @Override > public List listOlderEvents(Date oldTime) { > @@ -55,9 +65,8 @@ public class EventDaoImpl extends GenericDaoBase implements Event > SearchCriteria sc = createSearchCriteria(); > sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); > return listIncludingRemovedBy(sc, null); > - > } > - > + > @Override > public EventVO findCompletedEvent(long startId) { > SearchCriteria sc = CompletedEventSearch.create(); > @@ -65,4 +74,36 @@ public class EventDaoImpl extends GenericDaoBase implements Event > sc.setParameters("startId", startId); > return findOneIncludingRemovedBy(sc); > } > + > + @Override > + public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId) { > + SearchCriteria 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 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(); > + } > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/alert/dao/AlertDao.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/alert/dao/AlertDao.java b/server/src/com/cloud/alert/dao/AlertDao.java > index eb1faa5..fda814d 100755 > --- a/server/src/com/cloud/alert/dao/AlertDao.java > +++ b/server/src/com/cloud/alert/dao/AlertDao.java > @@ -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 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 Ids, String type, Date olderThan, Long zoneId); > + public boolean archiveAlert(List Ids, String type, Date olderThan, Long zoneId); > + public List listOlderAlerts(Date oldTime); > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/alert/dao/AlertDaoImpl.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/alert/dao/AlertDaoImpl.java b/server/src/com/cloud/alert/dao/AlertDaoImpl.java > index 2f3be88..4b9bc6a 100755 > --- a/server/src/com/cloud/alert/dao/AlertDaoImpl.java > +++ b/server/src/com/cloud/alert/dao/AlertDaoImpl.java > @@ -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 implements AlertDao { > + > + protected final SearchBuilder 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 implements Alert > } > return null; > } > + > + @Override > + public boolean archiveAlert(List Ids, String type, Date olderThan, Long zoneId) { > + SearchCriteria 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 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 ids, String type, Date olderThan, Long zoneId) { > + SearchCriteria 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 alerts = listBy(sc); > + if (ids != null && alerts.size() < ids.size()) { > + result = false; > + return result; > + } > + remove(sc); > + return result; > + } > + > + @Override > + public List listOlderAlerts(Date oldTime) { > + if (oldTime == null) return null; > + SearchCriteria sc = createSearchCriteria(); > + sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); > + return listIncludingRemovedBy(sc, null); > + } > + > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/api/ApiDispatcher.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java > index 764b3ae..f7a3236 100755 > --- a/server/src/com/cloud/api/ApiDispatcher.java > +++ b/server/src/com/cloud/api/ApiDispatcher.java > @@ -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); > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/api/query/QueryManagerImpl.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java > index 8d8663a..35fe2f3 100644 > --- a/server/src/com/cloud/api/query/QueryManagerImpl.java > +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java > @@ -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 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, Integer> eventPair = null; > // event_view will not have duplicate rows for each event, so searchAndCount should be good enough. > if ((entryTime != null) && (duration != null)) { > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/api/query/vo/EventJoinVO.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/api/query/vo/EventJoinVO.java b/server/src/com/cloud/api/query/vo/EventJoinVO.java > index f29a942..12d7e5a 100644 > --- a/server/src/com/cloud/api/query/vo/EventJoinVO.java > +++ b/server/src/com/cloud/api/query/vo/EventJoinVO.java > @@ -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; > + } > > } > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/configuration/Config.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java > index 418f97d..64465a2 100755 > --- a/server/src/com/cloud/configuration/Config.java > +++ b/server/src/com/cloud/configuration/Config.java > @@ -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), > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/server/src/com/cloud/server/ManagementServerImpl.java > ---------------------------------------------------------------------- > diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java > index 11400de..d70c45f 100755 > --- a/server/src/com/cloud/server/ManagementServerImpl.java > +++ b/server/src/com/cloud/server/ManagementServerImpl.java > @@ -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 _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(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 ids = cmd.getIds(); > + boolean result =true; > + > + List 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 ids = cmd.getIds(); > + boolean result =true; > + > + List 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,11 +1714,26 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe > sc.addAnd("type", SearchCriteria.Op.EQ, type); > } > > + sc.addAnd("archived", SearchCriteria.Op.EQ, false); > Pair, Integer> result = _alertDao.searchAndCount(sc, searchFilter); > return new Pair, 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 listTopConsumedResources(ListCapacityCmd cmd) { > > Integer capacityType = cmd.getType(); > @@ -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 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, Integer> searchForStoragePools(Criteria c) { > > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5e4c2c8a/setup/db/db/schema-410to420.sql > ---------------------------------------------------------------------- > diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql > index f3112a1..ca15bda 100644 > --- a/setup/db/db/schema-410to420.sql > +++ b/setup/db/db/schema-410to420.sql > @@ -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; > >