mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-22 01:26:20 +08:00
a568a7e54c
This pull request standardizes the handling of the `ContinuationPoint` property in `BrowseResult` objects, ensuring it is always explicitly set to `null` (or its equivalent) when no continuation point is present. This change improves clarity and consistency in both the implementation and the tests, replacing checks for an "empty" continuation point with checks for a "null" continuation point. **Codebase consistency and correctness:** * All `BrowseResult` objects now explicitly set `ContinuationPoint = default` when no continuation point is to be returned, ensuring consistent initialization. (`src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs`) [[1]](diffhunk://#diff-851e5925c677925c42bd70bce11ea1a75a5f5cbdb810ac851351385e16f54a71L1900-R1904) [[2]](diffhunk://#diff-851e5925c677925c42bd70bce11ea1a75a5f5cbdb810ac851351385e16f54a71L2068-R2076) [[3]](diffhunk://#diff-851e5925c677925c42bd70bce11ea1a75a5f5cbdb810ac851351385e16f54a71L2078-R2090) **Test updates for new semantics:** * All test assertions now use `ContinuationPoint.IsNull` instead of `IsEmpty` to check for the absence of a continuation point, reflecting the new contract. (`tests/Opc.Ua.InformationModel.Tests/BrowseContinuationPointTests.cs`, `tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs`) [[1]](diffhunk://#diff-904275d6b4bee35e6884f38e0db5cbc955216eaf2aa7f468ba285133470e1596L121-R122) [[2]](diffhunk://#diff-904275d6b4bee35e6884f38e0db5cbc955216eaf2aa7f468ba285133470e1596L394-R394) [[3]](diffhunk://#diff-904275d6b4bee35e6884f38e0db5cbc955216eaf2aa7f468ba285133470e1596L435-R435) [[4]](diffhunk://#diff-904275d6b4bee35e6884f38e0db5cbc955216eaf2aa7f468ba285133470e1596L634-R634) [[5]](diffhunk://#diff-bda1da5dc01533ffe61d1c65b6e968b6462e11a63758ac95ded000ffc885345eL420-R420) * Additional test cases have been added to verify that completed browse operations and error scenarios always return a null continuation point. (`tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs`) [[1]](diffhunk://#diff-3d9efc81935ec60d7513334833e9eab033925194f5a0d11105668204cc60f54aR203-R230) [[2]](diffhunk://#diff-3d9efc81935ec60d7513334833e9eab033925194f5a0d11105668204cc60f54aR327) [[3]](diffhunk://#diff-3d9efc81935ec60d7513334833e9eab033925194f5a0d11105668204cc60f54aR349)# Description _Describe the changes here to communicate to the maintainers why they should accept this pull request. By default - this will become the Commit message after merging and thus define history._ ## Related Issues _Reference all GitHub issues this PR addresses. If there is no issue yet, open one and link it here._ _If this is a relatively large or complex change, a design must have been discussed in the related tracking issue and signed off (which becomes the Architectural Decision Record (ADR))._ - Fixes #github-issue-number, ... ## Checklist _Put an `x` in the boxes that apply. You can complete these step by step after opening the PR._ - [x] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [x] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [ ] I have verified that my changes do not introduce (new) build or analyzer warnings. - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received. --------- Co-authored-by: Marc Schier <marcschier@users.noreply.github.com> Co-authored-by: Marc Schier <marcschier@hotmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
100 lines
3.8 KiB
Docker
100 lines
3.8 KiB
Docker
# PumpDeviceIntegrationServer container image.
|
|
#
|
|
# Multi-stage, framework-dependent build on the .NET AzureLinux 3 base
|
|
# images.
|
|
#
|
|
# IMPORTANT: the build context MUST be the repository ROOT (not this
|
|
# folder), because the project pulls in the whole source tree (src/,
|
|
# src/, tools/). Build it like this:
|
|
#
|
|
# # from the repository root:
|
|
# docker build -f samples/PumpDeviceIntegrationServer/Dockerfile \
|
|
# -t pumpdeviceintegrationserver:local .
|
|
#
|
|
# Running `docker build .` from inside this folder will fail fast with a
|
|
# helpful message (the context would be missing the rest of the repo).
|
|
#
|
|
# The final image runs as a non-root user and listens on 0.0.0.0:62542
|
|
# (override host/port via the `host` / `port` environment variables).
|
|
|
|
FROM mcr.microsoft.com/dotnet/sdk:10.0-azurelinux3.0 AS build
|
|
WORKDIR /src
|
|
|
|
# JIT is disabled for the source generators unless W^X is turned off on
|
|
# some kernels; match the existing ConsoleReferenceServer Dockerfile.
|
|
ENV DOTNET_EnableWriteXorExecute=0
|
|
|
|
# Copy the full repository. The project pulls in many transitive
|
|
# ProjectReferences, a source-generator analyzer, and AdditionalFiles
|
|
# NodeSet2 XML/CSV inputs, so a per-csproj copy list would be fragile.
|
|
COPY . .
|
|
|
|
# Fail fast with a clear message when the build context is not the
|
|
# repository root (UA.slnx is the root marker).
|
|
RUN test -f UA.slnx || { \
|
|
echo ''; \
|
|
echo 'ERROR: build the repository ROOT as the Docker context, not this folder.'; \
|
|
echo ' The image needs the full source tree (src/, src/, tools/).'; \
|
|
echo ''; \
|
|
echo ' From the repository root run:'; \
|
|
echo ' docker build -f samples/PumpDeviceIntegrationServer/Dockerfile -t pumpdeviceintegrationserver .'; \
|
|
echo ''; \
|
|
exit 1; \
|
|
}
|
|
|
|
ARG Version
|
|
ARG SimpleVersion
|
|
ARG InformationalVersion
|
|
|
|
RUN dotnet restore "samples/PumpDeviceIntegrationServer/PumpDeviceIntegrationServer.csproj" \
|
|
--force -p:NoHttps=true
|
|
|
|
RUN dotnet publish "samples/PumpDeviceIntegrationServer/PumpDeviceIntegrationServer.csproj" \
|
|
--no-restore \
|
|
-c Release \
|
|
-f net10.0 \
|
|
-p:PublishAot=false \
|
|
-p:NoHttps=true \
|
|
-p:Dockerbuild=true \
|
|
-p:Version=${Version} \
|
|
-p:AssemblyVersion=${SimpleVersion} \
|
|
-p:FileVersion=${Version} \
|
|
-p:InformationalVersion=${InformationalVersion} \
|
|
-o /app/publish
|
|
|
|
FROM mcr.microsoft.com/dotnet/runtime:10.0-azurelinux3.0 AS final
|
|
|
|
# AzureLinux forces the SymCrypt OpenSSL provider as the default for all
|
|
# EVP operations (default_properties = "?provider=symcryptprovider" in
|
|
# openssl.cnf). SymCrypt's ECDSA SignHash path rejects the self-signing
|
|
# call the OPC UA stack makes when creating its ECC application-instance
|
|
# certificate ("operation not supported for this keytype"). Clearing the
|
|
# forced default lets the standard OpenSSL default provider handle ECDSA
|
|
# (still fully secure; just not the FIPS-validated SymCrypt module).
|
|
RUN sed -i 's/^default_properties = .*/default_properties = ""/' /etc/pki/tls/openssl.cnf
|
|
|
|
WORKDIR /app
|
|
COPY --from=build /app/publish .
|
|
|
|
# The .NET base images ship a predefined non-root user `app` (UID 1654,
|
|
# exposed via the APP_UID env var). The server creates its
|
|
# certificate/PKI store under /app at runtime. The shared /diag
|
|
# directory carries the diagnostic socket and collected artifacts for
|
|
# the companion Kubernetes diagnostics container.
|
|
ENV HOME=/app \
|
|
DOTNET_DiagnosticPorts=/diag/dotnet-diagnostic.sock,suspend=n,listen
|
|
RUN mkdir -p /app/pki /diag \
|
|
&& chown -R $APP_UID:0 /app /diag \
|
|
&& chmod -R g=u /app /diag
|
|
|
|
USER $APP_UID
|
|
|
|
# Bind to all interfaces so the endpoint is reachable from outside the
|
|
# container. Override with `-e host=...` / `-e port=...`.
|
|
ENV host=0.0.0.0 \
|
|
port=62542
|
|
|
|
EXPOSE 62542
|
|
|
|
ENTRYPOINT ["dotnet", "PumpDeviceIntegrationServer.dll"]
|