Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
851f281
improve: add license headers to source files (#2980)
csviri Oct 9, 2025
9b63ec9
chore: version to 5.3.0-SNAPSHOT
csviri Oct 14, 2025
be59b6e
Annotation removal using locking (#3015)
shawkins Oct 30, 2025
ee97e61
improve: complete comparable resource version configs (#3027)
csviri Nov 13, 2025
ee73dd9
improve: run pr-s checks for v5.3 (#3042)
csviri Nov 17, 2025
896ae6a
fix: rebase on main after release
csviri Dec 1, 2025
9e61b20
fix(javadoc): invalid method ref blocks snapshot release (#3076)
csviri Dec 1, 2025
f2cfcf9
feat: record desired state in Context (#3082)
metacosm Dec 3, 2025
363c003
improve: rename junit5 module to junit (#3081)
csviri Dec 4, 2025
c7b4f8b
fix: delete empty files result of rebase on main (#3093)
csviri Dec 15, 2025
9986c1e
feat: ReconcileUtils for strongly consistent updates (#3106)
csviri Jan 15, 2026
90cc671
Event filtering now records resource action and previous resource (#3…
csviri Jan 21, 2026
f852af5
improve: facelift samples to use ReconcileUtils (#3135)
csviri Jan 27, 2026
f105902
improve: move compare resource version methods to internal utils (#3137)
csviri Jan 28, 2026
a3bc9e7
feat: move ReconcileUtils methods to ResourceOperations accessible fr…
csviri Feb 2, 2026
0f632f8
improve: KubernetesDependentResource uses resource operations directl…
csviri Feb 2, 2026
a9912ad
feat: naive performance test and handling results storing
csviri Jan 28, 2026
c5c4c8d
fix: improper name
metacosm Jan 28, 2026
8dbbaf7
wip
csviri Jan 30, 2026
98c5427
wip
csviri Feb 3, 2026
0d1af4c
wip
csviri Feb 3, 2026
337c321
wip
csviri Feb 3, 2026
02103d0
wip
csviri Feb 3, 2026
9a194e9
wip
csviri Feb 3, 2026
8540905
wip
csviri Feb 3, 2026
5a64f90
wip
csviri Feb 3, 2026
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
88 changes: 88 additions & 0 deletions .github/scripts/performance-to-markdown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#!/usr/bin/env python3
import json
import sys
import os
import glob

def load_all_summaries(json_files):
"""Load summaries from all JSON files and group by test name"""
summaries_by_name = {}

for json_file in json_files:
try:
with open(json_file, 'r') as f:
data = json.load(f)

if 'summaries' in data and data['summaries']:
for summary in data['summaries']:
name = summary.get('name', 'Unknown Test')
if name not in summaries_by_name:
summaries_by_name[name] = []
summaries_by_name[name].append(summary)
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Warning: Error processing {json_file}: {e}", file=sys.stderr)
continue

return summaries_by_name

def convert_to_markdown(json_files):
"""Convert performance test JSON results to markdown format"""
summaries_by_name = load_all_summaries(json_files)

if not summaries_by_name:
return "## Performance Test Results\n\nNo performance test results found."

markdown = "## Performance Test Results\n\n"

# Create a table for each test name
for name, summaries in sorted(summaries_by_name.items()):
markdown += f"### {name}\n\n"
markdown += "| Duration (ms) | Max Memory (GB) | Processors | Parameters |\n"
markdown += "|---------------|-----------------|------------|------------|\n"

for summary in summaries:
duration = summary.get('duration', 0)
processors = summary.get('numberOfProcessors', 0)
max_memory = summary.get('maxMemory', 0)

# Convert memory from bytes to GB
max_memory_gb = max_memory / (1024 ** 3) if max_memory > 0 else 0

# Extract dynamic properties (excluding standard fields)
standard_fields = {'name', 'duration', 'numberOfProcessors', 'maxMemory'}
params = []
for key, value in summary.items():
if key not in standard_fields:
params.append(f"{key}={value}")

params_str = ", ".join(params) if params else "-"

markdown += f"| {duration} | {max_memory_gb:.2f} | {processors} | {params_str} |\n"

markdown += "\n"

return markdown

if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: performance-to-markdown.py <json_file> [json_file2 ...]")
print(" or: performance-to-markdown.py <glob_pattern>")
sys.exit(1)

# Collect all JSON files from arguments (supporting both direct files and glob patterns)
json_files = []
for arg in sys.argv[1:]:
if '*' in arg:
json_files.extend(glob.glob(arg, recursive=True))
else:
json_files.append(arg)

# Filter to only existing files
json_files = [f for f in json_files if os.path.isfile(f)]

if not json_files:
print("## Performance Test Results\n\nNo performance test results found.")
sys.exit(0)

markdown = convert_to_markdown(json_files)
print(markdown)
3 changes: 2 additions & 1 deletion .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ on:
paths-ignore:
- 'docs/**'
- 'adr/**'
branches: [ main, next ]
branches: [ main, next, v5.3 ]
push:
paths-ignore:
- 'docs/**'
- 'adr/**'
branches:
- main
- next
- v5.3

jobs:
sample_operators_tests:
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,21 @@ jobs:
minikube version: 'v1.36.0'
kubernetes version: '${{ inputs.kube-version }}'
github token: ${{ github.token }}

- name: "${{inputs.it-category}} integration tests (kube: ${{ inputs.kube-version }} / java: ${{ inputs.java-version }} / client: ${{ inputs.http-client }})"
run: |
if [ -z "${{inputs.it-category}}" ]; then
it_profile="integration-tests"
else
it_profile="integration-tests-${{inputs.it-category}}"
fi
echo "{ \"kube-version\":\"${{inputs.kube-version}}\", \"java-version\":\"${{ inputs.java-version }}\", \"http-client\":\"${{inputs.http-client}}\" }" >> run-properties.json
echo "Using profile: ${it_profile}"
./mvnw ${MAVEN_ARGS} -T1C -B install -DskipTests -Pno-apt --file pom.xml
./mvnw ${MAVEN_ARGS} -T1C -B package -P${it_profile} -Dfabric8-httpclient-impl.name=${{inputs.http-client}} --file pom.xml

- name: Upload performance test results
uses: actions/upload-artifact@v6
with:
name: performance-results-run-${{ github.run_id }}-java${{ inputs.java-version }}-k8s${{ inputs.kube-version }}-${{ inputs.http-client }}
path: operator-framework/target/performance_test_result.json
if-no-files-found: ignore
41 changes: 41 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,44 @@ jobs:

build:
uses: ./.github/workflows/build.yml

performance_report:
name: Post Performance Results
runs-on: ubuntu-latest
needs: build
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v6

- name: Download all performance artifacts
uses: actions/download-artifact@v7
with:
pattern: performance-results-run-${{ github.run_id }}*
path: performance-results
merge-multiple: false

- name: Check for performance results
id: check_results
run: |
if [ -d "performance-results" ] && [ "$(ls -A performance-results/**/*.json 2>/dev/null)" ]; then
echo "Has results"
echo "has_results=true" >> $GITHUB_OUTPUT
else
echo "Has NO results"
echo "has_results=false" >> $GITHUB_OUTPUT
fi

- name: Convert performance results to markdown
if: steps.check_results.outputs.has_results == 'true'
id: convert
run: |
python3 .github/scripts/performance-to-markdown.py performance-results/**/*.json > comment.md

- name: Post PR comment
if: steps.check_results.outputs.has_results == 'true' && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
path: comment.md
recreate: true

2 changes: 1 addition & 1 deletion bootstrapper-maven-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>java-operator-sdk</artifactId>
<version>5.2.3-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
</parent>

<artifactId>bootstrapper</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit-5</artifactId>
<artifactId>operator-framework-junit</artifactId>
<version>${josdk.version}</version>
<scope>test</scope>
</dependency>
Expand Down
4 changes: 2 additions & 2 deletions caffeine-bounded-cache-support/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>java-operator-sdk</artifactId>
<version>5.2.3-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
</parent>

<artifactId>caffeine-bounded-cache-support</artifactId>
Expand All @@ -43,7 +43,7 @@
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit-5</artifactId>
<artifactId>operator-framework-junit</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
Expand Down
29 changes: 29 additions & 0 deletions docs/content/en/docs/migration/v5-3-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
title: Migrating from v5.2 to v5.3
description: Migrating from v5.2 to v5.3
---


## Renamed JUnit Module

If you use JUnit extension in your test just rename it from:

```
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit-5</artifactId>
<version>5.2.x<version>
<scope>test</scope>
</dependency>
```

to

```
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit</artifactId>
<version>5.3.0<version>
<scope>test</scope>
</dependency>
```
4 changes: 2 additions & 2 deletions micrometer-support/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>java-operator-sdk</artifactId>
<version>5.2.3-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
</parent>

<artifactId>micrometer-support</artifactId>
Expand Down Expand Up @@ -58,7 +58,7 @@
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit-5</artifactId>
<artifactId>operator-framework-junit</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
Expand Down
6 changes: 3 additions & 3 deletions operator-framework-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-bom</artifactId>
<version>5.2.3-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Operator SDK - Bill of Materials</name>
<description>Java SDK for implementing Kubernetes operators</description>
Expand Down Expand Up @@ -55,7 +55,7 @@
<maven-source-plugin.version>3.4.0</maven-source-plugin.version>
<maven-javadoc-plugin.version>3.12.0</maven-javadoc-plugin.version>
<spotless.version>3.1.0</spotless.version>
<central-publishing-maven-plugin.version>0.10.0</central-publishing-maven-plugin.version>
<central-publishing-maven-plugin.version>0.9.0</central-publishing-maven-plugin.version>
</properties>

<dependencyManagement>
Expand All @@ -77,7 +77,7 @@
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-junit-5</artifactId>
<artifactId>operator-framework-junit</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
Expand Down
2 changes: 1 addition & 1 deletion operator-framework-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>java-operator-sdk</artifactId>
<version>5.2.3-SNAPSHOT</version>
<version>5.3.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ public <P extends HasMetadata> RegisteredController<P> register(
"Cannot register reconciler with name "
+ reconciler.getClass().getCanonicalName()
+ " reconciler named "
+ ReconcilerUtils.getNameFor(reconciler)
+ ReconcilerUtilsInternal.getNameFor(reconciler)
+ " because its configuration cannot be found.\n"
+ " Known reconcilers are: "
+ configurationService.getKnownReconcilerNames());
Expand Down
Loading