Ejemplo n.º 1
0
        protected IComponentCacheReadObject RecalculateComponentStatuses(IComponentCacheReadObject component)
        {
            var accountId = component.AccountId;
            var cache     = new AccountCache(accountId);
            IComponentCacheReadObject result = component;

            // обновим ParentEnable
            if (component.ParentId.HasValue)
            {
                var parent = cache.Components.Read(component.ParentId.Value);
                if (parent.CanProcess != component.ParentEnable)
                {
                    using (var componentWrite = cache.Components.Write(component))
                    {
                        componentWrite.ParentEnable = parent.CanProcess;
                        componentWrite.BeginSave();
                        component = componentWrite;
                    }
                    UpdateParentEnableFlags(component, true);
                }
            }

            // если время выключения истекло, то включим компонент
            if (component.Enable == false &&
                component.DisableToDate.HasValue &&
                component.DisableToDate < DateTime.Now)
            {
                using (var componentWrite = cache.Components.Write(component))
                {
                    componentWrite.Enable = true;
                    componentWrite.BeginSave();
                    component = componentWrite;
                    result    = component;
                }
                UpdateParentEnableFlags(component, true);
            }

            var statusService  = Context.BulbService;
            var allStatusesIds = component.GetAllStatusesIds();
            var allStatuses    = allStatusesIds.Select(cache.StatusDatas.Read).ToList();

            // если надо выключить
            if (component.CanProcess == false && allStatuses.Any(x => x.Status != Api.MonitoringStatus.Disabled))
            {
                // выключим все колбаски
                // выжно выключить их в этом порядке, чтобы не создать лишних событий колбасок-родителей
                var disableSignal = BulbSignal.CreateDisable(accountId, DateTime.Now);
                statusService.SetSignal(component.ExternalStatusId, disableSignal);
                statusService.SetSignal(component.ChildComponentsStatusId, disableSignal);
                statusService.SetSignal(component.InternalStatusId, disableSignal);
                statusService.SetSignal(component.EventsStatusId, disableSignal);
                statusService.SetSignal(component.UnitTestsStatusId, disableSignal);
                statusService.SetSignal(component.MetricsStatusId, disableSignal);
            }

            // обновим тесты
            var allUnitTestsStatusDataIds = new List <Guid>();

            foreach (var unitTestRef in component.UnitTests.GetAll())
            {
                using (var unitTest = cache.UnitTests.Write(unitTestRef.Id))
                {
                    if (unitTest.IsDeleted)
                    {
                        continue;
                    }
                    allUnitTestsStatusDataIds.Add(unitTest.StatusDataId);
                    if (unitTest.ParentEnable != component.CanProcess)
                    {
                        unitTest.ParentEnable = component.CanProcess;
                        unitTest.BeginSave();
                    }
                }
                Context.UnitTestService.GetUnitTestResult(component.AccountId, unitTestRef.Id);
            }

            // обновим метрики
            var  allMetricsStatusDataIds = new List <Guid>();
            Guid metricTypeId;

            foreach (var metricRef in component.Metrics.GetAll())
            {
                using (var metric = cache.Metrics.Write(metricRef.Id))
                {
                    if (metric.IsDeleted)
                    {
                        continue;
                    }
                    metricTypeId = metric.MetricTypeId;
                    allMetricsStatusDataIds.Add(metric.StatusDataId);
                    if (metric.ParentEnable != component.CanProcess)
                    {
                        metric.ParentEnable = component.CanProcess;
                        metric.BeginSave();
                    }
                }
                Context.MetricService.GetActualMetric(component.AccountId, component.Id, metricTypeId);
            }

            // проверим, нужно ли обновить детей
            var childComponentsStatusDataIds = new List <Guid>();

            foreach (var childRef in component.Childs.GetAll())
            {
                using (var child = cache.Components.Write(childRef.Id))
                {
                    if (child.IsDeleted)
                    {
                        continue;
                    }
                    childComponentsStatusDataIds.Add(child.ExternalStatusId);
                    if (child.ParentEnable != component.CanProcess)
                    {
                        child.ParentEnable = component.CanProcess;
                        child.BeginSave();
                    }
                }
                GetComponentExternalState(component.AccountId, childRef.Id);
            }

            if (component.CanProcess)
            {
                // обновим колбасу тестов явно (вдруг нет ни одного теста)
                statusService.CalculateByChilds(accountId, component.UnitTestsStatusId, allUnitTestsStatusDataIds);

                // обновим колбасу метрик явно (вдруг нет ни одной метрики)
                statusService.CalculateByChilds(accountId, component.MetricsStatusId, allMetricsStatusDataIds);

                // обновим колбасу событий
                CalculateComponentEventsStatus(accountId, component.EventsStatusId);

                // обновим внутренний статус
                var childsForInternal = new List <Guid>()
                {
                    component.EventsStatusId,
                    component.UnitTestsStatusId,
                    component.MetricsStatusId
                };
                statusService.CalculateByChilds(accountId, component.InternalStatusId, childsForInternal);

                // обновим колбасу дочерних
                statusService.CalculateByChilds(accountId, component.ChildComponentsStatusId, childComponentsStatusDataIds);

                // обновим внешний статус
                var childsForExternal = new List <Guid>()
                {
                    component.InternalStatusId,
                    component.ChildComponentsStatusId
                };
                statusService.CalculateByChilds(accountId, component.ExternalStatusId, childsForExternal);
            }
            return(result);
        }
