Пример #1
0
        protected Event CreateUnitTestResultEvent(
            IUnitTestCacheReadObject unitTest,
            SendUnitTestResultRequestData data,
            DateTime processDate)
        {
            data.Message = data.Message ?? string.Empty;

            if (data.Message.Length > 255)
            {
                data.Message = data.Message.Substring(0, 255);
            }

            var importance = EventImportanceHelper.Get(data.Result ?? UnitTestResult.Unknown);

            var cache        = new AccountCache(unitTest.AccountId);
            var unittestType = cache.UnitTestTypes.Read(unitTest.TypeId);

            var actualInterval = unitTest.ActualTime                                        // сначала берем из настроек проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(unittestType.ActualTimeSecs) // потом из настроек типа проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(data.ActualIntervalSeconds)  // потом из сообщения
                                 ?? TimeSpan.FromMinutes(5);                                // по умолчанию 5 мин

            var actualDate = processDate + actualInterval;

            var joinKeyHash = data.ReasonCode ?? 0;

            var result = new Event()
            {
                Id             = Guid.NewGuid(),
                Count          = 1,
                JoinKeyHash    = joinKeyHash,
                Importance     = importance,
                OwnerId        = unitTest.Id,
                ActualDate     = actualDate,
                CreateDate     = DateTime.Now,
                LastUpdateDate = processDate,
                StartDate      = processDate,
                EndDate        = processDate,
                Message        = data.Message,
                EventTypeId    = SystemEventType.UnitTestResult.Id,
                Category       = EventCategory.UnitTestResult
            };

            if (data.Properties != null)
            {
                result.Properties = ApiConverter.GetEventProperties(data.Properties);
            }
            return(result);
        }
Пример #2
0
        public IBulbCacheReadObject Disable(Guid accountId, SetUnitTestDisableRequestData requestData)
        {
            var unitTestId = requestData.UnitTestId;
            var cache      = new AccountCache(accountId);
            IUnitTestCacheReadObject unitTestRead = null;

            // изменим юнит-тест
            using (var unitTest = cache.UnitTests.Write(unitTestId.Value))
            {
                unitTestRead            = unitTest;
                unitTest.Enable         = false;
                unitTest.DisableToDate  = requestData.ToDate;
                unitTest.DisableComment = requestData.Comment;
                unitTest.BeginSave();
            }

            // обновим колбаски
            return(UpdateEnableOrDisableStatusData(unitTestRead));
        }
Пример #3
0
        protected IBulbCacheReadObject UpdateEnableOrDisableStatusData(IUnitTestCacheReadObject unitTest)
        {
            var statusService         = Context.BulbService;
            IBulbCacheReadObject data = null;
            var processDate           = DateTime.Now;

            if (unitTest.CanProcess)
            {
                var unknownSignal = BulbSignal.CreateUnknown(unitTest.AccountId, processDate);
                data = statusService.SetSignal(unitTest.StatusDataId, unknownSignal);
            }
            else
            {
                var disableSignal = BulbSignal.CreateDisable(unitTest.AccountId, processDate);
                data = statusService.SetSignal(unitTest.StatusDataId, disableSignal);
            }
            Context.ComponentService.CalculateAllStatuses(unitTest.AccountId, unitTest.ComponentId);
            return(data);
        }
Пример #4
0
        public IBulbCacheReadObject Enable(Guid accountId, Guid unitTestId)
        {
            var cache = new AccountCache(accountId);
            IUnitTestCacheReadObject unitTestRead = null;

            // изменим юнит-тест
            using (var unitTest = cache.UnitTests.Write(unitTestId))
            {
                unitTestRead    = unitTest;
                unitTest.Enable = true;
                unitTest.BeginSave();
            }

            // обновим колбаски
            var statusService = Context.BulbService;
            var processDate   = DateTime.Now;
            var unknownSignal = BulbSignal.CreateUnknown(accountId, processDate);
            var data          = statusService.SetSignal(unitTestRead.StatusDataId, unknownSignal);

            Context.ComponentService.CalculateAllStatuses(accountId, unitTestRead.ComponentId);
            return(data);
        }
