TemplatesInitializer создаёт 9 записей Templates со статусом Creating

This commit is contained in:
Mikhail Kuznetsov
2023-09-18 12:40:42 +10:00
parent 4d56cbfd97
commit 9816ece7fe
8 changed files with 395 additions and 38 deletions

View File

@@ -1,4 +1,3 @@
using PARR.DAL;
using PARR.EsppTemplateSync; using PARR.EsppTemplateSync;
using PARR.EsppTemplateSyncWorker; using PARR.EsppTemplateSyncWorker;
using Serilog; using Serilog;

View File

@@ -0,0 +1,50 @@
using PARR.MockData.Data;
using RabbitMQ.Client;
using System.Text;
namespace PARR.MockData
{
internal class EsppDataImporter
{
public void Import() {
var factory = new ConnectionFactory() { HostName = "10.99.253.216" };
factory.UserName = "espp_templates_robot";
factory.Password = "P@ssRwEsppTempl202";
string[] rows = EsppExport.data.Replace("\r", "").Split('\n');
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
//https://www.rabbitmq.com/lazy-queues.html
//Рекомендовано при работе порциями использовать ленивые очереди. сообщения не используют память
//Формируем соответствующий аргумент
Dictionary<String, Object> argums = new Dictionary<String, Object>();
argums.Add("x-queue-mode", "lazy");
//Объявляем очередь с которой будем работать. Если такой очереди ещё нет, то создатся. Если нет, нужно параметры типа durable должны совпадать иначе будет ошибка. В целом эти параметры можно посмотреть в админке RabbitMQ
channel.QueueDeclare(queue: "parr-espp-templates",
durable: true,//If you want to make sure your messages are persisted, you need to create a durable queue. To do this, simply set the durable flag to true when creating the queue.
exclusive: false,
autoDelete: false,
arguments: argums);
//перебираем строки и отправляем строки сообщениями
for (int i = 0; i < rows.Count(); i++)
{
var body = Encoding.UTF8.GetBytes(rows[i]);
IBasicProperties props = channel.CreateBasicProperties();
//If you dont mark your messages as persistent, then RabbitMQ will store them in memory. This is fine if youre just playing around or building a prototype. But if youre building a production system, then you need to make sure that your messages are persisted to disk so that theyre not lost if the server crashes.
//Говорим менеджеру RabbitMq при получении хранить сообщения на диске
props.DeliveryMode = 2;
//время жизни в мс. на этапе отладки сделаем коротким чтобы не устраивать помойку
props.Expiration = "60000";
channel.BasicPublish(exchange: "",
routingKey: "parr-espp-templates",//совпадает с именем очереди иначе не принимает
basicProperties: props,
body: body);
}
}
}
}
}

View File

@@ -8,7 +8,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="RabbitMQ.Client" Version="6.5.0" /> <PackageReference Include="RabbitMQ.Client" Version="6.5.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -26,4 +36,10 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project> </Project>

View File

