public Guid CreateMetric(Guid accountId, Guid componentId, Guid metricTypeId) { // получаем компонент var componentRequest = new AccountCacheRequest() { AccountId = accountId, ObjectId = componentId }; using (var component = AllCaches.Components.Write(componentRequest)) { var child = component.Metrics.FindByMetricTypeId(metricTypeId); if (child != null) { throw new UserFriendlyException("У компонента уже есть метрика данного типа"); } // сохраняем метрику в БД using (var accountDbContext = AccountDbContext.CreateFromAccountIdLocalCache(accountId)) { // Проверим лимиты var limitChecker = AccountLimitsCheckerManager.GetCheckerForAccount(accountId); limitChecker.CheckMaxMetrics(accountDbContext); var processDate = DateTime.Now; var metricId = Guid.NewGuid(); var statusData = Context.BulbService.CreateBulb( accountId, processDate, EventCategory.MetricStatus, metricId); // загрузим в новый контекст statusData = accountDbContext.Bulbs.Find(statusData.Id); var metric = new Metric() { Id = metricId, BeginDate = processDate, ActualDate = processDate.AddDays(1), ComponentId = component.Id, Enable = true, IsDeleted = false, MetricTypeId = metricTypeId, ParentEnable = component.CanProcess, StatusDataId = statusData.Id, //StatusData = statusData, CreateDate = DateTime.Now, Value = null }; statusData.MetricId = metric.Id; statusData.Metric = metric; var repository = accountDbContext.GetMetricRepository(); repository.Add(metric); accountDbContext.SaveChanges(); // обновим статистику лимитов limitChecker.RefreshMetricsCount(); // обновляем ссылки у компонента var metricReference = new CacheObjectReference(metric.Id, metricTypeId.ToString()); component.WriteMetrics.Add(metricReference); component.BeginSave(); return(metric.Id); } } }
protected Component Add(Component component, Guid accountId) { if (component == null) { throw new ArgumentNullException("component"); } component.CreatedDate = DateTime.Now; if (component.Parent != null) { if (component.ComponentTypeId == SystemComponentTypes.Root.Id) { throw new ResponseCodeException( ResponseCode.UnknownComponentTypeId, "Нельзя создавать экземпляры компонентов с типом Root"); } component.ParentId = component.Parent.Id; component.ParentEnable = component.Parent.CanProcess; var parentRequest = new AccountCacheRequest() { AccountId = accountId, ObjectId = component.Parent.Id }; var parent = AllCaches.Components.Find(parentRequest); if (parent == null) { throw new Exception("parent == null"); } var child = parent.Childs.FindByName(component.SystemName); if (child != null) { throw new Exception("У родителя уже есть компонент с таким SystemName"); } } component.ExternalStatus = CreateStatusData(component, Api.EventCategory.ComponentExternalStatus, accountId); component.InternalStatus = CreateStatusData(component, Api.EventCategory.ComponentInternalStatus, accountId); component.EventsStatus = CreateStatusData(component, Api.EventCategory.ComponentEventsStatus, accountId); component.UnitTestsStatus = CreateStatusData(component, Api.EventCategory.ComponentUnitTestsStatus, accountId); component.MetricsStatus = CreateStatusData(component, Api.EventCategory.ComponentMetricsStatus, accountId); component.ChildComponentsStatus = CreateStatusData(component, Api.EventCategory.ComponentChildsStatus, accountId); // обновим ссылку на компонент var statuses = component.GetAllStatuses(); foreach (var statusData in statuses) { statusData.ComponentId = component.Id; statusData.Component = component; } component.LogConfig = new LogConfig() { ComponentId = component.Id, Component = component, Enabled = true, IsFatalEnabled = true, IsErrorEnabled = true, IsWarningEnabled = true, IsInfoEnabled = true, IsDebugEnabled = true, IsTraceEnabled = true, LastUpdateDate = component.CreatedDate }; var accountDbContext = Context.GetAccountDbContext(accountId); accountDbContext.Components.Add(component); accountDbContext.SaveChanges(); // обновим в кэше ссылки на дочерние компоненты у родителя if (component.Parent != null) { var parentRequest = new AccountCacheRequest() { AccountId = accountId, ObjectId = component.Parent.Id }; using (var parent = AllCaches.Components.Write(parentRequest)) { var componentRef = new CacheObjectReference(component.Id, component.SystemName); parent.WriteChilds.Add(componentRef); parent.BeginSave(); } } return(component); }
public IUnitTestCacheReadObject GetOrCreateUnitTest(Guid accountId, GetOrCreateUnitTestRequestData data) { if (data == null) { throw new ArgumentNullException("data"); } if (string.IsNullOrEmpty(data.SystemName)) { throw new ParameterRequiredException("SystemName"); } if (data.ComponentId == null) { throw new ParameterRequiredException("ComponentId"); } if (data.UnitTestTypeId == null) { throw new ParameterRequiredException("UnitTestTypeId"); } var cache = new AccountCache(accountId); var componentId = data.ComponentId.Value; var systemName = data.SystemName; // проверим, что тип проверки существует var unitTestTypeId = data.UnitTestTypeId.Value; if (!SystemUnitTestTypes.IsSystem(unitTestTypeId)) { var unitTestType = AllCaches.UnitTestTypes.Find(new AccountCacheRequest() { AccountId = accountId, ObjectId = unitTestTypeId }); if (unitTestType == null) { throw new UnknownUnitTestTypeIdException(unitTestTypeId); } } // получим компонент var component = cache.Components.Read(componentId); if (component == null) { throw new UnknownComponentIdException(componentId, accountId); } // проверим есть ли у него ссылка на проверку var unitTestRef = component.UnitTests.FindByName(data.SystemName); if (unitTestRef != null) { // ссылка есть, вернем существующую проверку var unitTest = cache.UnitTests.Read(unitTestRef.Id); if (unitTest == null) { throw new Exception("unitTest == null"); } return(unitTest); } // ссылки нет using (var writeComponent = cache.Components.Write(componentId)) { // проверим ссылку еще раз unitTestRef = writeComponent.UnitTests.FindByName(data.SystemName); if (unitTestRef != null) { var unitTest = cache.UnitTests.Read(unitTestRef.Id); if (unitTest == null) { throw new Exception("unitTest == null"); } return(unitTest); } // создадим проверку var accountDbContext = Context.GetAccountDbContext(accountId); // Проверим лимиты var checker = AccountLimitsCheckerManager.GetCheckerForAccount(accountId); var checkResult = checker.CheckMaxUnitTestsCount(accountDbContext); if (!checkResult.Success) { throw new OverLimitException(checkResult.Message); } // проверка лимитов пройдена if (string.IsNullOrWhiteSpace(data.DisplayName)) { data.DisplayName = data.SystemName; } // создаем юнит-тест var unitTestObj = Create(accountId, componentId, unitTestTypeId, systemName, data.DisplayName, data.NewId); unitTestRef = new CacheObjectReference(unitTestObj.Id, unitTestObj.SystemName); writeComponent.WriteUnitTests.Add(unitTestRef); writeComponent.BeginSave(); checker.RefreshApiChecksCount(); // обновим свойства using (var unitTestCache = cache.UnitTests.Write(unitTestObj.Id)) { unitTestCache.NoSignalColor = data.NoSignalColor; unitTestCache.ErrorColor = data.ErrorColor; unitTestCache.ActualTime = TimeSpanHelper.FromSeconds(data.ActualTimeSecs); if (data.PeriodSeconds.HasValue) { unitTestCache.PeriodSeconds = data.PeriodSeconds; } if (data.SimpleMode.HasValue) { unitTestCache.SimpleMode = data.SimpleMode.Value; } unitTestCache.BeginSave(); unitTestCache.WaitSaveChanges(); return(unitTestCache); } } }