Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@ All notable changes to the OneWare Container Extension are documented here.
This format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.0.14] - 2026-08-20

An internal maintainability pass over 1.0.13. The monolithic `DockerExecutionStrategy` is decomposed
into focused, independently-testable collaborators. Container execution, telemetry, and security-gate
behavior are unchanged: method bodies were preserved and only their dependencies re-targeted.

### Changed

- `DockerExecutionStrategy` is refactored from a single ~3,300-line class into a coordinator that composes dedicated collaborators, each owning one concern: bind-mount validation and canonicalization (`BindValidator`), `docker run` command rendering with environment-value masking (`DockerRunCommandFormatter`), daemon endpoint verification — named-pipe trust and Unix socket probing (`DaemonEndpointValidator`), dangling-container reaping on exit/Ctrl-C/dispose (`ContainerReaper`), daemon bootstrap and API-version negotiation (`DockerConnectionFactory`), the container run loop (`ContainerRunner`), host-native fallback execution (`NativeFallbackExecutor`), and level-gated tool-console logging/output handling (`DockerToolConsole`). The public surface, container-execution semantics, and all security gates are unchanged.

### Tests

- Per-collaborator unit tests accompany the extracted `BindValidator`, `DockerRunCommandFormatter`, and `DaemonEndpointValidator`, moved from reflection-based access to direct calls; `DockerRunCommandFormatter` gains explicit coverage of environment-value masking. A new daemon-backed smoke test runs a real container end-to-end through `ExecuteAsync` using a small cached image and no toolchain fixtures, providing a fast regression anchor for the execution engine.

## [1.0.13] - 2026-07-15

A follow-up hardening and maintenance pass over 1.0.12: the remaining low-severity items from the
Expand Down
18 changes: 18 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
<Project>
<!-- Local development toggle: reference a local OneWare.Essentials source checkout
(..\..\..\OneWare\src\OneWare.Essentials) instead of the NuGet package. Off by default.
Defined here (not in the .csproj) so the lock-file and transitive-pinning relaxations below,
and in Directory.Packages.props, can observe it — both files import before any .csproj body.
Override on the command line with -p:UseLocalEssentials=true or by editing the default here. -->
<PropertyGroup>
<UseLocalEssentials Condition="'$(UseLocalEssentials)' == ''">false</UseLocalEssentials>
</PropertyGroup>

<!-- Local mode does not use the committed packages.lock.json (that lock pins OneWare.Essentials as a
NuGet package; keeping it in local mode would pull a second OneWare.Essentials into the graph and
produce "Ambiguous reference" errors). Redirect the lock to an obj\ scratch file and unlock it so
the local project's own transitive versions (e.g. Avalonia 11.3.18) float instead of downgrading. -->
<PropertyGroup Condition="'$(UseLocalEssentials)' == 'true'">
<RestoreLockedMode>false</RestoreLockedMode>
<NuGetLockFilePath>$(MSBuildProjectDirectory)\obj\packages.local.lock.json</NuGetLockFilePath>
</PropertyGroup>

<!-- Core Compiler Settings -->
<PropertyGroup>
<LangVersion>13.0</LangVersion>
Expand Down
5 changes: 4 additions & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<!-- Transitive pinning is disabled in local mode (UseLocalEssentials=true): the local
OneWare.Essentials checkout pulls newer transitive versions (e.g. Avalonia 11.3.18) than the
central pins here, and pinning would downgrade them to a conflict (NU1109). -->
<CentralPackageTransitivePinningEnabled Condition="'$(UseLocalEssentials)' != 'true'">true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia" Version="11.3.17" />
Expand Down
4 changes: 2 additions & 2 deletions docker/oss-cad-suite/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# OSS CAD Suite Build

# Stage 1
FROM ubuntu@sha256:b7f48194d4d8b763a478a621cdc81c27be222ba2206ca3ca6bc42b49685f3d9e AS downloader
FROM ubuntu@sha256:3131b4cc82a783df6c9df078f86e01819a13594b865c2cad47bd1bca2b7063bb AS downloader

ENV DEBIAN_FRONTEND=noninteractive

Expand All @@ -28,7 +28,7 @@ RUN wget --progress=dot:giga --retry-connrefused --read-timeout=60 --timeout=30
&& rm -rf /opt/oss-cad-suite/lib/python3*/test

# Stage 2
FROM ubuntu@sha256:b7f48194d4d8b763a478a621cdc81c27be222ba2206ca3ca6bc42b49685f3d9e
FROM ubuntu@sha256:3131b4cc82a783df6c9df078f86e01819a13594b865c2cad47bd1bca2b7063bb

LABEL org.opencontainers.image.authors="YosysHQ, Mert Torun"
LABEL org.opencontainers.image.title="OSS CAD Suite"
Expand Down
10 changes: 9 additions & 1 deletion oneware-extension.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"type": "Plugin",
"name": "OneWare Container Extension",
"id": "ContainerExtension",
"version": "1.0.13",
"version": "1.0.14",
"description": "Transparent containerized execution of FPGA toolchains (GHDL, Yosys, nextpnr) with auto-runtime detection, live Docker dashboard, execution telemetry, and hardened container infrastructure.",
"license": "MIT",
"iconUrl": "https://raw.githubusercontent.com/FEntwumS/FEntwumS.ContainerExtension/main/Icon.svg",
Expand All @@ -25,6 +25,14 @@
],
"sourceUrl": "https://github.com/FEntwumS/FEntwumS.ContainerExtension/releases/download",
"versions": [
{
"version": "1.0.14",
"targets": [
{
"target": "all"
}
]
},
{
"version": "1.0.13",
"targets": [
Expand Down
15 changes: 12 additions & 3 deletions src/ContainerExtension/ContainerExtension.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<Version>1.0.13</Version>
<Version>1.0.14</Version>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
Expand All @@ -10,11 +10,13 @@
<SelfContained>false</SelfContained>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);CS1591;MA0051;S3358;MA0048;MA0016;MA0011;MA0009;S1075;S3903;S3267;S3010;S2696;S125;S1244;S1118;MA0134;MA0047;S1905;S3168;S6966</NoWarn>
<!-- UseLocalEssentials is defined in Directory.Build.props so that Directory.Build.props and
Directory.Packages.props (imported before this file) can see it and relax the lock file /
transitive pinning for local mode. Toggle it there, not here. -->
</PropertyGroup>

<ItemGroup>
<InternalsVisibleTo Include="ContainerExtension.UnitTests" />
<InternalsVisibleTo Include="ContainerBenchmarkHarness" />
</ItemGroup>

<ItemGroup>
Expand All @@ -36,7 +38,6 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="OneWare.Essentials" Private="false" ExcludeAssets="runtime;Native" />
<PackageReference Include="Docker.DotNet" Private="true" />
<PackageReference Include="System.IO.Pipelines" />
<PackageReference Include="SonarAnalyzer.CSharp">
Expand All @@ -45,6 +46,14 @@
</PackageReference>
</ItemGroup>

<ItemGroup Condition="'$(UseLocalEssentials)' == 'true'">
<ProjectReference Include="..\..\..\OneWare\src\OneWare.Essentials\OneWare.Essentials.csproj" Private="false" ExcludeAssets="runtime;Native" />
</ItemGroup>

<ItemGroup Condition="'$(UseLocalEssentials)' != 'true'">
<PackageReference Include="OneWare.Essentials" Private="false" ExcludeAssets="runtime;Native" />
</ItemGroup>

<ItemGroup>
<TrimmerRootDescriptor Include="link.xml" />
</ItemGroup>
Expand Down
Loading
Loading