diff --git a/graylog2-server/src/main/java/org/graylog/plugins/views/storage/migration/state/actions/MigrationActionsImpl.java b/graylog2-server/src/main/java/org/graylog/plugins/views/storage/migration/state/actions/MigrationActionsImpl.java index 07340cb4b4db..faece1544896 100644 --- a/graylog2-server/src/main/java/org/graylog/plugins/views/storage/migration/state/actions/MigrationActionsImpl.java +++ b/graylog2-server/src/main/java/org/graylog/plugins/views/storage/migration/state/actions/MigrationActionsImpl.java @@ -36,7 +36,6 @@ import org.graylog2.notifications.Notification; import org.graylog2.notifications.NotificationService; import org.graylog2.plugin.GlobalMetricNames; -import org.graylog2.plugin.Version; import org.graylog2.plugin.certificates.RenewalPolicy; import org.graylog2.plugin.cluster.ClusterConfigService; import org.graylog2.rest.resources.datanodes.DatanodeResolver; @@ -77,7 +76,6 @@ public class MigrationActionsImpl implements MigrationActions { private final ElasticsearchVersionProvider searchVersionProvider; private final List elasticsearchHosts; - private final Version graylogVersion = Version.CURRENT_CLASSPATH; private final NotificationService notificationService; @Inject @@ -177,8 +175,7 @@ public boolean caAndRenewalPolicyExist() { public boolean compatibleDatanodesRunning() { Map nodes = nodeService.allActive(); return !nodes.isEmpty() && nodes.values().stream() - .allMatch(node -> node.getDatanodeVersion() != null && - graylogVersion.compareTo(new Version(com.github.zafarkhaja.semver.Version.valueOf(node.getDatanodeVersion()))) == 0); + .allMatch(DataNodeDto::isCompatibleWithVersion); } @Override diff --git a/graylog2-server/src/main/java/org/graylog2/cluster/nodes/DataNodeDto.java b/graylog2-server/src/main/java/org/graylog2/cluster/nodes/DataNodeDto.java index e1fad5deafb2..315408d71085 100644 --- a/graylog2-server/src/main/java/org/graylog2/cluster/nodes/DataNodeDto.java +++ b/graylog2-server/src/main/java/org/graylog2/cluster/nodes/DataNodeDto.java @@ -27,6 +27,7 @@ import org.graylog.security.certutil.CertRenewalService; import org.graylog2.cluster.preflight.DataNodeProvisioningConfig; import org.graylog2.datanode.DataNodeLifecycleTrigger; +import org.graylog2.plugin.Version; import java.time.Instant; import java.time.LocalDateTime; @@ -60,14 +61,19 @@ public abstract class DataNodeDto extends NodeDto { @JsonProperty("action_queue") public abstract DataNodeLifecycleTrigger getActionQueue(); - @jakarta.annotation.Nullable + @Nullable @JsonProperty(FIELD_CERT_VALID_UNTIL) public abstract Date getCertValidUntil(); - @jakarta.annotation.Nullable + @Nullable @JsonProperty(FIELD_DATANODE_VERSION) public abstract String getDatanodeVersion(); + @JsonProperty("version_compatible") + public boolean isCompatibleWithVersion() { + return getDatanodeVersion() != null && + Version.CURRENT_CLASSPATH.compareTo(new Version(com.github.zafarkhaja.semver.Version.valueOf(getDatanodeVersion()))) == 0; + } @Nullable @JsonUnwrapped diff --git a/graylog2-web-interface/src/components/datanode/Types.ts b/graylog2-web-interface/src/components/datanode/Types.ts index 2cb975c6f022..937d12d90465 100644 --- a/graylog2-web-interface/src/components/datanode/Types.ts +++ b/graylog2-web-interface/src/components/datanode/Types.ts @@ -58,6 +58,7 @@ export type DataNode = { cert_valid_until: string | null, error_msg?: string, datanode_version: string, + version_compatible: boolean, } export type DataNodes = Array; diff --git a/graylog2-web-interface/src/components/datanode/migrations/MigrationDatanodeList.tsx b/graylog2-web-interface/src/components/datanode/migrations/MigrationDatanodeList.tsx index 6604ebc41efd..ecf198a82409 100644 --- a/graylog2-web-interface/src/components/datanode/migrations/MigrationDatanodeList.tsx +++ b/graylog2-web-interface/src/components/datanode/migrations/MigrationDatanodeList.tsx @@ -50,6 +50,12 @@ const MigrationDatanodeList = ({ showProvisioningState }: Props) => { ) : ( <>

Data Nodes found: {dataNodes?.list.length}

+ {dataNodes.list.find((datanode) => !datanode.version_compatible) && ( + + There are Data Nodes running with versions incompatible to your current Graylog version. + Please make sure to use the same version for both Graylog and Data Node. + + )}
@@ -58,6 +64,7 @@ const MigrationDatanodeList = ({ showProvisioningState }: Props) => { + @@ -67,6 +74,13 @@ const MigrationDatanodeList = ({ showProvisioningState }: Props) => { + ))}
Transport address Status Certificate valid untilVersion
{datanode.transport_address} {showProvisioningState ? datanode.status : datanode.data_node_status} {datanode.cert_valid_until ? : 'No certificate'} + {!datanode.version_compatible && ( + + )} + {datanode.datanode_version} +