From 2ee0de1fb77ce277725da54e0b4aa39d46f8884c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:19:46 +0000 Subject: [PATCH 1/4] Initial plan From c53c89df2e849756c012a5e8892bf07bc781b897 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:37:41 +0000 Subject: [PATCH 2/4] Add .NET 10 support to all projects and workflows Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/buildtest.yaml | 4 +++- .github/workflows/codeql-analysis.yml | 1 + .github/workflows/docfx.yaml | 1 + .github/workflows/draft.yaml | 1 + .github/workflows/nuget.yaml | 1 + README.md | 2 +- src/KubernetesClient.Aot/KubernetesClient.Aot.csproj | 2 +- src/KubernetesClient.Kubectl/KubernetesClient.Kubectl.csproj | 2 +- src/KubernetesClient/KubernetesClient.csproj | 2 +- tests/E2E.Tests/E2E.Tests.csproj | 2 +- tests/Kubectl.Tests/Kubectl.Tests.csproj | 2 +- .../KubernetesClient.Classic.Tests.csproj | 4 ++-- tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj | 2 +- 13 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/buildtest.yaml b/.github/workflows/buildtest.yaml index 26d585ec7..2935bd0a9 100644 --- a/.github/workflows/buildtest.yaml +++ b/.github/workflows/buildtest.yaml @@ -17,6 +17,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Build run: dotnet build --configuration Release - name: Test @@ -46,7 +47,7 @@ jobs: - name: Setup dotnet SDK uses: actions/setup-dotnet@v5 with: - dotnet-version: '9.0.x' + dotnet-version: '10.0.x' - name: Restore nugets (msbuild) run: msbuild .\src\KubernetesClient\ -t:restore -p:RestorePackagesConfig=true - name: Build (msbuild) @@ -64,6 +65,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Minikube run: minikube start - name: Test diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6355396eb..a277f3de6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -36,6 +36,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/docfx.yaml b/.github/workflows/docfx.yaml index 3eec06ec3..e453af103 100644 --- a/.github/workflows/docfx.yaml +++ b/.github/workflows/docfx.yaml @@ -35,6 +35,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Build run: dotnet build -c Release diff --git a/.github/workflows/draft.yaml b/.github/workflows/draft.yaml index 01b098518..4d273fb70 100644 --- a/.github/workflows/draft.yaml +++ b/.github/workflows/draft.yaml @@ -23,6 +23,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: dotnet restore run: dotnet restore --verbosity minimal --configfile nuget.config diff --git a/.github/workflows/nuget.yaml b/.github/workflows/nuget.yaml index fa654822f..ae1709133 100644 --- a/.github/workflows/nuget.yaml +++ b/.github/workflows/nuget.yaml @@ -20,6 +20,7 @@ jobs: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: dotnet restore run: dotnet restore --verbosity minimal --configfile nuget.config diff --git a/README.md b/README.md index c8eb91626..87c464814 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ ${GEN_DIR}/openapi/csharp.sh ${REPO_DIR}/src/KubernetesClient ${REPO_DIR}/csharp | SDK Version | Kubernetes Version | .NET Targeting | |-------------|--------------------|-----------------------------------------------------| -| 18.0 | 1.34 | net8.0;net9.0;net48*;netstandard2.0* | +| 18.0 | 1.34 | net8.0;net9.0;net10.0;net48*;netstandard2.0* | | 17.0 | 1.33 | net8.0;net9.0;net48*;netstandard2.0* | | 16.0 | 1.32 | net8.0;net9.0;net48*;netstandard2.0* | | 15.0 | 1.31 | net6.0;net8.0;net48*;netstandard2.0* | diff --git a/src/KubernetesClient.Aot/KubernetesClient.Aot.csproj b/src/KubernetesClient.Aot/KubernetesClient.Aot.csproj index 5c7cf8fed..3db7e6139 100644 --- a/src/KubernetesClient.Aot/KubernetesClient.Aot.csproj +++ b/src/KubernetesClient.Aot/KubernetesClient.Aot.csproj @@ -1,7 +1,7 @@  - net8.0;net9.0 + net8.0;net9.0;net10.0 k8s true true diff --git a/src/KubernetesClient.Kubectl/KubernetesClient.Kubectl.csproj b/src/KubernetesClient.Kubectl/KubernetesClient.Kubectl.csproj index 25440a1f7..53bce8543 100644 --- a/src/KubernetesClient.Kubectl/KubernetesClient.Kubectl.csproj +++ b/src/KubernetesClient.Kubectl/KubernetesClient.Kubectl.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0 + net8.0;net9.0;net10.0 enable enable k8s.kubectl diff --git a/src/KubernetesClient/KubernetesClient.csproj b/src/KubernetesClient/KubernetesClient.csproj index dba319136..acd7c079e 100644 --- a/src/KubernetesClient/KubernetesClient.csproj +++ b/src/KubernetesClient/KubernetesClient.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0 + net8.0;net9.0;net10.0 k8s true diff --git a/tests/E2E.Tests/E2E.Tests.csproj b/tests/E2E.Tests/E2E.Tests.csproj index 2c4da8d5e..9b2e278e1 100644 --- a/tests/E2E.Tests/E2E.Tests.csproj +++ b/tests/E2E.Tests/E2E.Tests.csproj @@ -2,7 +2,7 @@ false k8s.E2E - net8.0;net9.0 + net8.0;net9.0;net10.0 diff --git a/tests/Kubectl.Tests/Kubectl.Tests.csproj b/tests/Kubectl.Tests/Kubectl.Tests.csproj index b00ac0151..16eaa3abb 100644 --- a/tests/Kubectl.Tests/Kubectl.Tests.csproj +++ b/tests/Kubectl.Tests/Kubectl.Tests.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0 + net8.0;net9.0;net10.0 enable enable false diff --git a/tests/KubernetesClient.Classic.Tests/KubernetesClient.Classic.Tests.csproj b/tests/KubernetesClient.Classic.Tests/KubernetesClient.Classic.Tests.csproj index 52810130e..c3fb239da 100644 --- a/tests/KubernetesClient.Classic.Tests/KubernetesClient.Classic.Tests.csproj +++ b/tests/KubernetesClient.Classic.Tests/KubernetesClient.Classic.Tests.csproj @@ -2,8 +2,8 @@ false k8s.Tests - net8.0;net9.0 - net8.0;net9.0;net48 + net8.0;net9.0;net10.0 + net8.0;net9.0;net10.0;net48 diff --git a/tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj b/tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj index b6a22afaf..8492b6760 100644 --- a/tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj +++ b/tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj @@ -2,7 +2,7 @@ false k8s.Tests - net8.0;net9.0 + net8.0;net9.0;net10.0 From a0c9b6753d5a07b4ff5e767a3ab9c16b06377c39 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:05:39 -0800 Subject: [PATCH 3/4] Fix datetime serialization to always output 6 decimal places for microseconds (#1687) * Initial plan * Fix datetime serialization to always output 6 decimal places for fractional seconds Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- src/KubernetesClient/KubernetesJson.cs | 20 +++++++++----- .../KubernetesJsonTests.cs | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/KubernetesClient/KubernetesJson.cs b/src/KubernetesClient/KubernetesJson.cs index 69ecdf43e..35cfe3acb 100644 --- a/src/KubernetesClient/KubernetesJson.cs +++ b/src/KubernetesClient/KubernetesJson.cs @@ -60,12 +60,20 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri // Output as RFC3339Micro var date = value.ToUniversalTime(); - var basePart = date.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); - var frac = date.ToString(".ffffff", CultureInfo.InvariantCulture) - .TrimEnd('0') - .TrimEnd('.'); - - writer.WriteStringValue(basePart + frac + "Z"); + // Check if there are any fractional seconds + var ticks = date.Ticks % TimeSpan.TicksPerSecond; + if (ticks == 0) + { + // No fractional seconds - use format without fractional part + var basePart = date.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); + writer.WriteStringValue(basePart + "Z"); + } + else + { + // Has fractional seconds - always use exactly 6 decimal places + var formatted = date.ToString(RFC3339MicroFormat, CultureInfo.InvariantCulture); + writer.WriteStringValue(formatted); + } } } diff --git a/tests/KubernetesClient.Tests/KubernetesJsonTests.cs b/tests/KubernetesClient.Tests/KubernetesJsonTests.cs index 785e38fea..e8f199456 100644 --- a/tests/KubernetesClient.Tests/KubernetesJsonTests.cs +++ b/tests/KubernetesClient.Tests/KubernetesJsonTests.cs @@ -142,4 +142,31 @@ public void ReadWriteDatesJson() Assert.Equal(kManifest, jsonFromObj2); } + + [Fact] + public void DateTimeWithFractionalSecondsAlwaysHasSixDigits() + { + // Test that datetime fields with fractional seconds always output exactly 6 decimal places + // This is required by Kubernetes API which expects RFC3339Micro format + + // Create a datetime with 5 digits of precision (962170 microseconds = .96217 seconds) + var dt = new DateTime(2025, 11, 17, 22, 52, 34, 962, DateTimeKind.Utc).AddTicks(1700); + + var secret = new V1Secret + { + Metadata = new V1ObjectMeta + { + Name = "test-secret", + CreationTimestamp = dt, + }, + }; + + var json = KubernetesJson.Serialize(secret); + + // Verify the datetime is serialized with exactly 6 decimal places + Assert.Contains("2025-11-17T22:52:34.962170Z", json); + + // Also verify it doesn't have 5 digits (which would fail in Kubernetes) + Assert.DoesNotContain("2025-11-17T22:52:34.96217Z", json); + } } From d568a37cfb0b48da7c91c8d9c8143e2f3bc353fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:19:46 +0000 Subject: [PATCH 4/4] Initial plan