/// <summary> /// Runs when update feSight. /// </summary> /// <param name="fusionDirector">The fusion director.</param> private void RunUpdateESight(HWESightHost eSight) { HWLogger.GetESightNotifyLogger(eSight.HostIP).Info($"Recieve: update eSight"); var instance = this.FindInstance(eSight); instance.Sync(); }
/// <summary> /// Deletes the kun lun on synchronize. /// </summary> /// <param name="fdIp">The e sight ip.</param> /// <param name="newIds">The new device ids.</param> public void CompareDataOnSync(string fdIp, List <string> newIds) { try { MGroup.Instance.CheckConnection(); HWLogger.GetFdSdkLogger(fdIp).Info($"Check And Removed Enclosure On Polling.[curQueryResult:{string.Join(",", newIds)}]"); var criteria = new MonitoringObjectCriteria($"Name like '%{fdIp}%'", EnclosureClass); var exsitObjects = MGroup.Instance.EntityObjects.GetObjectReader <MonitoringObject>(criteria, ObjectQueryOptions.Default).ToList(); var deleteObjects = exsitObjects.Where(x => newIds.All(newDeviceId => newDeviceId != x[EnclosureKey].Value.ToString())).ToList(); var newObjects = newIds.Where(x => exsitObjects.All(y => x != y[EnclosureKey].Value.ToString())).ToList(); HWLogger.GetFdSdkLogger(fdIp).Info($"Compare Enclosures Result:[new:{newObjects.Count}] [Delete:{deleteObjects.Count}]"); var discovery = new IncrementalDiscoveryData(); deleteObjects.ForEach(deleteDevice => { discovery.Remove(deleteDevice); }); discovery.Commit(this.MontioringConnector); HWLogger.GetFdSdkLogger(fdIp).Debug($"Remove Enclosure On Polling:[Count:{deleteObjects.Count}].[{string.Join(",", deleteObjects.Select(x => x[EnclosureKey].Value.ToString()))}]"); } catch (Exception e) { HWLogger.GetFdSdkLogger(fdIp).Error(e, $"Compare Enclosures Data On Sync."); } }
/// <summary> /// Inserts the device change event. /// </summary> /// <param name="mpClass">The mp class.</param> /// <param name="eventData">The event data.</param> /// <param name="eSightIp">The e sight ip.</param> public void InsertDeviceChangeEvent(ManagementPackClass mpClass, DeviceChangeEventData eventData, string eSightIp) { try { var logger = HWLogger.GetESightSdkLogger(eventData.ESightIp); HWLogger.GetESightSdkLogger(eSightIp).Info($"Start Insert DeviceChangeEvent.[{JsonUtil.SerializeObject(eventData)}]"); MGroup.Instance.CheckConnection(); var obj = GetObjectByDeviceId(mpClass, eventData.DeviceId); if (obj == null) { logger.Warn($"InsertDeviceChangeEvent:Can not find the MonitoringObject:{eventData.DeviceId}"); return; } var isReady = CheckAndWaitHealthStateReady(mpClass, obj, eventData.DeviceId, eSightIp); if (!isReady) { logger.Warn($"InsertDeviceChangeEvent:The MonitoringObject state is uninitialized.Drop the event."); return; } obj?.InsertCustomMonitoringEvent(eventData.ToCustomMonitoringEvent()); } catch (Exception ex) { HWLogger.GetESightSdkLogger(eSightIp).Error(ex, "Insert DeviceChangeEvent Error"); } }
/// <summary> /// Updates the specified model. /// </summary> /// <param name="model">The model.</param> /// <param name="isPolling">if set to <c>true</c> [is polling].</param> /// <exception cref="System.Exception"></exception> public void Update(Enclosure model, bool isPolling) { try { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Debug($"Start UpdateEnclosure.[{model.UnionId}] [isPolling:{isPolling}]"); var exsitEnclosure = this.GetObject($"UnionId = '{model.UnionId}'", this.EnclosureClass); if (exsitEnclosure == null) { throw new Exception($"Can not find the server:{model.UnionId}"); } var isChange = CompareEnclosure(model, exsitEnclosure); if (isChange) { var discoveryData = new IncrementalDiscoveryData(); this.UpdateEnclosure(model, exsitEnclosure); discoveryData.Add(exsitEnclosure); discoveryData.Overwrite(this.MontioringConnector); HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Info($"Update enclosure finish.[{model.UnionId}]"); } } catch (Exception e) { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Error(e, $"Update enclosure error.[{model.UnionId}] [isPolling:{isPolling}]"); } }
/// <summary> /// Deletes the servers on synchronize. /// </summary> /// <param name="eSightIp">The e sight ip.</param> /// <param name="newDeviceIds">The new device ids.</param> /// <param name="mpClass">The mp class.</param> public void RemoveServersOnSync(string eSightIp, List <string> newDeviceIds, ManagementPackClass mpClass) { try { HWLogger.GetESightSdkLogger(eSightIp).Info($"Check Removed Servers On Polling.[mpClass:{mpClass}][curQueryResult:{string.Join(",", newDeviceIds)}]"); MGroup.Instance.CheckConnection(); var criteria = new MonitoringObjectCriteria($"eSight = '{eSightIp}'", mpClass); var exsitDevices = MGroup.Instance.EntityObjects.GetObjectReader <MonitoringObject>(criteria, ObjectQueryOptions.Default).ToList(); var deleteDevices = exsitDevices.Where(x => newDeviceIds.All(newDeviceId => newDeviceId != x[this.HuaweiServerKey].Value.ToString())) .ToList(); var discovery = new IncrementalDiscoveryData(); deleteDevices.ForEach(deleteDevice => { discovery.Remove(deleteDevice); }); discovery.Commit(this.MontioringConnector); if (deleteDevices.Any()) { HWLogger.GetESightSdkLogger(eSightIp).Info($"RemoveServers OnSync:delete servers[{mpClass.Name}]:{string.Join(",", deleteDevices.Select(x => x[this.HuaweiServerKey].Value.ToString()).Distinct())} "); } } catch (Exception e) { HWLogger.GetESightSdkLogger(eSightIp).Error($"RemoveServers OnSync.", e); } }
/// <summary> /// Runs when update fusion director. /// </summary> /// <param name="fusionDirector">The fusion director.</param> private void RunUpdateFusionDirector(FusionDirector fusionDirector) { HWLogger.GetFdNotifyLogger(fusionDirector.HostIP).Info($"Recieve: update FusionDirector"); var instance = this.FindInstance(fusionDirector); instance.Sync(); }
/// <summary> /// 解析保活消息 /// </summary> /// <param name="eSight">The e sight.</param> /// <param name="json">The json.</param> private void AnalysisAlive(HWESightHost eSight, string json) { HWLogger.GetESightSubscribeLogger(eSight.HostIP).Info($"Analysis Alive Message. "); var instance = this.FindInstance(eSight); instance.UpdateAliveTime(DateTime.Now); }
/// <summary> /// The insert detials. /// </summary> /// <param name="model"> /// The model. /// </param> private void InsertDetials(RackServer model) { try { HWLogger.GetESightSdkLogger(model.ESight).Debug($"Insert Rack:{model.DN}"); var discoveryData = new IncrementalDiscoveryData(); var rackServer = this.CreateRackServer(model); discoveryData.Add(rackServer); discoveryData.Commit(this.MontioringConnector); } catch (Exception e) { HWLogger.GetESightSdkLogger(model.ESight).Error($"Insert (Rack Error:{model.DN}", e); } }
/// <summary> /// 解析设备变更消息 /// </summary> /// <param name="eSight">The e sight.</param> /// <param name="json">The json.</param> /// <exception cref="System.Exception"> /// </exception> private void AnalysisNeDevice(HWESightHost eSight, string json) { try { var messge = JsonUtil.DeserializeObject <TcpMessage <NotifyModel <NedeviceData> > >(json); var nedeviceData = messge.Data; if (nedeviceData == null) { return; } var dn = nedeviceData.Data.DeviceId; HWLogger.GetESightNotifyLogger(eSight.HostIP).Info($"AnalysisNeDevice [MsgType:{nedeviceData.MsgType}] [DN:{dn}][deviceName:{nedeviceData.Data.DeviceName}][desc:{nedeviceData.Data.Description}] "); var instance = this.FindInstance(eSight); instance.UpdateAliveTime(DateTime.Now);//更新保活時間(esight在发生告警后不会发送保活信息) switch (nedeviceData.MsgType) { case 1: // 新增 //instance.Sync(); break; case 2: // 删除 // 高密的设备变更消息需要单独处理 var deleteServerType = instance.GetServerTypeByDn(dn); if (deleteServerType == ServerTypeEnum.ChildHighdensity || deleteServerType == ServerTypeEnum.Highdensity) { instance.SyncHighdensityList(); } else { instance.DeleteServer(dn, deleteServerType); } break; case 3: // 修改 var modifyServerType = instance.GetServerTypeByDn(dn); instance.StartUpdateTask(dn, modifyServerType, 0); break; default: break; } } catch (Exception e) { HWLogger.GetESightNotifyLogger(eSight.HostIP).Error(e, $"AnalysisNeDevice Error."); } }
/// <summary> /// 解析告警变更消息 /// </summary> /// <param name="eSight">The eSight.</param> /// <param name="json">The json.</param> /// <exception cref="System.Exception"></exception> private void AnalysisAlarm(HWESightHost eSight, string json) { try { var messge = JsonUtil.DeserializeObject <TcpMessage <NotifyModel <AlarmData> > >(json); var alarmData = messge.Data; if (alarmData != null) { var dn = alarmData.Data.NeDN; var alarmSn = alarmData.Data.AlarmSN; HWLogger.GetESightNotifyLogger(eSight.HostIP).Info($"[alarmSn:{alarmSn}] AnalysisAlarm.[DN:{dn}][optType:{alarmData.Data.OptType}][alarmName:{alarmData.Data.AlarmName}] "); var instance = this.FindInstance(eSight); instance.UpdateAliveTime(DateTime.Now);//更新保活時間(esight在发生告警后不会发送保活信息) var serverType = instance.GetServerTypeByDn(dn); if (serverType == ServerTypeEnum.ChildBlade) { //更新子刀片的管理板 var childDeviceId = $"{eSight.HostIP}-{dn}"; var parentDn = BladeConnector.Instance.GetParentDn(childDeviceId); instance.StartUpdateTask(parentDn, ServerTypeEnum.Blade, alarmSn); } if (serverType == ServerTypeEnum.ChildHighdensity) { //更新子刀片的管理板 var childDeviceId = $"{eSight.HostIP}-{dn}"; var parentDn = HighdensityConnector.Instance.GetParentDn(childDeviceId); instance.StartUpdateTask(parentDn, ServerTypeEnum.Highdensity, alarmSn); } if (serverType == ServerTypeEnum.Switch) { //交换板告警 只用更新管理板 var childDeviceId = $"{eSight.HostIP}-{dn}"; var parentDn = BladeConnector.Instance.GetSwitchParentDn(childDeviceId); instance.StartUpdateTask(parentDn, ServerTypeEnum.Blade, alarmSn); instance.SubmitNewAlarm(alarmData.Data); return; } instance.StartUpdateTask(alarmData.Data.NeDN, serverType, alarmSn); instance.SubmitNewAlarm(alarmData.Data); } } catch (Exception e) { HWLogger.GetESightNotifyLogger(eSight.HostIP).Error(e, $"AnalysisAlarm Error."); } }
/// <summary> /// The update rack. /// </summary> /// <param name="model">The model.</param> /// <param name="isPolling">是否是轮询</param> /// <exception cref="System.Exception"></exception> /// <exception cref="Exception"></exception> public void UpdateRack(RackServer model, bool isPolling) { try { HWLogger.GetESightSdkLogger(model.ESight).Debug($"Start UpdateRack. [{model.DN}] [isPolling:{isPolling}]"); var oldBlade = this.GetRackServer(model.DeviceId); if (oldBlade == null) { throw new Exception($"Can not find the server:{model.DN}"); } var propertys = this.RackClass.PropertyCollection; // 获取到class的属性 var discoveryData = new IncrementalDiscoveryData(); oldBlade[this.DisplayNameField].Value = model.ServerName; if (model.Status != "-3") { oldBlade[propertys["Status"]].Value = model.StatusTxt; } oldBlade[propertys["iBMCIPv4Address"]].Value = model.iBMCIPv4Address; oldBlade[propertys["Type"]].Value = model.Type; oldBlade[propertys["UUID"]].Value = model.UUID; oldBlade[propertys["AveragePower"]].Value = model.AveragePower; oldBlade[propertys["PeakPower"]].Value = model.PeakPower; oldBlade[propertys["PowerConsumption"]].Value = model.PowerConsumption; oldBlade[propertys["DNSServerIP"]].Value = model.DNSServerIP; oldBlade[propertys["DNSName"]].Value = model.DNSName; oldBlade[propertys["ProductSn"]].Value = model.ProductSN; oldBlade[propertys["HostName"]].Value = model.HostName; oldBlade[propertys["CPUNums"]].Value = model.CPUNums; oldBlade[propertys["CPUCores"]].Value = model.CPUCores; oldBlade[propertys["CPUModel"]].Value = model.CPUModel; oldBlade[propertys["MemoryCapacity"]].Value = model.MemoryCapacity; oldBlade[propertys["AssertTag"]].Value = model.AssertTag; if (isPolling) { oldBlade[propertys["BMCVersion"]].Value = model.BMCVersion; } oldBlade[propertys["eSight"]].Value = model.ESight; discoveryData.Add(oldBlade); discoveryData.Overwrite(this.MontioringConnector); } catch (Exception e) { HWLogger.GetESightSdkLogger(model.ESight).Error($"Update UpdateRack Error.[{model.DN}] [isPolling:{isPolling}]", e); } }
/// <summary> /// Runs to delete eSight. /// </summary> /// <param name="eSightIp">The e sight ip.</param> private void RunDeleteESight(string eSightIp) { HWLogger.GetESightNotifyLogger(eSightIp).Info($"Recieve: delete this eSight"); Task.Run(() => { BladeConnector.Instance.RemoveServerFromMGroup(eSightIp); HighdensityConnector.Instance.RemoveServerFromMGroup(eSightIp); RackConnector.Instance.RemoveServerFromMGroup(eSightIp); KunLunConnector.Instance.RemoveServerFromMGroup(eSightIp); }); var syncInstance = this.SyncInstances.FirstOrDefault(y => y.ESightIp == eSightIp); if (syncInstance != null) { syncInstance.Unsubscribe(); syncInstance.Close(); this.SyncInstances.Remove(syncInstance); } }
/// <summary> /// Analysises the TCP MSG. /// </summary> /// <param name="json">The json.</param> /// <exception cref="System.Exception">can not find eSight:" + tcpMessage.ESightIp</exception> /// <exception cref="System.ArgumentOutOfRangeException"></exception> public void AnalysisTcpMsg(string json) { try { var tcpMessage = JsonUtil.DeserializeObject <TcpMessage <object> >(json); var eSightList = ESightDal.Instance.GetList(); var eSight = eSightList.FirstOrDefault(x => x.SubscribeID == tcpMessage.SubscribeId); if (eSight == null) { throw new Exception("can not find eSight:" + tcpMessage.SubscribeId); } if (tcpMessage.MsgType != TcpMessageType.KeepAlive) { HWLogger.GetESightNotifyLogger(eSight.HostIP).Info($"RecieveTcpMsg. data:{json}"); } else { HWLogger.GetESightSubscribeLogger(eSight.HostIP).Info($"RecieveTcpMsg. data:{json}"); } switch (tcpMessage.MsgType) { case TcpMessageType.Alarm: this.AnalysisAlarm(eSight, json); break; case TcpMessageType.NeDevice: this.AnalysisNeDevice(eSight, json); break; case TcpMessageType.KeepAlive: this.AnalysisAlive(eSight, json); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception ex) { this.OnError("AnalysisTcpMsg Error: ", ex); } }
/// <summary> /// 根据eSight删除Server以及父级的Computer /// </summary> /// <param name="mpClass">The class.</param> /// <param name="eSightIp">The eSightIp.</param> public void RemoverServersByESight(ManagementPackClass mpClass, string eSightIp) { try { HWLogger.GetESightSdkLogger(eSightIp).Info($"RemoverServersByESight.[{eSightIp}]"); MGroup.Instance.CheckConnection(); var criteria = new MonitoringObjectCriteria($"eSight = '{eSightIp}'", mpClass); var devices = MGroup.Instance.EntityObjects.GetObjectReader <MonitoringObject>(criteria, ObjectQueryOptions.Default).ToList(); if (devices.Any()) { var discovery = new IncrementalDiscoveryData(); devices.ForEach(device => discovery.Remove(device)); discovery.Commit(this.MontioringConnector); } } catch (Exception ex) { HWLogger.GetESightSdkLogger(eSightIp).Error("RemoverServersByESight", ex); } }
/// <summary> /// Removes the server from m group. /// </summary> /// <param name="fdIp">The fd ip.</param> public void RemoveEnclosureByFd(string fdIp) { try { HWLogger.GetFdSdkLogger(fdIp).Info($"RemoveEnclosureByFd.[{fdIp}]"); MGroup.Instance.CheckConnection(); var criteria = new MonitoringObjectCriteria($"Name like '%{fdIp}%'", EnclosureClass); var devices = MGroup.Instance.EntityObjects.GetObjectReader <MonitoringObject>(criteria, ObjectQueryOptions.Default).ToList(); if (devices.Any()) { var discovery = new IncrementalDiscoveryData(); devices.ForEach(device => discovery.Remove(device)); discovery.Commit(this.MontioringConnector); } } catch (Exception ex) { HWLogger.GetFdSdkLogger(fdIp).Error(ex, "RemoveEnclosureByFd"); } }
/// <summary> /// Runs to delete FusionDirector. /// </summary> /// <param name="fdIp">The e sight ip.</param> private void RunDeleteFusionDirector(string fdIp) { HWLogger.GetFdNotifyLogger(fdIp).Info($"Recieve: delete this FusionDirector"); HWLogger.Service.Info($"Recieve: delete this FusionDirector {fdIp}"); var syncInstance = this.SyncInstances.FirstOrDefault(y => y.FusionDirectorIp == fdIp); if (syncInstance != null) { syncInstance.Close(); var isFinish = false; int i = 0; while (!isFinish) { i++; if (syncInstance.IsComplete) { try { this.SyncInstances.Remove(syncInstance); if (i > 1)//如果首次检查正在同步,则睡眠一分钟后删除,防止UI报错 { Thread.Sleep(TimeSpan.FromSeconds(60)); } Thread.Sleep(TimeSpan.FromSeconds(2)); EnclosureConnector.Instance.RemoveEnclosureByFd(fdIp); ServerConnector.Instance.RemoveServerByFd(fdIp); } catch (Exception e) { HWLogger.GetFdNotifyLogger(fdIp).Error(e, $"delete this FusionDirector:"); } isFinish = true; } Thread.Sleep(TimeSpan.FromSeconds(3)); } } else { HWLogger.GetFdNotifyLogger(fdIp).Info($"delete this FusionDirector:can not find the syncInstance"); } }
/// <summary> /// Removes the server by device identifier. /// </summary> /// <param name="eSightIp">The e sight ip.</param> /// <param name="deviceId">The device identifier.</param> public void RemoveServerByDeviceId(string eSightIp, string deviceId) { try { HWLogger.GetESightSdkLogger(eSightIp).Info($"RemoveServerByDeviceId.[{deviceId}]"); MGroup.Instance.CheckConnection(); var criteria = new MonitoringObjectCriteria($"DN = '{deviceId}'", HuaweiServerClass); var reader = MGroup.Instance.EntityObjects.GetObjectReader <MonitoringObject>(criteria, ObjectQueryOptions.Default); if (reader.Any()) { var existingObject = reader.First(); var discovery = new IncrementalDiscoveryData(); discovery.Remove(existingObject); discovery.Commit(this.MontioringConnector); } } catch (Exception e) { HWLogger.GetESightSdkLogger(eSightIp).Error($"RemoveServerByDeviceId.", e); } }
/// <summary> /// 插入告警时,等待新增的对象的healthState不再是Not Monitor /// </summary> /// <param name="mpClass">The mp class.</param> /// <param name="obj">The object.</param> /// <param name="eventData">The event data.</param> /// <returns>PartialMonitoringObject.</returns> public bool CheckAndWaitHealthStateReady(ManagementPackClass mpClass, PartialMonitoringObject obj, EventData eventData) { var logger = HWLogger.GetFdSdkLogger(eventData.FusionDirectorIp); if (obj.StateLastModified == null) { //如果对象添加超过5分钟,仍然没有健康状态,防止阻塞只查询一次 if ((DateTime.Now - obj.TimeAdded).TotalMinutes > 5) { obj = GetObjectByUnionId(mpClass, eventData.UnionId);; if (obj.HealthState != HealthState.Uninitialized) { logger.Info($"{eventData.UnionId} first healthState is {obj.HealthState}."); return(true); } return(false); } #region 新增对象 logger.Info($"New Object:{eventData.UnionId}"); int i = 0; while (i < 48) { i++; // 重新查询obj状态 obj = GetObjectByUnionId(mpClass, eventData.UnionId);; if (obj.HealthState != HealthState.Uninitialized) { logger.Info($"{eventData.UnionId} first healthState is {obj.HealthState}."); Thread.Sleep(TimeSpan.FromSeconds(5)); return(true); } logger.Info($"wait {eventData.UnionId} first Initialized..."); Thread.Sleep(TimeSpan.FromSeconds(5)); } return(false); #endregion } return(true); }
/// <summary> /// Inserts the specified model. /// </summary> /// <param name="model">The model.</param> private void Insert(Server model) { try { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Debug($"Insert Server:{model.UnionId}"); var discoveryData = new IncrementalDiscoveryData(); #region Server var server = this.CreateServer(model); discoveryData.Add(server); #endregion discoveryData.Commit(this.MontioringConnector); HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Debug($"Insert Server Finish:{model.UnionId}"); } catch (Exception e) { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Error(e, $"Insert Server Error:{model.UnionId}"); } }
/// <summary> /// Inserts the specified model. /// </summary> /// <param name="model">The model.</param> public void Insert(Enclosure model) { try { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Debug($"Insert Enclosure:{model.UnionId}"); var discoveryData = new IncrementalDiscoveryData(); #region Enclosure var enclosure = this.CreateEnclosure(model); discoveryData.Add(enclosure); #endregion discoveryData.Commit(this.MontioringConnector); HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Debug($"InsertEnclosure finish.[{model.UnionId}]"); } catch (Exception e) { HWLogger.GetFdSdkLogger(model.FusionDirectorIp).Error(e, $"Insert Enclosure Error:{model.UnionId}"); } }
/// <summary> /// Runs the recive new alarm. /// </summary> /// <param name="json">The json.</param> private void RunReciveNewAlarm(FusionDirector fusionDirector, string json) { var tcpMessage = JsonConvert.DeserializeObject <TcpMessage <AlarmData> >(json); HWLogger.GetFdNotifyLogger(fusionDirector.HostIP).Info($"Recieve new alarm:{JsonConvert.SerializeObject(tcpMessage)}"); var syncInstance = this.SyncInstances.FirstOrDefault(y => y.FusionDirectorIp == fusionDirector.HostIP); if (syncInstance != null) { var data = tcpMessage.Data; if (data != null) { syncInstance.DealNewAlarm(data); } else { HWLogger.GetFdNotifyLogger(fusionDirector.HostIP).Error($"Recieve new alarm:message analysis faild"); } } else { HWLogger.GetFdNotifyLogger(fusionDirector.HostIP).Info($"Recieve new alarm:can not find the syncInstance"); } }
/// <summary> /// Inserts the event. /// </summary> /// <param name="mpClass">The mp class.</param> /// <param name="eventData">The event data.</param> public void InsertEvent(ManagementPackClass mpClass, EventData eventData) { var logger = HWLogger.GetFdSdkLogger(eventData.FusionDirectorIp); try { var sn = eventData.AlarmSn.ToString(); MGroup.Instance.CheckConnection(); var logPre = $"[Sn={sn}] [OptType={eventData.OptType}] [LevelId={eventData.LevelId}] "; //logger.Info($"[Sn:{sn}] Start Deal Event.[{JsonConvert.SerializeObject(eventData)}]"); var obj = GetObjectByUnionId(mpClass, eventData.UnionId); if (obj == null) { logger.Warn($"{logPre} Can not find the MonitoringObject:{eventData.UnionId}"); return; } var isReady = CheckAndWaitHealthStateReady(mpClass, obj, eventData); if (!isReady) { logger.Warn($"{logPre} The MonitoringObject state is uninitialized.Drop the event."); return; } var eventHistory = obj.GetMonitoringEvents().ToList(); switch (eventData.OptType) { case "1": #region 告警 //如果不存在,则插入 //如果上次安装时的事件未清除,本次同步后,一个sn会存在两条数据,需要取最新添加的一条 var existEvent = eventHistory.OrderByDescending(x => x.TimeAdded).FirstOrDefault(x => x.GetAlarmData().Sn.ToString() == sn); if (existEvent == null || existEvent.TimeAdded < MGroup.Instance.MpInstallTime) { obj.InsertCustomMonitoringEvent(eventData.ToCustomMonitoringEvent()); logger.Info($"{logPre}Insert new Event."); if (eventData.LevelId == EventLogEntryType.Error || eventData.LevelId == EventLogEntryType.Warning) { if (eventData.AlarmData.Status == "Cleared") //如果告警是清除状态 { logger.Info($"{logPre}Need to close Event when insert."); Task.Run(() => { int i = 0; while (i < 10) { i++; Thread.Sleep(TimeSpan.FromMinutes(1)); var alertToClose = obj.GetMonitoringAlerts().FirstOrDefault(x => x.CustomField5 == sn); if (alertToClose != null) { alertToClose.ResolutionState = this.CloseState.ResolutionState; var comment = !string.IsNullOrEmpty(eventData.AlarmData.ClearType) ? eventData.AlarmData.ClearType : eventData.AlarmData.Additional; alertToClose.Update(comment); logger.Info($"{logPre}Close Event success."); break; } } }); } } } else { #region 存在则更新 var alertHistory = obj.GetMonitoringAlerts(); var alertToUpdate = alertHistory.FirstOrDefault(x => x.CustomField5 == sn); if (alertToUpdate != null) { alertToUpdate.CustomField2 = eventData.AlarmData.AlarmId; alertToUpdate.CustomField3 = eventData.AlarmData.AlarmName.Split('#').Last(); alertToUpdate.CustomField4 = eventData.AlarmData.ResourceId; alertToUpdate.CustomField5 = eventData.AlarmData.Sn.ToString(); alertToUpdate.CustomField7 = eventData.AlarmData.Additional; alertToUpdate.CustomField8 = eventData.AlarmData.Suggestion; alertToUpdate.CustomField8 = eventData.AlarmData.OccurTime; alertToUpdate.CustomField9 = eventData.AlarmData.PossibleCause; alertToUpdate.CustomField10 = eventData.AlarmData.Effect; alertToUpdate.Update(eventData.AlarmData.Additional); logger.Debug($"{logPre}Update Event."); if (eventData.AlarmData.Status == "Cleared") //如果告警是清除状态 { alertToUpdate.ResolutionState = this.CloseState.ResolutionState; alertToUpdate.Update(eventData.AlarmData.Additional); logger.Info($"{logPre}Close Alert On Update Event."); } else { //如果原来的告警是关闭状态,本次是Open,则重新打开告警 if (alertToUpdate.ResolutionState == this.CloseState.ResolutionState) { alertToUpdate.ResolutionState = this.NewState.ResolutionState; alertToUpdate.Update(eventData.AlarmData.Additional); logger.Info($"{logPre}Reopen Alert On Update Event."); } } } else { logger.Warn($"{logPre}Ingore Event.Can not find the alert."); } #endregion } #endregion break; case "2": #region 清除告警 if (eventData.LevelId == EventLogEntryType.Error || eventData.LevelId == EventLogEntryType.Warning) //清除告警 { var alertHistory = obj.GetMonitoringAlerts(); var alertToClose = alertHistory.FirstOrDefault(x => x.CustomField5 == sn); if (alertToClose != null) { alertToClose.ResolutionState = this.CloseState.ResolutionState; var comment = !string.IsNullOrEmpty(eventData.AlarmData.ClearType) ? eventData.AlarmData.ClearType : eventData.AlarmData.Additional; alertToClose.Update(comment); logger.Info($"{logPre}Close Event."); } else { logger.Warn($"{logPre}Ingore Event.Can not find the alert."); } } else { logger.Warn($"{logPre}Ignore Event."); //忽略事件 } #endregion break; case "3": //肯定是事件 #region 插入事件 if (eventData.LevelId == EventLogEntryType.Information) { var existAlarmDatas = obj.GetMonitoringEvents().Select(x => x.GetAlarmData()).ToList(); //插入事件 if (existAlarmDatas.All(x => x.Sn.ToString() != sn)) { logger.Info($"{logPre}Insert new Event."); obj.InsertCustomMonitoringEvent(eventData.ToCustomMonitoringEvent()); } else { logger.Warn($"{logPre}Ignore Event.The event is exist."); //忽略已存在 } } else { logger.Warn($"{logPre}Ignore Event."); //忽略非事件 } #endregion break; default: logger.Error($"{logPre}Unknown OptType."); break; } } catch (Exception ex) { logger.Error(ex); } }
/// <summary> /// Inserts the event. /// </summary> /// <param name="mpClass">The mp class.</param> /// <param name="eventData">The event data.</param> /// <param name="eSightIp">The e sight ip.</param> public void InsertEvent(ManagementPackClass mpClass, EventData eventData, string eSightIp) { var logger = HWLogger.GetESightSdkLogger(eventData.ESightIp); try { var sn = eventData.AlarmSn.ToString(); MGroup.Instance.CheckConnection(); var logPre = $"[Sn={sn}] [OptType={eventData.OptType}] [LevelId={eventData.LevelId.ToString()}] "; HWLogger.GetESightSdkLogger(eSightIp).Info($"Start Insert Event.[{JsonUtil.SerializeObject(eventData)}]"); var obj = GetObjectByDeviceId(mpClass, eventData.DeviceId); if (obj == null) { logger.Warn($"{logPre} Can not find the MonitoringObject:{eventData.DeviceId}"); return; } var isReady = CheckAndWaitHealthStateReady(mpClass, obj, eventData.DeviceId, eSightIp); if (!isReady) { logger.Warn($"{logPre} The MonitoringObject state is uninitialized.Drop the event."); return; } var eventHistory = obj.GetMonitoringEvents().Where(x => x.EventData.Contains("<AlarmData>")).ToList(); switch (eventData.OptType) { case 1: case 5: #region 新增/修改 告警-告警会重复上报 //如果不存在,则插入 //如果上次安装时的事件未清除,本次同步后,一个sn会存在两条数据,需要取最新添加的一条 var existEvent = eventHistory.OrderByDescending(x => x.TimeAdded).FirstOrDefault(x => x.GetAlarmData().AlarmSN.ToString() == sn); if (existEvent == null || existEvent.TimeAdded < MGroup.Instance.MpInstallTime) { obj.InsertCustomMonitoringEvent(eventData.ToCustomMonitoringEvent()); logger.Info($"{logPre}Insert new Event."); if (eventData.LevelId == EventLogEntryType.Error || eventData.LevelId == EventLogEntryType.Warning) { if (eventData.AlarmData.Cleared) //如果告警是清除状态 { logger.Info($"{logPre}Need to close Event when insert."); Task.Run(() => { int i = 0; while (i < 10) { i++; Thread.Sleep(TimeSpan.FromMinutes(1)); var alertToClose = obj.GetMonitoringAlerts().FirstOrDefault(x => x.CustomField6 == sn); if (alertToClose != null) { alertToClose.ResolutionState = this.CloseState.ResolutionState; var comment = eventData.AlarmData.ClearedType.ToString(); alertToClose.Update(comment); logger.Info($"{logPre}Close Event success."); break; } } }); } } } else { #region 存在则更新 var alertHistory = obj.GetMonitoringAlerts(); var alertToUpdate = alertHistory.FirstOrDefault(x => x.CustomField6 == sn); if (alertToUpdate != null) { alertToUpdate.CustomField2 = eventData.AlarmData.AdditionalInformation; alertToUpdate.CustomField3 = eventData.AlarmData.AdditionalText; alertToUpdate.CustomField4 = eventData.AlarmData.AlarmId.ToString(); alertToUpdate.CustomField5 = eventData.AlarmData.AlarmName; alertToUpdate.CustomField6 = eventData.AlarmData.AlarmSN.ToString(); alertToUpdate.CustomField7 = TimeHelper.StampToDateTime(eventData.AlarmData.ArrivedTime.ToString()).ToString(); alertToUpdate.CustomField8 = eventData.AlarmData.DevCsn.ToString(); alertToUpdate.CustomField9 = eventData.AlarmData.EventType.ToString(); alertToUpdate.CustomField10 = eventData.AlarmData.MoName; alertToUpdate.Update(eventData.AlarmData.AdditionalInformation); logger.Debug($"{logPre}Update Event."); if (eventData.AlarmData.Cleared) //如果告警是清除状态 { alertToUpdate.ResolutionState = this.CloseState.ResolutionState; alertToUpdate.Update(eventData.AlarmData.AdditionalInformation); logger.Info($"{logPre}Close Alert On Update Event."); } else { //如果原来的告警是关闭状态,本次是Open,则重新打开告警 if (alertToUpdate.ResolutionState == this.CloseState.ResolutionState) { alertToUpdate.ResolutionState = this.NewState.ResolutionState; alertToUpdate.Update(eventData.AlarmData.AdditionalInformation); logger.Info($"{logPre}Reopen Alert On Update Event."); } } } else { logger.Warn($"{logPre}Ingore Event.Can not find the alert."); } #endregion } #endregion break; case 2: #region 清除告警 var _alertHistory = obj.GetMonitoringAlerts(); var _alertToClose = _alertHistory.FirstOrDefault(x => x.CustomField6 == sn); if (_alertToClose != null) { _alertToClose.ResolutionState = this.CloseState.ResolutionState; var comment = eventData.AlarmData.ClearedType.ToString(); _alertToClose.Update(comment); logger.Info($"{logPre}Close Event."); } else { logger.Warn($"{logPre}Ingore Event.Can not find the alert."); } #endregion break; case 6: #region 插入事件 if (eventData.LevelId == EventLogEntryType.Information) { var existAlarmDatas = obj.GetMonitoringEvents().Where(x => x.EventData.StartsWith("<AlarmData")).Select(x => x.GetAlarmData()).ToList(); //插入事件 if (existAlarmDatas.All(x => x.AlarmSN.ToString() != sn)) { logger.Info($"{logPre}Insert new Event."); obj.InsertCustomMonitoringEvent(eventData.ToCustomMonitoringEvent()); } else { logger.Warn($"{logPre}Ignore Event.The event is exist."); //忽略已存在 } } else { logger.Warn($"{logPre}Ignore Event."); //忽略非事件 } break; #endregion default: HWLogger.GetESightSdkLogger(eSightIp).Error($"Unknown optType {eventData.OptType}"); break; } } catch (Exception ex) { HWLogger.GetESightSdkLogger(eSightIp).Error(ex); } }
/// <summary> /// The update kun lun. /// </summary> /// <param name="model">The model.</param> /// <param name="isPolling">是否是轮询</param> /// <exception cref="System.Exception"></exception> /// <exception cref="Exception">Can not find the server</exception> public void UpdateKunLun(KunLunServer model, bool isPolling) { try { HWLogger.GetESightSdkLogger(model.ESight).Debug($"Start UpdateKunLun.[{model.DN}] [isPolling:{isPolling}]"); var oldServer = this.GetKunLunServer(model.DeviceId); if (oldServer == null) { throw new Exception($"Can not find the server:{model.DN}"); } var propertys = this.KunLunClass.PropertyCollection; // 获取到class的属性 var discoveryData = new IncrementalDiscoveryData(); oldServer[this.DisplayNameField].Value = model.Name; if (model.Status != "-3") { oldServer[propertys["Status"]].Value = model.StatusTxt; } oldServer[propertys["Vendor"]].Value = "HUAWEI"; oldServer[propertys["UUID"]].Value = model.UUID; oldServer[propertys["IPAddress"]].Value = model.IpAddress; if (isPolling) { oldServer[propertys["Manufacturer"]].Value = model.Manufacturer; } // oldBlade[propertys["iBMCVersion"]].Value = model.Version; oldServer[propertys["CPLDVersion"]].Value = string.Empty; oldServer[propertys["UbootVersion"]].Value = string.Empty; oldServer[propertys["ProductSn"]].Value = model.ProductSN; oldServer[propertys["MemoryCapacity"]].Value = model.MemoryCapacity; oldServer[propertys["CPUNums"]].Value = model.CPUNums; oldServer[propertys["CPUCores"]].Value = model.CPUCores; // oldBlade[propertys["ServerName"]].Value = model.ServerName; oldServer[propertys["BMCMacAddr"]].Value = model.BmcMacAddr; oldServer[propertys["eSight"]].Value = model.ESight; discoveryData.Add(oldServer); var fanGroup = oldServer.GetRelatedMonitoringObjects(this.FanGroupClass).First(); discoveryData.Add(fanGroup); var relatedFanObjects = fanGroup.GetRelatedMonitoringObjects(this.FanClass); var deleteFan = relatedFanObjects.Where( x => model.FanList.All(y => y.UUID != x[this.FanClass.PropertyCollection["UUID"]].Value.ToString())) .ToList(); deleteFan.ForEach(x => { discoveryData.Remove(x); }); model.FanList.ForEach( x => { var oldFan = relatedFanObjects.FirstOrDefault(y => y[this.FanClass.PropertyCollection["UUID"]].Value.ToString() == x.UUID); if (oldFan == null) { var newFan = this.CreateFan(x); newFan[this.PartGroupKey].Value = fanGroup[this.PartGroupKey].Value; newFan[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(newFan); } else { this.UpdateFan(x, oldFan); discoveryData.Add(oldFan); } }); #region PSU var psuGroup = oldServer.GetRelatedMonitoringObjects(this.PowerSupplyGroupClass).First(); discoveryData.Add(psuGroup); var relatedPsuObjects = psuGroup.GetRelatedMonitoringObjects(this.PowerSupplyClass); var deletePsu = relatedPsuObjects.Where( x => model.PowerSupplyList.All( y => y.UUID != x[this.PowerSupplyClass.PropertyCollection["UUID"]].Value.ToString())).ToList(); deletePsu.ForEach(x => { discoveryData.Remove(x); }); model.PowerSupplyList.ForEach( x => { var oldPsu = relatedPsuObjects.FirstOrDefault(y => y[this.PowerSupplyClass.PropertyCollection["UUID"]].Value.ToString() == x.UUID); if (oldPsu == null) { var newpsu = this.CreatePowerSupply(x); newpsu[this.PartGroupKey].Value = psuGroup[this.PartGroupKey].Value; newpsu[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(newpsu); } else { this.UpdatePowerSupply(x, oldPsu); discoveryData.Add(oldPsu); } }); #endregion #region Disk var diskGroup = oldServer.GetRelatedMonitoringObjects(this.PhysicalDiskGroupClass).First(); discoveryData.Add(diskGroup); var relatedDiskObjects = diskGroup.GetRelatedMonitoringObjects(this.PhysicalDiskClass); var deleteDisk = relatedDiskObjects.Where( x => model.DiskList.All( y => y.UUID != x[this.PhysicalDiskClass.PropertyCollection["UUID"]].Value.ToString())).ToList(); deleteDisk.ForEach(x => { discoveryData.Remove(x); }); model.DiskList.ForEach( y => { var oldDisk = relatedDiskObjects.FirstOrDefault(z => z[this.PhysicalDiskClass.PropertyCollection["UUID"]].Value.ToString() == y.UUID); if (oldDisk == null) { var newDisk = this.CreateDisk(y); newDisk[this.HuaweiServerKey].Value = model.DeviceId; newDisk[this.PartGroupKey].Value = diskGroup[this.PartGroupKey].Value; discoveryData.Add(newDisk); } else { this.UpdateDisk(y, oldDisk); discoveryData.Add(oldDisk); } }); #endregion #region Raid var raidGroup = oldServer.GetRelatedMonitoringObjects(this.RaidGroupClass).First(); discoveryData.Add(raidGroup); var relatedRaidObjects = raidGroup.GetRelatedMonitoringObjects(this.RaidClass); var deleteRaid = relatedRaidObjects.Where( x => model.RaidList.All( y => y.UUID != x[this.RaidClass.PropertyCollection["UUID"]].Value.ToString())) .ToList(); deleteRaid.ForEach(x => { discoveryData.Remove(x); }); model.RaidList.ForEach( y => { var oldRaid = relatedRaidObjects.FirstOrDefault(z => z[this.RaidClass.PropertyCollection["UUID"]].Value.ToString() == y.UUID); if (oldRaid == null) { var newRaid = this.CreateRaidControl(y); newRaid[this.HuaweiServerKey].Value = model.DeviceId; newRaid[this.PartGroupKey].Value = raidGroup[this.PartGroupKey].Value; discoveryData.Add(newRaid); } else { this.UpdateRaidControl(y, oldRaid); discoveryData.Add(oldRaid); } }); #endregion discoveryData.Overwrite(this.MontioringConnector); } catch (Exception e) { HWLogger.GetESightSdkLogger(model.ESight).Error($"Update KunLun Error.[{model.DN}] [isPolling:{isPolling}]", e); } }
/// <summary> /// The on log. /// </summary> /// <param name="data"> /// The data. /// </param> private static void OnLog(string data) { HWLogger.GetInstallLogger().Info(data); }
/// <summary> /// The insert detials. /// </summary> /// <param name="model"> /// The model. /// </param> private void InsertDetials(KunLunServer model) { try { HWLogger.GetESightSdkLogger(model.ESight).Debug($"Insert KunLun:{model.DN}"); var discoveryData = new IncrementalDiscoveryData(); #region KunLunServer var kunLunServer = this.CreateKunLunServer(model); discoveryData.Add(kunLunServer); #endregion #region Fan var fanGroup = this.CreateLogicalGroup(this.FanGroupClass, model.DeviceId); discoveryData.Add(fanGroup); model.FanList.ForEach( x => { var fan = this.CreateFan(x); fan[this.PartGroupKey].Value = fanGroup[this.PartGroupKey].Value; fan[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(fan); }); #endregion #region PSU var powerSupplyGroup = this.CreateLogicalGroup(this.PowerSupplyGroupClass, model.DeviceId); discoveryData.Add(powerSupplyGroup); model.PowerSupplyList.ForEach( x => { var powerSupply = this.CreatePowerSupply(x); powerSupply[this.PartGroupKey].Value = powerSupplyGroup[this.PartGroupKey].Value; powerSupply[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(powerSupply); }); #endregion #region Raid var raidGroup = this.CreateLogicalGroup(this.RaidGroupClass, model.DeviceId); discoveryData.Add(raidGroup); model.RaidList.ForEach( y => { var raid = this.CreateRaidControl(y); raid[this.PartGroupKey].Value = raidGroup[this.PartGroupKey].Value; raid[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(raid); }); #endregion #region Disk var diskGroup = this.CreateLogicalGroup(this.PhysicalDiskGroupClass, model.DeviceId); discoveryData.Add(diskGroup); model.DiskList.ForEach( x => { var disk = this.CreateDisk(x); disk[this.PartGroupKey].Value = diskGroup[this.PartGroupKey].Value; disk[this.HuaweiServerKey].Value = model.DeviceId; discoveryData.Add(disk); }); #endregion discoveryData.Commit(this.MontioringConnector); } catch (Exception e) { HWLogger.GetESightSdkLogger(model.ESight).Error($"Insert KunLun Error:{model.DN}", e); } }