Rename Concelier Source modules to Connector
This commit is contained in:
		| @@ -4,7 +4,7 @@ | ||||
|     <ConcelierPluginOutputRoot Condition="'$(ConcelierPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries</ConcelierPluginOutputRoot> | ||||
|     <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == ''">$(SolutionDir)PluginBinaries\Authority</AuthorityPluginOutputRoot> | ||||
|     <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries\Authority</AuthorityPluginOutputRoot> | ||||
|     <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Source.'))">true</IsConcelierPlugin> | ||||
|     <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Connector.'))">true</IsConcelierPlugin> | ||||
|     <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Exporter.'))">true</IsConcelierPlugin> | ||||
|     <IsAuthorityPlugin Condition="'$(IsAuthorityPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Authority.Plugin.'))">true</IsAuthorityPlugin> | ||||
|   </PropertyGroup> | ||||
|   | ||||
| @@ -27,7 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "..\StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{D48E48BF-80C8-43DA-8BE6-E2B9E769C49E}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common", "..\StellaOps.Concelier.Source.Common\StellaOps.Concelier.Source.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}" | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common", "..\StellaOps.Concelier.Connector.Common\StellaOps.Concelier.Connector.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo", "..\StellaOps.Concelier.Storage.Mongo\StellaOps.Concelier.Storage.Mongo.csproj", "{67C85AC6-1670-4A0D-A81F-6015574F46C7}" | ||||
| EndProject | ||||
|   | ||||
| @@ -10,17 +10,17 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using Microsoft.Extensions.Time.Testing; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.Acsc; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.Acsc; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class AcscConnectorFetchTests : IAsyncLifetime | ||||
| @@ -10,11 +10,11 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Time.Testing; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Source.Acsc; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.Acsc; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| @@ -22,7 +22,7 @@ using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class AcscConnectorParseTests : IAsyncLifetime | ||||
| @@ -2,11 +2,11 @@ using System.Net; | ||||
| using System.Net.Http; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc; | ||||
| 
 | ||||
