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]

Reply via email to