Ejemplo n.º 2
0
        public void DeleteComponent(Guid accountId, Guid componentId)
        {
            var cache = new AccountCache(accountId);
            IComponentCacheReadObject component      = null;
            ComponentCacheWriteObject componentWrite = null;

            // Удаление компонента
            using (componentWrite = cache.Components.Write(componentId))
            {
                if (componentWrite.IsDeleted)
                {
                    return;
                }
                if (componentWrite.IsRoot)
                {
                    throw new UserFriendlyException("Нельзя удалить root компонент");
                }
                componentWrite.IsDeleted = true;
                componentWrite.BeginSave();
            }
            componentWrite.WaitSaveChanges(TimeSpan.FromSeconds(30));
            component = componentWrite;

            var checker = AccountLimitsCheckerManager.GetCheckerForAccount(accountId);

            checker.RefreshComponentsCount();

            // удаляем колбаски
            foreach (var statusDataId in component.GetAllStatusesIds())
            {
                using (var statusData = cache.StatusDatas.Write(statusDataId))
                {
                    statusData.IsDeleted = true;
                    statusData.BeginSave();
                }
            }

            // Удаление метрик
            foreach (var meticRef in component.Metrics.GetAll())
            {
                using (var metric = cache.Metrics.Write(meticRef.Id))
                {
                    metric.IsDeleted = true;
                    metric.BeginSave();

                    // удаление колбаски метрики
                    using (var metricStatusData = cache.StatusDatas.Write(metric.StatusDataId))
                    {
                        metricStatusData.IsDeleted = true;
                        metricStatusData.BeginSave();
                    }
                }
            }

            // Удаление проверок
            foreach (var unitTestRef in component.UnitTests.GetAll())
            {
                using (var unitTest = cache.UnitTests.Write(unitTestRef.Id))
                {
                    unitTest.IsDeleted = true;
                    unitTest.BeginSave();

                    // удаление колбаски проверки
                    using (var metricStatusData = cache.StatusDatas.Write(unitTest.StatusDataId))
                    {
                        metricStatusData.IsDeleted = true;
                        metricStatusData.BeginSave();
                    }
                }
            }

            // Удаление вложенных компонентов
            foreach (var child in component.Childs.GetAll())
            {
                DeleteComponent(accountId, child.Id);
            }

            // Если есть родитель, обновим его статус
            if (component.ParentId.HasValue)
            {
                CalculateAllStatuses(accountId, component.ParentId.Value);
            }
        }