Пример #5
0
 public static GetOrCreateUnitTestResponseData GetOrCreateUnitTestResponseData(IUnitTestCacheReadObject unitTest)
 {
     if (unitTest == null)
     {
         return(null);
     }
     return(new GetOrCreateUnitTestResponseData()
     {
         Id = unitTest.Id,
         TypeId = unitTest.TypeId,
         SystemName = unitTest.SystemName,
         DisplayName = unitTest.DisplayName
     });
 }
Пример #6
0
        protected IBulbCacheReadObject GetUnitTestResultInternal(
            IUnitTestCacheReadObject unitTest,
            DateTime processDate)
        {
            if (unitTest == null)
            {
                throw new ArgumentNullException("unitTest");
            }

            // обновим галочку "включено"
            if (unitTest.Enable == false &&
                unitTest.DisableToDate.HasValue &&
                unitTest.DisableToDate < DateTime.Now)
            {
                using (var unitTestWrite = AllCaches.UnitTests.Write(unitTest))
                {
                    unitTestWrite.Enable = true;
                    unitTestWrite.BeginSave();
                    unitTest = unitTestWrite;
                }
            }

            var statusService = Context.BulbService;
            var data          = statusService.GetRaw(unitTest.AccountId, unitTest.StatusDataId);

            // если надо выключить
            if (unitTest.CanProcess == false && data.Status != MonitoringStatus.Disabled)
            {
                return(UpdateEnableOrDisableStatusData(unitTest));
            }

            // если надо включить
            if (unitTest.CanProcess && data.Status == MonitoringStatus.Disabled)
            {
                return(UpdateEnableOrDisableStatusData(unitTest));
            }

            // проверим актуальность
            if (data.Actual(processDate))
            {
                return(data);
            }

            // значение неактуальное
            // сохраняем пробел (событие результата теста)

            var cache        = new AccountCache(unitTest.AccountId);
            var unittestType = cache.UnitTestTypes.Read(unitTest.TypeId);

            var noSignalImportance = ImportanceHelper.Get(unitTest.NoSignalColor) ??
                                     ImportanceHelper.Get(unittestType.NoSignalColor) ??
                                     (unitTest.IsSystemType
                ? EventImportance.Unknown
                : EventImportance.Alarm);

            var noSignalEvent = new Event()
            {
                Id             = Guid.NewGuid(),
                Message        = "Нет сигнала",
                OwnerId        = unitTest.Id,
                ActualDate     = EventHelper.InfiniteActualDate,
                Category       = EventCategory.UnitTestResult,
                Count          = 1,
                CreateDate     = processDate,
                LastUpdateDate = processDate,
                StartDate      = data.ActualDate,
                EndDate        = processDate,
                IsSpace        = true,
                EventTypeId    = SystemEventType.UnitTestResult.Id,
                Importance     = noSignalImportance
            };

            return(SaveResultEvent(processDate, unitTest, noSignalEvent));
        }
Пример #7
0
        protected IBulbCacheReadObject SaveResultEvent(
            DateTime processDate,
            IUnitTestCacheReadObject unitTest,
            Event newEvent)
        {
            var request = new AccountCacheRequest()
            {
                AccountId = unitTest.AccountId,
                ObjectId  = unitTest.StatusDataId
            };

            using (var statusData = AllCaches.StatusDatas.Write(request))
            {
                // сохраним результаты
                var eventService = Context.EventService;
                IEventCacheReadObject lastEvent = null;
                if (statusData.LastEventId.HasValue)
                {
                    lastEvent = eventService.GetEventCacheOrNullById(
                        unitTest.AccountId,
                        statusData.LastEventId.Value);
                }

                // для системных проверок пробелы должны быть серыми,
                // чтобы из-за простоев агента зидиума не красить пользовательские проверки
                var noSignalImportance = unitTest.IsSystemType
                    ? EventImportance.Unknown
                    : EventImportance.Alarm;

                if (lastEvent == null)
                {
                    // todo не понятно нужно ли в результаты проверок вставлять пробелы?
                    // TryAddSpaceResultEvent(unitTest, newEvent, noSignalImportance);
                }
                else
                {
                    // например, чтобы обрезать бесконечную актуальность у события "нет сигнала"
                    if (lastEvent.ActualDate > newEvent.StartDate)
                    {
                        if (AllCaches.Events.ExistsInStorage(lastEvent))
                        {
                            using (var wLastEvent = AllCaches.Events.Write(lastEvent))
                            {
                                wLastEvent.ActualDate = newEvent.StartDate;
                                wLastEvent.BeginSave();
                            }
                        }
                    }
                }

                // синхронная вставка
                // асинхронное создание объектов сильно усложняет код, поэтому будет создавать всё синхронно
                eventService.Add(unitTest.AccountId, newEvent);

                // асинхронная вставка
                //var newEventCache = EventCacheWriteObject.CreateForAdd(newEvent);
                //AllCaches.Events.AddNew(newEventCache);

                using (var wUnitTest = AllCaches.UnitTests.Write(unitTest))
                {
                    wUnitTest.LastExecutionDate = newEvent.EndDate;

                    // расчитаем время следующего выполнения
                    if (unitTest.PeriodSeconds > 0)
                    {
                        var nextTime = wUnitTest.NextDate ?? processDate;
                        var period   = TimeSpan.FromSeconds(wUnitTest.PeriodSeconds.Value);
                        while (nextTime <= processDate)
                        {
                            nextTime = nextTime + period;
                        }
                        wUnitTest.NextDate = nextTime;
                    }
                    wUnitTest.BeginSave();
                }

                // обновим статус
                var statusService = Context.BulbService;
                var signal        = BulbSignal.Create(processDate, newEvent, noSignalImportance, unitTest.AccountId);
                var newStatus     = statusService.SetSignal(unitTest.StatusDataId, signal);

                return(newStatus);
            }
        }