| public sealed class AcscHttpClientConfigurationTests | ||||
| { | ||||
| @@ -7,10 +7,10 @@ | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Acsc/StellaOps.Concelier.Connector.Acsc.csproj" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
| @@ -35,6 +35,6 @@ Out of scope: | ||||
| - Handle transient fetch failures gracefully with exponential backoff and mark failures in source state. | ||||
| 
 | ||||
| ## Tests | ||||
| - Add integration-style tests under `StellaOps.Concelier.Source.Acsc.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Add integration-style tests under `StellaOps.Concelier.Connector.Acsc.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Snapshot canonical advisories; provide UPDATE flag flow for regeneration. | ||||
| - Validate determinism (ordering, casing, timestamps) to satisfy pipeline reproducibility requirements. | ||||
| @@ -12,18 +12,18 @@ using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.IO; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Source.Acsc.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc; | ||||
| 
 | ||||
| public sealed class AcscConnector : IFeedConnector | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc; | ||||
| 
 | ||||
| public sealed class AcscConnectorPlugin : IConnectorPlugin | ||||
| { | ||||
| @@ -2,9 +2,9 @@ using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.DependencyInjection; | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc; | ||||
| 
 | ||||
| public sealed class AcscDependencyInjectionRoutine : IDependencyInjectionRoutine | ||||
| { | ||||
| @@ -1,11 +1,11 @@ | ||||
| using System.Net; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Source.Acsc.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc; | ||||
| 
 | ||||
| public static class AcscServiceCollectionExtensions | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using System.Text.RegularExpressions; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| 
 | ||||
| /// <summary> | ||||
| /// Defines a single ACSC RSS feed endpoint. | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System.Net; | ||||
| using System.Net.Http; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Configuration; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Configuration; | ||||
| 
 | ||||
| /// <summary> | ||||
| /// Connector options governing ACSC feed access and retry behaviour. | ||||
| @@ -1,6 +1,6 @@ | ||||
| using MongoDB.Bson; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| internal enum AcscEndpointPreference | ||||
| { | ||||
| @@ -1,10 +1,10 @@ | ||||
| using System.Diagnostics.Metrics; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| public sealed class AcscDiagnostics : IDisposable | ||||
| { | ||||
|     private const string MeterName = "StellaOps.Concelier.Source.Acsc"; | ||||
|     private const string MeterName = "StellaOps.Concelier.Connector.Acsc"; | ||||
|     private const string MeterVersion = "1.0.0"; | ||||
| 
 | ||||
|     private readonly Meter _meter; | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| internal readonly record struct AcscDocumentMetadata(string FeedSlug, string FetchMode) | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| internal sealed record AcscFeedDto( | ||||
|     [property: JsonPropertyName("feedSlug")] string FeedSlug, | ||||
| @@ -4,9 +4,9 @@ using System.Xml.Linq; | ||||
| using AngleSharp.Dom; | ||||
| using AngleSharp.Html.Parser; | ||||
| using System.Security.Cryptography; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| internal static class AcscFeedParser | ||||
| { | ||||
| @@ -5,7 +5,7 @@ using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Acsc.Internal; | ||||
| 
 | ||||
| internal static class AcscMapper | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Acsc; | ||||
| namespace StellaOps.Concelier.Connector.Acsc; | ||||
| 
 | ||||
| internal static class AcscJobKinds | ||||
| { | ||||
| @@ -1,4 +1,4 @@ | ||||
| using System.Runtime.CompilerServices; | ||||
| 
 | ||||
| [assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Nvd.Tests")] | ||||
| [assembly: InternalsVisibleTo("FixtureUpdater")] | ||||
| [assembly: InternalsVisibleTo("StellaOps.Concelier.Connector.Acsc.Tests")] | ||||
| @@ -1,4 +1,4 @@ | ||||
| ## StellaOps.Concelier.Source.Acsc | ||||
| ## StellaOps.Concelier.Connector.Acsc | ||||
| 
 | ||||
| Australian Cyber Security Centre (ACSC) connector that ingests RSS/Atom advisories, sanitises embedded HTML, and maps entries into canonical `Advisory` records for Concelier. | ||||
| 
 | ||||
| @@ -29,7 +29,7 @@ The dependency injection routine registers the connector plus scheduled jobs: | ||||
| | `source:acsc:probe` | `25,55 * * * *` | Verify direct endpoint health and adjust cursor preference. | | ||||
| 
 | ||||
| ### Metrics | ||||
| Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Concelier.Source.Acsc`): | ||||
| Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Concelier.Connector.Acsc`): | ||||
| 
 | ||||
| | Instrument | Unit | Description | | ||||
| | --- | --- | --- | | ||||
| @@ -54,10 +54,10 @@ Key log messages include: | ||||
| Logs include feed slug metadata for troubleshooting parallel ingestion. | ||||
| 
 | ||||
| ### Tests & fixtures | ||||
| `StellaOps.Concelier.Source.Acsc.Tests` exercises the fetch→parse→map pipeline using canned RSS content. Deterministic snapshots live in `Acsc/Fixtures`. To refresh them after intentional behavioural changes: | ||||
| `StellaOps.Concelier.Connector.Acsc.Tests` exercises the fetch→parse→map pipeline using canned RSS content. Deterministic snapshots live in `Acsc/Fixtures`. To refresh them after intentional behavioural changes: | ||||
| 
 | ||||
| ```bash | ||||
| UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj | ||||
| UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Acsc.Tests/StellaOps.Concelier.Connector.Acsc.Tests.csproj | ||||
| ``` | ||||
| 
 | ||||
| Remember to review the generated `.actual.json` files when assertions fail without fixture updates. | ||||
| @@ -7,12 +7,12 @@ | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" /> | ||||
| 
 | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" /> | ||||
| 
 | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| 
 | ||||
| @@ -11,18 +11,18 @@ using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.Cccs; | ||||
| using StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.Cccs; | ||||
| using StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Tests; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CccsConnectorTests : IAsyncLifetime | ||||
| @@ -3,12 +3,12 @@ using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| using FluentAssertions; | ||||
| using StellaOps.Concelier.Source.Cccs.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| using Xunit; | ||||
| using Xunit.Abstractions; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CccsHtmlParserTests | ||||
| { | ||||
| @@ -1,12 +1,12 @@ | ||||
| using System; | ||||
| using FluentAssertions; | ||||
| using StellaOps.Concelier.Source.Cccs.Internal; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CccsMapperTests | ||||
| { | ||||
| @@ -5,8 +5,8 @@ | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Cccs/StellaOps.Concelier.Connector.Cccs.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="FluentAssertions" Version="6.12.0" /> | ||||
| @@ -35,6 +35,6 @@ Out of scope: | ||||
| - Respect upstream rate limits; mark failures in source state with backoff. | ||||
| 
 | ||||
| ## Tests | ||||
| - Add `StellaOps.Concelier.Source.Cccs.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Add `StellaOps.Concelier.Connector.Cccs.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Snapshot canonical advisories; support fixture regeneration via env flag. | ||||
| - Validate deterministic ordering and timestamps to maintain reproducibility. | ||||
| @@ -11,17 +11,17 @@ using System.Globalization; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Source.Cccs.Internal; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs; | ||||
| namespace StellaOps.Concelier.Connector.Cccs; | ||||
| 
 | ||||
| public sealed class CccsConnector : IFeedConnector | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs; | ||||
| namespace StellaOps.Concelier.Connector.Cccs; | ||||
| 
 | ||||
| public sealed class CccsConnectorPlugin : IConnectorPlugin | ||||
| { | ||||
| @@ -3,9 +3,9 @@ using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.DependencyInjection; | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| using StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs; | ||||
| namespace StellaOps.Concelier.Connector.Cccs; | ||||
| 
 | ||||
| public sealed class CccsDependencyInjectionRoutine : IDependencyInjectionRoutine | ||||
| { | ||||
| @@ -3,12 +3,12 @@ using System.Linq; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Source.Cccs.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs; | ||||
| namespace StellaOps.Concelier.Connector.Cccs; | ||||
| 
 | ||||
| public static class CccsServiceCollectionExtensions | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| 
 | ||||
| public sealed class CccsOptions | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| internal sealed record CccsAdvisoryDto | ||||
| { | ||||
| @@ -3,7 +3,7 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using MongoDB.Bson; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| internal sealed record CccsCursor( | ||||
|     IReadOnlyCollection<Guid> PendingDocuments, | ||||
| @@ -1,10 +1,10 @@ | ||||
| using System.Diagnostics.Metrics; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| public sealed class CccsDiagnostics : IDisposable | ||||
| { | ||||
|     private const string MeterName = "StellaOps.Concelier.Source.Cccs"; | ||||
|     private const string MeterName = "StellaOps.Concelier.Connector.Cccs"; | ||||
|     private const string MeterVersion = "1.0.0"; | ||||
| 
 | ||||
|     private readonly Meter _meter; | ||||
| @@ -6,10 +6,10 @@ using System.Text.Json.Serialization; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using StellaOps.Concelier.Source.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.Cccs.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| public sealed class CccsFeedClient | ||||
| { | ||||
| @@ -3,7 +3,7 @@ using System.Collections.Generic; | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| internal sealed class CccsFeedResponse | ||||
| { | ||||
| @@ -6,9 +6,9 @@ using System.Text.RegularExpressions; | ||||
| using AngleSharp.Dom; | ||||
| using AngleSharp.Html.Dom; | ||||
| using AngleSharp.Html.Parser; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| public sealed class CccsHtmlParser | ||||
| { | ||||
| @@ -4,7 +4,7 @@ using System.Linq; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| internal static class CccsMapper | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System; | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs.Internal; | ||||
| namespace StellaOps.Concelier.Connector.Cccs.Internal; | ||||
| 
 | ||||
| internal sealed record CccsRawAdvisoryDocument | ||||
| { | ||||
| @@ -3,7 +3,7 @@ using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.Cccs; | ||||
| namespace StellaOps.Concelier.Connector.Cccs; | ||||
| 
 | ||||
| internal static class CccsJobKinds | ||||
| { | ||||
| @@ -0,0 +1,3 @@ | ||||
| using System.Runtime.CompilerServices; | ||||
|  | ||||
| [assembly: InternalsVisibleTo("StellaOps.Concelier.Connector.Cccs.Tests")] | ||||
| @@ -6,12 +6,11 @@ | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" /> | ||||
| 
 | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" /> | ||||
| 
 | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| 
 | ||||
| @@ -5,7 +5,7 @@ | ||||
| |FEEDCONN-CCCS-02-002 Implement fetch & source state handling|BE-Conn-CCCS|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – `CccsConnector.FetchAsync` now hydrates feeds via `CccsFeedClient`, persists per-entry JSON payloads with SHA256 dedupe and cursor state, throttles requests, and records taxonomy + language metadata in document state.| | ||||
| |FEEDCONN-CCCS-02-003 DTO/parser implementation|BE-Conn-CCCS|Source.Common|**DONE (2025-10-14)** – Added `CccsHtmlParser` to sanitize Atom body HTML, extract serial/date/product bullets, collapse whitespace, and emit normalized reference URLs; `ParseAsync` now persists DTO records under schema `cccs.dto.v1`.| | ||||
| |FEEDCONN-CCCS-02-004 Canonical mapping & range primitives|BE-Conn-CCCS|Models|**DONE (2025-10-14)** – `CccsMapper` now materializes canonical advisories (aliases from serial/source/CVEs, references incl. canonical URL, vendor package records) with provenance masks; `MapAsync` stores results in `AdvisoryStore`.| | ||||
| |FEEDCONN-CCCS-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added English/French fixtures plus parser + connector end-to-end tests (`StellaOps.Concelier.Source.Cccs.Tests`). Canned HTTP handler + Mongo fixture enables fetch→parse→map regression; fixtures refresh via `UPDATE_CCCS_FIXTURES=1`.| | ||||
| |FEEDCONN-CCCS-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added English/French fixtures plus parser + connector end-to-end tests (`StellaOps.Concelier.Connector.Cccs.Tests`). Canned HTTP handler + Mongo fixture enables fetch→parse→map regression; fixtures refresh via `UPDATE_CCCS_FIXTURES=1`.| | ||||
| |FEEDCONN-CCCS-02-006 Observability & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CccsDiagnostics` meter (fetch/parse/map counters), enriched connector logs with document counts, and published `docs/ops/concelier-cccs-operations.md` covering config, telemetry, and sanitiser guidance.| | ||||
| |FEEDCONN-CCCS-02-007 Historical advisory harvesting plan|BE-Conn-CCCS|Research|**DONE (2025-10-15)** – Measured `/api/cccs/threats/v1/get` inventory (~5.1k rows/lang; earliest 2018-06-08), documented backfill workflow + language split strategy, and linked the runbook for Offline Kit execution.| | ||||
| |FEEDCONN-CCCS-02-008 Raw DOM parsing refinement|BE-Conn-CCCS|Source.Common|**DONE (2025-10-15)** – Parser now walks unsanitised DOM (heading + nested list coverage), sanitizer keeps `<h#>`/`section` nodes, and regression fixtures/tests assert EN/FR list handling + preserved HTML structure.| | ||||
| @@ -11,11 +11,11 @@ using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| @@ -23,7 +23,7 @@ using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Tests; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertBundConnectorTests : IAsyncLifetime | ||||
| @@ -5,8 +5,8 @@ | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.CertBund/StellaOps.Concelier.Connector.CertBund.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="FluentAssertions" Version="6.12.0" /> | ||||
| @@ -35,6 +35,6 @@ Out of scope: | ||||
| - Handle transient failures gracefully with exponential backoff and failure records in source state. | ||||
| 
 | ||||
| ## Tests | ||||
| - Add `StellaOps.Concelier.Source.CertBund.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Add `StellaOps.Concelier.Connector.CertBund.Tests` covering fetch/parse/map with canned fixtures. | ||||
| - Snapshot canonical advisories; support regeneration via environment flag. | ||||
| - Ensure deterministic ordering, casing, and timestamps. | ||||
| @@ -7,18 +7,18 @@ using System.Threading.Tasks; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Source.CertBund.Internal; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund; | ||||
| namespace StellaOps.Concelier.Connector.CertBund; | ||||
| 
 | ||||
| public sealed class CertBundConnector : IFeedConnector | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund; | ||||
| namespace StellaOps.Concelier.Connector.CertBund; | ||||
| 
 | ||||
| public sealed class CertBundConnectorPlugin : IConnectorPlugin | ||||
| { | ||||
| @@ -3,9 +3,9 @@ using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using StellaOps.DependencyInjection; | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| using StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund; | ||||
| namespace StellaOps.Concelier.Connector.CertBund; | ||||
| 
 | ||||
| public sealed class CertBundDependencyInjectionRoutine : IDependencyInjectionRoutine | ||||
| { | ||||
| @@ -3,12 +3,12 @@ using System.Net; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Source.CertBund.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund; | ||||
| namespace StellaOps.Concelier.Connector.CertBund; | ||||
| 
 | ||||
| public static class CertBundServiceCollectionExtensions | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using System.Net; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| 
 | ||||
| public sealed class CertBundOptions | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| public sealed record CertBundAdvisoryDto | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using System.Linq; | ||||
| using MongoDB.Bson; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| internal sealed record CertBundCursor( | ||||
|     IReadOnlyCollection<Guid> PendingDocuments, | ||||
| @@ -3,9 +3,9 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
| using StellaOps.Concelier.Source.Common.Html; | ||||
| using StellaOps.Concelier.Connector.Common.Html; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| public sealed class CertBundDetailParser | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| internal sealed record CertBundDetailResponse | ||||
| { | ||||
| @@ -2,14 +2,14 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics.Metrics; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| /// <summary> | ||||
| /// Emits OpenTelemetry counters and histograms for the CERT-Bund connector. | ||||
| /// </summary> | ||||
| public sealed class CertBundDiagnostics : IDisposable | ||||
| { | ||||
|     private const string MeterName = "StellaOps.Concelier.Source.CertBund"; | ||||
|     private const string MeterName = "StellaOps.Concelier.Connector.CertBund"; | ||||
|     private const string MeterVersion = "1.0.0"; | ||||
| 
 | ||||
|     private readonly Meter _meter; | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| internal static class CertBundDocumentMetadata | ||||
| { | ||||
| @@ -8,9 +8,9 @@ using System.Threading.Tasks; | ||||
| using System.Xml.Linq; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.CertBund.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertBund.Configuration; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| public sealed class CertBundFeedClient | ||||
| { | ||||
| @@ -1,4 +1,4 @@ | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| using System; | ||||
| 
 | ||||
| @@ -4,7 +4,7 @@ using System.Linq; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertBund.Internal; | ||||
| 
 | ||||
| internal static class CertBundMapper | ||||
| { | ||||
| @@ -3,7 +3,7 @@ using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using StellaOps.Concelier.Core.Jobs; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertBund; | ||||
| namespace StellaOps.Concelier.Connector.CertBund; | ||||
| 
 | ||||
| internal static class CertBundJobKinds | ||||
| { | ||||
| @@ -6,7 +6,7 @@ | ||||
| - **Detail API** – `https://wid.cert-bund.de/portal/api/securityadvisory?name=<ID>`. The connector reuses the bootstrapped `SocketsHttpHandler` so cookies and headers match the Angular SPA. Manual reproduction requires the same cookie container; otherwise the endpoint responds with the shell HTML document. | ||||
| 
 | ||||
| ## Telemetry | ||||
| The OpenTelemetry meter is `StellaOps.Concelier.Source.CertBund`. Key instruments: | ||||
| The OpenTelemetry meter is `StellaOps.Concelier.Connector.CertBund`. Key instruments: | ||||
| 
 | ||||
| | Metric | Type | Notes | | ||||
| | --- | --- | --- | | ||||
| @@ -9,7 +9,7 @@ | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" /> | ||||
| 
 | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -5,8 +5,8 @@ | ||||
| |FEEDCONN-CERTBUND-02-002 Fetch job & state persistence|BE-Conn-CERTBUND|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – `CertBundConnector.FetchAsync` consumes RSS via session-bootstrapped client, stores per-advisory JSON documents with metadata + SHA, throttles detail requests, and maintains cursor state (pending docs/mappings, known advisory IDs, last published).| | ||||
| |FEEDCONN-CERTBUND-02-003 Parser/DTO implementation|BE-Conn-CERTBUND|Source.Common|**DONE (2025-10-14)** – Detail JSON piped through `CertBundDetailParser` (raw DOM sanitised to HTML), capturing severity, CVEs, product list, and references into DTO records (`cert-bund.detail.v1`).| | ||||
| |FEEDCONN-CERTBUND-02-004 Canonical mapping & range primitives|BE-Conn-CERTBUND|Models|**DONE (2025-10-14)** – `CertBundMapper` emits canonical advisories (aliases, references, vendor package ranges, provenance) with severity normalisation and deterministic ordering.| | ||||
| |FEEDCONN-CERTBUND-02-005 Regression fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Concelier.Source.CertBund.Tests` covering fetch→parse→map against canned RSS/JSON fixtures; integration harness uses Mongo2Go + canned HTTP handler; fixtures regenerate via `UPDATE_CERTBUND_FIXTURES=1`.| | ||||
| |FEEDCONN-CERTBUND-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CertBundDiagnostics` (meter `StellaOps.Concelier.Source.CertBund`) with fetch/parse/map counters + histograms, recorded coverage days, wired stage summary logs, and published the ops runbook (`docs/ops/concelier-certbund-operations.md`).| | ||||
| |FEEDCONN-CERTBUND-02-005 Regression fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Concelier.Connector.CertBund.Tests` covering fetch→parse→map against canned RSS/JSON fixtures; integration harness uses Mongo2Go + canned HTTP handler; fixtures regenerate via `UPDATE_CERTBUND_FIXTURES=1`.| | ||||
| |FEEDCONN-CERTBUND-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CertBundDiagnostics` (meter `StellaOps.Concelier.Connector.CertBund`) with fetch/parse/map counters + histograms, recorded coverage days, wired stage summary logs, and published the ops runbook (`docs/ops/concelier-certbund-operations.md`).| | ||||
| |FEEDCONN-CERTBUND-02-007 Feed history & locale assessment|BE-Conn-CERTBUND|Research|**DONE (2025-10-15)** – Measured RSS retention (~6 days/≈250 items), captured connector-driven backfill guidance in the runbook, and aligned locale guidance (preserve `language=de`, Docs glossary follow-up). **Next:** coordinate with Tools to land the state-seeding helper so scripted backfills replace manual Mongo tweaks.| | ||||
| |FEEDCONN-CERTBUND-02-008 Session bootstrap & cookie strategy|BE-Conn-CERTBUND|Source.Common|**DONE (2025-10-14)** – Feed client primes the portal session (cookie container via `SocketsHttpHandler`), shares cookies across detail requests, and documents bootstrap behaviour in options (`PortalBootstrapUri`).| | ||||
| |FEEDCONN-CERTBUND-02-009 Offline Kit export packaging|BE-Conn-CERTBUND, Docs|Offline Kit|**DONE (2025-10-17)** – Added `tools/certbund_offline_snapshot.py` to capture search/export JSON, emit deterministic manifests + SHA files, and refreshed docs (`docs/ops/concelier-certbund-operations.md`, `docs/24_OFFLINE_KIT.md`) with offline-kit instructions and manifest layout guidance. Seed data README/ignore rules cover local snapshot hygiene.| | ||||
| @@ -10,19 +10,19 @@ using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Time.Testing; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Source.CertCc; | ||||
| using StellaOps.Concelier.Source.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Cursors; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.CertCc; | ||||
| using StellaOps.Concelier.Connector.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Cursors; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertCcConnectorFetchTests : IAsyncLifetime | ||||
| @@ -16,19 +16,19 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Time.Testing; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Source.CertCc; | ||||
| using StellaOps.Concelier.Source.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Cursors; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.CertCc; | ||||
| using StellaOps.Concelier.Connector.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Cursors; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertCcConnectorSnapshotTests : IAsyncLifetime | ||||
| @@ -15,19 +15,19 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Time.Testing; | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Driver; | ||||
| using StellaOps.Concelier.Source.CertCc; | ||||
| using StellaOps.Concelier.Source.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Cursors; | ||||
| using StellaOps.Concelier.Source.Common.Http; | ||||
| using StellaOps.Concelier.Source.Common.Testing; | ||||
| using StellaOps.Concelier.Connector.CertCc; | ||||
| using StellaOps.Concelier.Connector.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Cursors; | ||||
| using StellaOps.Concelier.Connector.Common.Http; | ||||
| using StellaOps.Concelier.Connector.Common.Testing; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Testing; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertCcConnectorTests : IAsyncLifetime | ||||
| @@ -2,12 +2,12 @@ using System; | ||||
| using System.Globalization; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CertCcMapperTests | ||||
| { | ||||
| @@ -1,9 +1,9 @@ | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CertCcSummaryParserTests | ||||
| { | ||||
| @@ -1,12 +1,12 @@ | ||||
| using System; | ||||
| using System.Linq; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Concelier.Source.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Source.Common.Cursors; | ||||
| using StellaOps.Concelier.Connector.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.Common.Cursors; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CertCcSummaryPlannerTests | ||||
| { | ||||
| @@ -1,8 +1,8 @@ | ||||
| using System.Linq; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; | ||||
| namespace StellaOps.Concelier.Connector.CertCc.Tests.Internal; | ||||
| 
 | ||||
| public sealed class CertCcVendorStatementParserTests | ||||
| { | ||||
| @@ -5,8 +5,8 @@ | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Source.Cccs/StellaOps.Concelier.Source.Cccs.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Concelier.Connector.CertCc/StellaOps.Concelier.Connector.CertCc.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="FluentAssertions" Version="6.12.0" /> | ||||
| @@ -33,6 +33,6 @@ Out of scope: | ||||
| - Respect upstream throttling via retry/backoff. | ||||
| 
 | ||||
| ## Tests | ||||
| - Add `StellaOps.Concelier.Source.CertCc.Tests` to cover fetch/parse/map with canned fixtures. | ||||
| - Add `StellaOps.Concelier.Connector.CertCc.Tests` to cover fetch/parse/map with canned fixtures. | ||||
| - Snapshot canonical advisories and support UPDATE flag for regeneration. | ||||
| - Ensure deterministic ordering and timestamp normalisation. | ||||
| @@ -11,17 +11,17 @@ using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Options; | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Concelier.Models; | ||||
| using StellaOps.Concelier.Source.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Source.CertCc.Internal; | ||||
| using StellaOps.Concelier.Source.Common; | ||||
| using StellaOps.Concelier.Source.Common.Fetch; | ||||
| using StellaOps.Concelier.Connector.CertCc.Configuration; | ||||
| using StellaOps.Concelier.Connector.CertCc.Internal; | ||||
| using StellaOps.Concelier.Connector.Common; | ||||
| using StellaOps.Concelier.Connector.Common.Fetch; | ||||
| using StellaOps.Concelier.Storage.Mongo; | ||||
| using StellaOps.Concelier.Storage.Mongo.Advisories; | ||||
| using StellaOps.Concelier.Storage.Mongo.Documents; | ||||
| using StellaOps.Concelier.Storage.Mongo.Dtos; | ||||
| using StellaOps.Plugin; | ||||
| 
 | ||||
| namespace StellaOps.Concelier.Source.CertCc; | ||||
| namespace StellaOps.Concelier.Connector.CertCc; | ||||
| 
 | ||||
| public sealed class CertCcConnector : IFeedConnector | ||||
| { | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user