This is an automated email from the ASF dual-hosted git repository.
ycai pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-analytics.git
The following commit(s) were added to refs/heads/trunk by this push:
new 8771581 CASSANDRA-18916: Log start-up validation result to a single
report
8771581 is described below
commit 8771581b255e5728a16aea84430506d6f156a589
Author: Yuriy Semchyshyn <[email protected]>
AuthorDate: Fri Oct 6 17:54:34 2023 -0500
CASSANDRA-18916: Log start-up validation result to a single report
Patch by Yuriy Semchyshyn; Reviewed by Dinesh Joshi, Yifan Cai for
CASSANDRA-18916
---
CHANGES.txt | 1 +
.../spark/validation/StartupValidation.java | 13 ++----
.../spark/validation/StartupValidator.java | 48 ++++++++++++++++------
.../spark/validation/KeyStoreValidationTests.java | 39 +++++++++---------
.../spark/validation/StartupValidatorTests.java | 5 +--
.../validation/TrustStoreValidationTests.java | 36 ++++++++--------
6 files changed, 80 insertions(+), 62 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 31a4ed2..51d829c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
1.0.0
+ * Log start-up validation result to a single report (CASSANDRA-18916)
* Use in-jvm dtest framework from Sidecar for testing (CASSANDRA-18759)
* Cassandra Analytics Start-Up Validation (CASSANDRA-18810)
* Expose per partition on-disk usage through new DataFrame that utilizes the
Index.db SSTable file components (CASSANDRA-18683)
diff --git
a/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidation.java
b/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidation.java
index 235fb5a..3a3c5a8 100644
---
a/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidation.java
+++
b/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidation.java
@@ -19,31 +19,24 @@
package org.apache.cassandra.spark.validation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
/**
* An interface that has to be implemented by all startup validations
*/
@FunctionalInterface
public interface StartupValidation
{
- Logger LOGGER = LoggerFactory.getLogger(StartupValidation.class);
-
void validate();
- default void perform()
+ default Throwable perform()
{
try
{
- LOGGER.info("Performing startup validation with " + getClass());
validate();
}
catch (Throwable throwable)
{
- String message = "Failed startup validation with " + getClass();
- LOGGER.error(message, throwable);
- throw new RuntimeException(message, throwable);
+ return throwable;
}
+ return null;
}
}
diff --git
a/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidator.java
b/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidator.java
index 9651389..9d8ed3c 100644
---
a/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidator.java
+++
b/cassandra-analytics-core/src/main/java/org/apache/cassandra/spark/validation/StartupValidator.java
@@ -60,24 +60,46 @@ public final class StartupValidator
public void perform()
{
- try
+ StringBuilder message = new StringBuilder(1024);
+ boolean passed = true;
+
+ if (enabled())
{
- if (enabled())
- {
- LOGGER.info("Performing startup validations");
- validations.forEach(StartupValidation::perform);
- LOGGER.info("Completed startup validations");
- }
- else
+ message.append("Performed startup validations:");
+ for (StartupValidation validation : validations)
{
- LOGGER.info("Skipping startup validations");
+ String name = validation.getClass().getCanonicalName();
+ message.append(System.lineSeparator() + " * " + name + ": ");
+ Throwable result = validation.perform();
+ if (result == null)
+ {
+ LOGGER.debug("Passed startup validation with " + name);
+ message.append("PASSED");
+ }
+ else
+ {
+ LOGGER.error("Failed startup validation with " + name,
result);
+ message.append("FAILED");
+ passed = false;
+ }
}
}
- finally
+ else
+ {
+ message.append("Skipped startup validations");
+ }
+
+ // Regardless of the enabled status, remove all validations, because
the list just keeps growing otherwise
+ reset();
+
+ if (passed)
+ {
+ LOGGER.info(message.toString());
+ }
+ else
{
- // Regardless of enabled status, we should still remove all of the
validations
- // because otherwise the list just keeps growing.
- reset();
+ LOGGER.error(message.toString());
+ throw new RuntimeException("Failed some of startup validations");
}
}
diff --git
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/KeyStoreValidationTests.java
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/KeyStoreValidationTests.java
index 2dd7b33..75cf826 100644
---
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/KeyStoreValidationTests.java
+++
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/KeyStoreValidationTests.java
@@ -24,9 +24,9 @@ import org.junit.jupiter.api.Test;
import org.apache.cassandra.secrets.SecretsProvider;
import org.apache.cassandra.secrets.TestSecretsProvider;
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Unit tests that cover startup validation of a KeyStore
@@ -39,9 +39,9 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.notConfigured();
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("KeyStore is not configured", throwable.getMessage());
}
@Test
@@ -50,9 +50,9 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forKeyStore("PKCS12",
"keystore-missing.p12", "qwerty");
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("KeyStore is empty", throwable.getMessage());
}
@Test
@@ -61,9 +61,9 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forKeyStore("PKCS12",
"keystore-malformed.p12", "qwerty");
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("KeyStore is misconfigured", throwable.getMessage());
}
@Test
@@ -72,9 +72,9 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forKeyStore("PKCS12",
"keystore-empty.p12", "qwerty");
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("KeyStore is empty", throwable.getMessage());
}
@Test
@@ -83,9 +83,9 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forKeyStore("PKCS12",
"keystore-secret.p12", "qwerty");
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("KeyStore contains no private keys",
throwable.getMessage());
}
@Test
@@ -94,6 +94,7 @@ public class KeyStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forKeyStore("PKCS12",
"keystore-private.p12", "qwerty");
KeyStoreValidation validation = new KeyStoreValidation(secrets);
- assertDoesNotThrow(validation::perform);
+ Throwable throwable = validation.perform();
+ assertNull(throwable);
}
}
diff --git
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/StartupValidatorTests.java
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/StartupValidatorTests.java
index 07cdd81..8fafce0 100644
---
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/StartupValidatorTests.java
+++
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/StartupValidatorTests.java
@@ -24,8 +24,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Unit tests that cover basic functioning of the startup validation logic
@@ -62,8 +62,7 @@ public class StartupValidatorTests
StartupValidator.instance().register(TestValidation.succeeding());
RuntimeException exception = assertThrows(RuntimeException.class,
StartupValidator.instance()::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ assertEquals("Failed some of startup validations",
exception.getMessage());
}
@AfterAll
diff --git
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/TrustStoreValidationTests.java
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/TrustStoreValidationTests.java
index 9176030..12a5ce9 100644
---
a/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/TrustStoreValidationTests.java
+++
b/cassandra-analytics-core/src/test/java/org/apache/cassandra/spark/validation/TrustStoreValidationTests.java
@@ -24,9 +24,9 @@ import org.junit.jupiter.api.Test;
import org.apache.cassandra.secrets.SecretsProvider;
import org.apache.cassandra.secrets.TestSecretsProvider;
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Unit tests that cover startup validation of a TrustStore
@@ -39,7 +39,8 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.notConfigured();
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- assertDoesNotThrow(validation::perform); // TrustStore is optional
+ Throwable throwable = validation.perform();
+ assertNull(throwable); // TrustStore is optional
}
@Test
@@ -48,9 +49,9 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forTrustStore("PKCS12",
"keystore-missing.p12", "qwerty");
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("TrustStore is empty", throwable.getMessage());
}
@Test
@@ -59,9 +60,9 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forTrustStore("PKCS12",
"keystore-malformed.p12", "qwerty");
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("TrustStore is misconfigured", throwable.getMessage());
}
@Test
@@ -70,9 +71,9 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forTrustStore("PKCS12",
"keystore-empty.p12", "qwerty");
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("TrustStore is empty", throwable.getMessage());
}
@Test
@@ -81,9 +82,9 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forTrustStore("PKCS12",
"keystore-secret.p12", "qwerty");
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- RuntimeException exception = assertThrows(RuntimeException.class,
validation::perform);
- assertTrue(exception.getMessage().startsWith("Failed startup
validation"));
- assertTrue(exception.getCause() instanceof RuntimeException);
+ Throwable throwable = validation.perform();
+ assertInstanceOf(RuntimeException.class, throwable);
+ assertEquals("TrustStore contains no certificates",
throwable.getMessage());
}
@Test
@@ -92,6 +93,7 @@ public class TrustStoreValidationTests
SecretsProvider secrets = TestSecretsProvider.forTrustStore("PKCS12",
"keystore-certificate.p12", "qwerty");
TrustStoreValidation validation = new TrustStoreValidation(secrets);
- assertDoesNotThrow(validation::perform);
+ Throwable throwable = validation.perform();
+ assertNull(throwable);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]