Пример #8
0
        public void UpdateUnitTest(Guid accountId, UpdateUnitTestRequestData data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }
            if (data.UnitTestId == null)
            {
                throw new ParameterRequiredException("UnitTestId");
            }
            if (data.ComponentId == null)
            {
                throw new ParameterRequiredException("ComponentId");
            }
            if (data.UnitTestId == Guid.Empty)
            {
                throw new ParameterErrorException("UnitTestId не может быть Guid.Empty");
            }
            if (data.DisplayName == null)
            {
                throw new ParameterRequiredException("DisplayName");
            }
            if (string.IsNullOrWhiteSpace(data.DisplayName))
            {
                throw new ParameterErrorException("DisplayName не может быть пустым");
            }
            //if (data.ErrorColor == null)
            //{
            //    throw new ParameterRequiredException("ErrorColor");
            //}

            // SystemName сейчас не настраивается через GUI

            //if (data.SystemName == null)
            //{
            //    throw new ParameterRequiredException("SystemName");
            //}

            //получим компонент, чтобы убедится, что он принадлежит аккаунту
            var req = new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = data.ComponentId.Value
            };
            var component = AllCaches.Components.Find(req);

            if (component == null)
            {
                throw new UnknownComponentIdException(data.ComponentId.Value, accountId);
            }

            var request = new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = data.UnitTestId.Value
            };

            // сохраним изменения
            IUnitTestCacheReadObject unitTestCache = null;

            using (var unitTest = AllCaches.UnitTests.Write(request))
            {
                unitTestCache = unitTest;

                // период выполнения проверки
                if (unitTest.IsSystemType)
                {
                    // не для всех системных проверок можно указывать период (для проверки домена нельзя)
                    if (SystemUnitTestTypes.CanEditPeriod(unitTest.TypeId))
                    {
                        if (data.PeriodSeconds == null)
                        {
                            throw new ParameterRequiredException("Period");
                        }
                        if (data.PeriodSeconds.Value < 60)
                        {
                            throw new ParameterErrorException("Период проверки НЕ может быть меньше 1 минуты");
                        }
                        unitTest.PeriodSeconds = (int)data.PeriodSeconds.Value;
                    }

                    // чтобы выполнить проверку прямо сейчас с новыми параметрами и увидеть результат
                    unitTest.NextDate = DateTime.Now;
                }

                unitTest.DisplayName   = data.DisplayName;
                unitTest.ComponentId   = data.ComponentId.Value;
                unitTest.ErrorColor    = data.ErrorColor;
                unitTest.NoSignalColor = data.NoSignalColor;
                unitTest.ActualTime    = TimeSpanHelper.FromSeconds(data.ActualTime);

                if (data.SimpleMode.HasValue)
                {
                    unitTest.SimpleMode = data.SimpleMode.Value;
                }

                unitTest.BeginSave();
            }

            // ждем сохранения в кэше
            unitTestCache.WaitSaveChanges();
        }