@@ -1,43 +1,32 @@
using PARR.MockData.Data; using Microsoft.Extensions.DependencyInjection;
using RabbitMQ.Client; using Microsoft.Extensions.Hosting;
using System.Text; using PARR.DAL;
using PARR.MockData.Services;
using Serilog;
var factory = new ConnectionFactory() { HostName = "10.99.253.216" }; //var esppImporter = new EsppDataImporter();
factory.UserName = "espp_templates_robot"; //esppImporter.Import();
factory.Password = "P@ssRwEsppTempl202";
string[] rows = EsppExport.data.Replace("\r", "").Split('\n'); IHost host = Host.CreateDefaultBuilder(args)
using (var connection = factory.CreateConnection()) .ConfigureServices((hostContext, services) =>
using (var channel = connection.CreateModel())
{
//https://www.rabbitmq.com/lazy-queues.html
//Рекомендовано при работе порциями использовать ленивые очереди. сообщения не используют память
//Формируем соответствующий аргумент
Dictionary<String, Object> argums = new Dictionary<String, Object>();
argums.Add("x-queue-mode", "lazy");
//Объявляем очередь с которой будем работать. Если такой очереди ещё нет, то создатся. Если нет, нужно параметры типа durable должны совпадать иначе будет ошибка. В целом эти параметры можно посмотреть в админке RabbitMQ
channel.QueueDeclare(queue: "parr-espp-templates",
durable: true,//If you want to make sure your messages are persisted, you need to create a durable queue. To do this, simply set the durable flag to true when creating the queue.
exclusive: false,
autoDelete: false,
arguments: argums);
//перебираем строки и отправляем строки сообщениями
for (int i = 0; i < rows.Count(); i++)
{ {
var body = Encoding.UTF8.GetBytes(rows[i]); services.InstallDalServices(hostContext.Configuration);
IBasicProperties props = channel.CreateBasicProperties(); services.AddSingleton<ITemplatesInitializer, TemplatesInitializer>();
//If you dont mark your messages as persistent, then RabbitMQ will store them in memory. This is fine if youre just playing around or building a prototype. But if youre building a production system, then you need to make sure that your messages are persisted to disk so that theyre not lost if the server crashes.
//Говорим менеджеру RabbitMq при получении хранить сообщения на диске })
props.DeliveryMode = 2; .UseSerilog((hostContext, services, config) =>
//время жизни в мс. на этапе отладки сделаем коротким чтобы не устраивать помойку {
props.Expiration = "60000"; config
.WriteTo.Console()
.ReadFrom.Configuration(hostContext.Configuration);
})
.Build();
//host.Run();
var tempInitializer = host.Services.GetRequiredService<ITemplatesInitializer>();
await tempInitializer.InitAsync();
await host.StopAsync();
channel.BasicPublish(exchange: "",
routingKey: "parr-espp-templates",//совпадает с именем очереди иначе не принимает
basicProperties: props,
body: body);
}
}

View File

@@ -0,0 +1,7 @@
namespace PARR.MockData.Services
{
internal interface ITemplatesInitializer
{
Task InitAsync();
}
}

View File

@@ -0,0 +1,238 @@
using Microsoft.Extensions.Logging;
using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
namespace PARR.MockData.Services
{
internal class TemplatesInitializer : ITemplatesInitializer
{
private readonly ILogger<TemplatesInitializer> logger;
private readonly ITemplateService templateService;
public TemplatesInitializer(ILogger<TemplatesInitializer> logger, ITemplateService templateService)
{
this.logger = logger;
this.templateService = templateService;
}
public async Task InitAsync()
{
var templates = new List<Template>() {
new Template{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:39.004502+00"),
EK="ВРТ-VMWARE-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-Установка обновлений ОС",
Category="регламентная работа",
Process="ЦВК Выполнение регламентных работ (О3.2.2.3)",
SubProcess="ЦВК Выполнение регламентных работ (О3.2.2.3)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Установка обновлений ОС серверов средней и низ-кой критичности.",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-УСТАНОВКА ОБНОВЛЕНИЙ ОС",
ResponseArea="96-ДВС",
Solution="Установка обновлений ОС серверов средней и низкой критичности.",
TNK="",
Work="",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.992903+00"),
EK="КОМПЛЕКСЫ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-РАБОТА С ИЗМЕНЕНИЯМИ-2",
Category="регламентная работа",
Process="ПТК Выполнение регламентных работ (О3.2.2.4)",
SubProcess="ПТК Выполнение регламентных работ (О3.2.2.4)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Работа с изменениями. Проверка плана обновлений ПО серверов. Проверка создания и согласования изменений для обновления ПО серверов низкой и средней критичности.",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-РАБОТА С ИЗМЕНЕНИЯМИ-2",
ResponseArea="96-ДВС",
Solution="Работа с изменениями. Проверка плана обновлений ПО серверов. Проверка создания и согласования изменений для обновления ПО серверов низкой и средней критичности.",
TNK="",
Work="",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.981423+00"),
EK="ВРТ-VMWARE-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-Проверка СРК VMWare",
Category="регламентная работа",
Process="ЦВК Выполнение регламентных работ (О3.2.2.3)",
SubProcess="ЦВК Выполнение регламентных работ (О3.2.2.3)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Проверка резервного копирования серверов в VMware.",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-ПРОВЕРКА СРК VMWARE",
ResponseArea="96-ДВС",
Solution="Проверка резервного копирования серверов в VMware.",
TNK="ТО-1 Мониторинг и анализ работы виртуального центра Vmware (ежедневные) (О3.2.2.3) - виртуальный комплекс",
Work="ТО-1 Мониторинг и анализ работы виртуального центра Vmware (ежедневные) (О3.2.2.3)",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.966595+00"),
EK="КОМПЛЕКСЫ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-ПРОВЕРКА СВОБОДНОГО МЕСТА НА ДИСКАХ",
Category="регламентная работа",
Process="ЦВК Выполнение регламентных работ (О3.2.2.3)",
SubProcess="ЦВК Выполнение регламентных работ (О3.2.2.3)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Проверка свободного места на дисках серверов",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-ПРОВЕРКА СВОБОДНОГО МЕСТА НА ДИСКАХ",
ResponseArea="96-ДВС",
Solution="Проверка свободного места на дисках серверов.",
TNK="",
Work="",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.953887+00"),
EK="КОМПЛЕКСЫ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-ОБХОД СЕРВЕРНЫХ",
Category="регламентная работа",
Process="ЦВК Выполнение регламентных работ (О3.2.2.3)",
SubProcess="ЦВК Выполнение регламентных работ (О3.2.2.3)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Обход серверных помещений. Проверка соблюдений правил пожарной безопасно-сти в помещениях (отсутствие пустых коробок от оборудования, общий порядок в помещениях, сер-верных шкафах и т.п.). Проверка индикаторов серверного оборудова-ния отдела ПТК (отмечать о серверах где горят красные/оранжевые критические инди-каторы).",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-ОБХОД СЕРВЕРНЫХ",
ResponseArea="96-ДВС",
Solution="Обход серверных помещений. Проверка соблюдения правил пожарной безопасности в помещениях. Проверка индикаторов серверного оборудования отдела ПТК.",
TNK="",
Work="",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.940346+00"),
EK="КОМПЛЕКСЫ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-ОБСЛУЖИВАИНЕ БАЗ ДАННЫХ",
Category="регламентная работа",
Process="ПТК Выполнение регламентных работ (О3.2.2.4)",
SubProcess="ПТК Выполнение регламентных работ (О3.2.2.4)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="обслуживание баз данных",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-ОБСЛУЖИВАИНЕ БАЗ ДАННЫХ",
ResponseArea="96-ДВС",
Solution="Обслуживание баз данных",
TNK="СПО Анализ системных журналов СУБД (О3.2.2.4)",
Work="СПО Анализ системных журналов СУБД (О3.2.2.4)",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:39.017247+00"),
EK="ЦОММ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="Администрирование DB2 ЦОММ",
Category="регламентная работа",
Process="ПТК Выполнение регламентных работ (О3.2.2.4)",
SubProcess="ПТК Выполнение регламентных работ (О3.2.2.4)",
ClosingCode="выполнен",
Duration="10 00:00:00",
FullDescription="Администрирование DB2 ЦОММ",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК-DB2-ЦОММ",
ResponseArea="96-ДВС",
Solution="Администрирование DB2 ЦОММ.",
TNK="СПО Анализ производительности серверов приложений (О3.2.2.4)",
Work="СПО Анализ производительности серверов приложений (О3.2.2.4)",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.925717+00"),
EK="СРК-NETBACKUP-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-МОНИТОРИНГ СРК",
Category="регламентная работа",
Process="ЦВК Выполнение регламентных работ (О3.2.2.3)",
SubProcess="ЦВК Выполнение регламентных работ (О3.2.2.3)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="Мониторинг состояния системы резервного копирования",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-КОНТРОЛЬ РАБОТЫ СРК",
ResponseArea="96-ДВС",
Solution="Мониторинг состояния системы резервного копирования",
TNK="ТО-1 Мониторинг и анализ работы системы СРК (ежедневные) (О3.2.2.3) - региональный",
Work="ТО-1 Мониторинг и анализ работы системы СРК (ежедневные) (О3.2.2.3)",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}, new Template
{
Id=Guid.NewGuid(),
DateCreated=DateTimeOffset.Parse("2023-09-15 00:14:38.910218+00"),
EK="КОМПЛЕКСЫ-ДВС",
IsActive=true,
WorkGroup="СМЕНА-ПТК-ДВС",
ShortDescription="ДВС-ПТК СМЕНА-Анализ плановых работ по системам",
Category="регламентная работа",
Process="ПТК Выполнение регламентных работ (О3.2.2.4)",
SubProcess="ПТК Выполнение регламентных работ (О3.2.2.4)",
ClosingCode="выполнен",
Duration="3 00:00:00",
FullDescription="ДВС-ПТК СМЕНА-Анализ плановых работ по системам",
Initiator="ГУСЬКОВ АНДРЕЙ СЕРГЕЕВИЧ (IVC_GUSKOVAS@DVGD.OAO.RZD)",
Name="ПАРР-ДВС-ПТК СМЕНА-АНАЛИЗ ПЛАНОВЫХ РАБОТ ПО СИСТЕМАМ",
ResponseArea="96-ДВС",
Solution="Анализ плановых работ по системам",
TNK="",
Work="",
Worker="",
StatusCode = (int)StatusTemplateEnum.Creating
}
};
foreach (var template in templates)
{
if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync())
{
logger.LogError($"Не удалось создать Template {template.Name} {template.ShortDescription}");
continue;
}
else
logger.LogInformation($"----- Создан Template: {template.Name}, {template.ShortDescription} -----");
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=10.99.253.184;Database=parr;User Id=app_parr; Password=PosdfkhT&)%sdfligL&%5546;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Debug"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log/log-.txt",
"rollingInterval": "Day"
}
}
]
}
}

View File

@@ -0,0 +1,29 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=10.99.253.184;Database=parr;User Id=app_parr; Password=PosdfkhT&)%sdfligL&%5546;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Debug"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log/log-.txt",
"rollingInterval": "Day"
}
}
]
}
}