Compare commits

...
Author SHA1 Message Date
james.maesandClaude Opus 5.5 a7ad7e2c9f build: develop carries 0.1.0-SNAPSHOT; version test reads the build
The release orb computes the RC on release/0.1. The producer test no longer
asserts a version literal; the version comes from the filtered
qbit-cluster.properties (and equals qbit.artifactVersion when set).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:23:07 -05:00
james.maes 376a66d2fb Merge pull request #3 from QRun-IO/feature/qqq-rc14
build: QQQ 4.1.0-RC.14
2026-10-15 14:11:13 -05:00
james.maesandClaude Opus 5.5 a10a31b695 build: QQQ 4.1.0-RC.14 (ships the cluster APIs)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:04:48 -05:00
james.maes 3ea2debd6b Merge pull request #2 from QRun-IO/feature/widget-four-columns
fix(widget): cluster nodes table in four columns
2026-10-15 12:25:14 -05:00
james.maesandClaude Opus 5.5 21f22bb926 fix(widget): cluster nodes table in four columns
Where the node runs and its version fold into the Node column, so the table
stays readable at every width (hosts gate widgets at four columns).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:24:56 -05:00
5 changed files with 29 additions and 12 deletions

No files matched your search

+1 -1
View File
@@ -25,7 +25,7 @@ section E (summary in [docs/DESIGN.md](docs/DESIGN.md)).
<dependency>
<groupId>com.kingsrook.qbits</groupId>
<artifactId>qbit-cluster</artifactId>
<version>0.1.0-RC.1</version>
<version>0.1.0-RC.1</version><!-- first release; see GitHub releases for the latest -->
</dependency>
```
+2 -2
View File
@@ -18,7 +18,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<properties>
<revision>0.1.0-RC.1</revision>
<revision>0.1.0-SNAPSHOT</revision>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<jacoco.version>0.8.15</jacoco.version>
@@ -211,7 +211,7 @@
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<qqq.snapshot.version>4.1.0-SNAPSHOT</qqq.snapshot.version>
<qqq.snapshot.version>4.1.0-RC.14</qqq.snapshot.version>
</properties>
<dependencyManagement>
<dependencies>
@@ -67,8 +67,6 @@ public class ClusterNodesWidgetRenderer extends AbstractWidgetRenderer
static final String NODE = "node";
static final String STATUS = "status";
static final String HEARTBEAT = "heartbeat";
static final String WHERE = "where";
static final String VERSION = "version";
@@ -96,7 +94,7 @@ public class ClusterNodesWidgetRenderer extends AbstractWidgetRenderer
}
TableData table = new TableData(null, List.of(
column("Role", ROLE), column("Node", NODE), column("Status", STATUS), column("Last heartbeat", HEARTBEAT), column("Where", WHERE), column("Version", VERSION)), rows)
column("Role", ROLE), column("Node", NODE), column("Status", STATUS), column("Last heartbeat", HEARTBEAT)), rows)
.withNoRowsFoundHTML("No nodes are running. A node appears here once it starts with the Cluster qbit.")
.withRowsPerPage(50)
.withHidePaginationDropdown(true);
@@ -112,17 +110,29 @@ public class ClusterNodesWidgetRenderer extends AbstractWidgetRenderer
{
Map<String, Object> row = new LinkedHashMap<>();
row.put(ROLE, roleLabel(role));
row.put(NODE, node.getValueString(ClusterTables.NODE_ID));
row.put(NODE, nodeText(node));
row.put(STATUS, statusText(node));
row.put(HEARTBEAT, age(node.getValueInstant(ClusterTables.HEARTBEAT_AT), now));
row.put(WHERE, Stream.of(node.getValueString(ClusterTables.K8S_NODE_NAME), node.getValueString(ClusterTables.ZONE), node.getValueString(ClusterTables.DEPLOYMENT))
.filter(StringUtils::hasContent).collect(Collectors.joining(", ")));
row.put(VERSION, node.getValueString(ClusterTables.VERSION) == null ? "" : node.getValueString(ClusterTables.VERSION));
return (row);
}
/*******************************************************************************
** The node id, with where it runs and its version folded in (four columns
** keep the table readable at every width): "web-7f9 (k8s-2, website-backend, 0.1.110)".
*******************************************************************************/
static String nodeText(QRecord node)
{
String details = Stream.of(node.getValueString(ClusterTables.K8S_NODE_NAME), node.getValueString(ClusterTables.ZONE), node.getValueString(ClusterTables.DEPLOYMENT),
node.getValueString(ClusterTables.VERSION))
.filter(StringUtils::hasContent).collect(Collectors.joining(", "));
String nodeId = node.getValueString(ClusterTables.NODE_ID);
return (details.isEmpty() ? nodeId : nodeId + " (" + details + ")");
}
/*******************************************************************************
** "Up", "Draining", "Up, drain requested", "Lost".
*******************************************************************************/
@@ -89,7 +89,14 @@ class ClusterQBitProducerTest extends BaseClusterTest
assertThat(QAlertTypeMetaData.of(qInstance, ClusterAlerts.NODE_LOST)).isNotNull();
assertThat(HealthChecksMetaData.ofOrWithNew(qInstance).getChecks()).anyMatch(check -> ClusterHeartbeatHealthCheck.NAME.equals(check.getName()));
assertThat(qInstance.getRuntimeServices()).extracting(reference -> reference.getName()).containsOnlyOnce(ClusterRuntimeService.class.getName());
assertThat(ClusterQBitProducer.version()).isEqualTo("0.1.0-RC.1");
////////////////////////////////////////////////////////////////////
// the version comes from the build (filtered qbit-cluster.properties) //
////////////////////////////////////////////////////////////////////
assertThat(ClusterQBitProducer.version()).matches("[0-9]+[.][0-9]+[.][0-9]+(-[A-Za-z0-9.]+)?");
if(System.getProperty("qbit.artifactVersion") != null)
{
assertThat(ClusterQBitProducer.version()).isEqualTo(System.getProperty("qbit.artifactVersion"));
}
}
@@ -118,7 +118,7 @@ class ClusterSettingsWidgetHealthTest extends BaseClusterTest
assertThat(rows.get(0).get("heartbeat")).isEqualTo("5 hours ago");
assertThat(rows.get(2).get("status")).isEqualTo("Up, drain requested");
assertThat(rows.get(3).get("heartbeat")).isEqualTo("3 minutes ago");
assertThat(table.getColumns()).hasSize(6);
assertThat(table.getColumns()).as("four columns: readable at every width").hasSize(4);
assertThat(lost).isNotNull();
assertThat(ClusterNodesWidgetRenderer.class).isNotNull();