#region Copyright /* * Copyright © 2014-2016 NetApp, Inc. All Rights Reserved. * * CONFIDENTIALITY NOTICE: THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION OF * NETAPP, INC. USE, DISCLOSURE OR REPRODUCTION IS PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF NETAPP, INC. */ #endregion #region Using Directives using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Management.Automation; using SolidFire.Core.Objects; using SolidFire.Core.Validation; using SolidFire.Core; using SolidFire.Element.Api; #endregion namespace SolidFire.Cluster.Get { /// /// ListEvents returns events detected on the cluster, sorted from oldest to newest. /// [Cmdlet(VerbsCommon.Get, "SFEvent", DefaultParameterSetName = "EventId")] public class GetSFEvent : SFCmdlet { #region Private Data /// /// /// private Int64? startEventId; private Int64? endEventId; private Int64? maxEvents; #endregion #region Parameters [Parameter(Position = 0, ParameterSetName = "EventId", Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, ValueFromRemainingArguments = false, HelpMessage = "Please enter a starting event ID")] [ValidateNotNullOrEmpty] [ValidatePattern(SolidFireValidations.Numeric)] public Int64 StartEventID { set { startEventId = value; } } [Parameter(Position = 1, ParameterSetName = "EventId", Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, ValueFromRemainingArguments = false, HelpMessage = "Please enter an ending event ID")] [ValidateNotNullOrEmpty] [ValidatePattern(SolidFireValidations.Numeric)] public Int64 EndEventID { set { endEventId = value; } } [Parameter(Position = 1, ParameterSetName = "MaxEvents", Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, ValueFromRemainingArguments = false, HelpMessage = "Please enter the maximum number of events to return")] [ValidatePattern(SolidFireValidations.Numeric)] public Int64 MaxEvents { set { maxEvents = value; } } #endregion #region Cmdlet Overrides protected override void BeginProcessing() { base.BeginProcessing(); CheckConnection(); } /// /// /// protected override void ProcessRecord() { base.ProcessRecord(); var request = new ListEventsRequest(); request.StartEventID = startEventId; request.EndEventID = endEventId; request.MaxEvents = maxEvents; var objsFromAPI = SendRequest("ListEvents", request); foreach (var obj in objsFromAPI) { switch (ParameterSetName) { case "EventId": ProcessByID(obj); break; case "MaxEvents": default: WriteObject(ReOrderEvents(obj.Result.Events), true); break; } } } private void ProcessByID(SFWrapper objFromApi) { var matchedEvents = new List(); var containsStartId = false; var containsEndId = false; Int64 minEventIdFound = Int64.MaxValue; Int64 maxEventIdFound = 0; // Initial check to ensure the specified start and end event IDs are actually valid and to gather min and max event Id values foreach (var eventObj in objFromApi.Result.Events) { if (eventObj.EventID < minEventIdFound) minEventIdFound = eventObj.EventID; if (eventObj.EventID > maxEventIdFound) maxEventIdFound = eventObj.EventID; if (eventObj.EventID == startEventId) { containsStartId = true; } if (eventObj.EventID == endEventId) { containsEndId = true; } } if (!startEventId.HasValue && !endEventId.HasValue) { var reorderedEvents = ReOrderEvents(objFromApi.Result.Events); WriteObject(reorderedEvents, true); return; } // we only have an endEventId if (!startEventId.HasValue && endEventId.HasValue) { if (containsEndId) { matchedEvents.AddRange(objFromApi.Result.Events.Where(sfEvent => sfEvent.EventID <= endEventId.Value)); // As we are adding events to matchedEvents, the top of the list will be the last event added, so we need to re-order for the list to make sense to the user var reorderedList = ReOrderEvents(matchedEvents); WriteObject(reorderedList, true); return; } } // we only have a starteventid if (startEventId.HasValue && !endEventId.HasValue) { if (containsStartId) { matchedEvents.AddRange(objFromApi.Result.Events.Where(sfEvent => sfEvent.EventID >= startEventId.Value)); // As we are adding events to matchedEvents, the top of the list will be the last event added, so we need to re-order for the list to make sense to the user var reorderedList = ReOrderEvents(matchedEvents); WriteObject(reorderedList, true); return; } } if (startEventId.HasValue && endEventId.HasValue) { matchedEvents.AddRange(objFromApi.Result.Events.Where(sfEvent => sfEvent.EventID >= startEventId.Value && sfEvent.EventID <= endEventId.Value)); // As we are adding events to matchedEvents, the top of the list will be the last event added, so we need to re-order for the list to make sense to the user var reorderedList = ReOrderEvents(matchedEvents); WriteObject(reorderedList, true); return; } } private static IOrderedEnumerable ReOrderEvents(IEnumerable matchedEvents) { var reorderedList = matchedEvents.OrderByDescending(e => e.EventID); return reorderedList; } #endregion } }