mirror of
https://github.com/corda/corda.git
synced 2025-02-21 01:42:24 +00:00
CORDA-2647 ROLLBACK (#4964)
* Revert "Address comments" This reverts commit f884d112c33d524afe759d67e2c6290d073fb9d0. * Revert "CORDA-2647 - Prevent registration when previous state exists" This reverts commit 4e9d1f1924017999065a96b1e4e0de41d10d2bc2.
This commit is contained in:
parent
add380b135
commit
e0f19ca70b
@ -1,105 +0,0 @@
|
||||
package net.corda.node.internal.subcommands
|
||||
|
||||
import net.corda.core.internal.deleteRecursively
|
||||
import net.corda.core.internal.div
|
||||
import net.corda.node.internal.NodeStartup
|
||||
import net.corda.node.services.config.NodeConfiguration
|
||||
import net.corda.node.internal.Node
|
||||
import net.corda.testing.driver.internal.incrementalPortAllocation
|
||||
import org.h2.tools.Server
|
||||
import org.junit.AfterClass
|
||||
import org.junit.BeforeClass
|
||||
import org.junit.Test
|
||||
import org.mockito.Mockito
|
||||
import org.mockito.Mockito.mock
|
||||
import java.lang.IllegalStateException
|
||||
import java.nio.file.Files
|
||||
import java.sql.DriverManager
|
||||
import java.util.*
|
||||
|
||||
class InitialRegistrationCliTest {
|
||||
|
||||
companion object {
|
||||
|
||||
private lateinit var initialRegistration: InitialRegistration
|
||||
|
||||
private val networkTrustRootPassword = "some-password"
|
||||
private val nodeStartup = mock(NodeStartup::class.java)
|
||||
|
||||
private val baseDirectory = Files.createTempDirectory("base-dir")!!
|
||||
private val networkTrustRootFile = Files.createTempFile("trust-root-store", "jks")
|
||||
|
||||
private lateinit var nodeConfiguration: NodeConfiguration
|
||||
private lateinit var datasourceProperties: Properties
|
||||
private lateinit var node: Node
|
||||
|
||||
private val h2jdbcUrl = "jdbc:h2:tcp://localhost:<port>/~/node"
|
||||
private val h2User = "sa"
|
||||
private val h2Password = ""
|
||||
private var port = 10009
|
||||
|
||||
private lateinit var server: Server
|
||||
|
||||
@BeforeClass
|
||||
@JvmStatic
|
||||
fun prepare() {
|
||||
nodeConfiguration = mock(NodeConfiguration::class.java)
|
||||
datasourceProperties = Properties()
|
||||
node = mock(Node::class.java)
|
||||
|
||||
Mockito.`when`(node.configuration).thenReturn(nodeConfiguration)
|
||||
Mockito.`when`(nodeConfiguration.dataSourceProperties).thenReturn(datasourceProperties)
|
||||
|
||||
port = incrementalPortAllocation(port).nextPort()
|
||||
server = Server.createTcpServer("-tcpPort", port.toString(), "-tcpAllowOthers", "-tcpDaemon").start()
|
||||
executeSqlStatement("CREATE TABLE NODE_ATTACHMENTS(USERNAME VARCHAR(20));")
|
||||
|
||||
initialRegistration = InitialRegistration(baseDirectory, networkTrustRootFile, networkTrustRootPassword, nodeStartup)
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
@JvmStatic
|
||||
fun cleanup() {
|
||||
baseDirectory.deleteRecursively()
|
||||
networkTrustRootFile.deleteRecursively()
|
||||
|
||||
executeSqlStatement("DROP TABLE NODE_ATTACHMENTS;")
|
||||
server.shutdown()
|
||||
}
|
||||
|
||||
private fun executeSqlStatement(sqlStatement: String) {
|
||||
val connection = DriverManager.getConnection(getJdbcUrl(), h2User, h2Password)
|
||||
val statement = connection.createStatement()
|
||||
statement.execute(sqlStatement)
|
||||
}
|
||||
|
||||
private fun getJdbcUrl(): String {
|
||||
return h2jdbcUrl.replace("<port>", port.toString())
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException::class)
|
||||
fun `registration fails when there is existing artemis folder`() {
|
||||
Files.createDirectories(baseDirectory / "artemis")
|
||||
|
||||
initialRegistration.registerWithNetwork(node.configuration)
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException::class)
|
||||
fun `registration fails when there is existing brokers folder`() {
|
||||
Files.createDirectories(baseDirectory / "brokers")
|
||||
|
||||
initialRegistration.registerWithNetwork(node.configuration)
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException::class)
|
||||
fun `registration fails when database contains tables`() {
|
||||
datasourceProperties.setProperty("dataSource.url", getJdbcUrl())
|
||||
datasourceProperties.setProperty("dataSource.user", h2User)
|
||||
datasourceProperties.setProperty("dataSource.password", h2Password)
|
||||
Mockito.`when`(nodeConfiguration.dataSourceProperties).thenReturn(datasourceProperties)
|
||||
|
||||
initialRegistration.registerWithNetwork(node.configuration)
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
package net.corda.node.internal.subcommands
|
||||
|
||||
import net.corda.cliutils.CliWrapperBase
|
||||
import net.corda.core.internal.VisibleForTesting
|
||||
import net.corda.core.internal.createFile
|
||||
import net.corda.core.internal.div
|
||||
import net.corda.core.internal.exists
|
||||
@ -13,14 +12,10 @@ import net.corda.node.internal.NodeStartupLogging.Companion.logger
|
||||
import net.corda.node.services.config.NodeConfiguration
|
||||
import net.corda.node.utilities.registration.HTTPNetworkRegistrationService
|
||||
import net.corda.node.utilities.registration.NodeRegistrationHelper
|
||||
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
|
||||
import picocli.CommandLine.Mixin
|
||||
import picocli.CommandLine.Option
|
||||
import java.io.File
|
||||
import java.lang.IllegalStateException
|
||||
import java.nio.file.Path
|
||||
import java.sql.DriverManager
|
||||
import java.sql.SQLException
|
||||
import java.util.function.Consumer
|
||||
|
||||
class InitialRegistrationCli(val startup: NodeStartup): CliWrapperBase("initial-registration", "Start initial node registration with Corda network to obtain certificate from the permissioning server.") {
|
||||
@ -63,12 +58,7 @@ class InitialRegistration(val baseDirectory: Path, private val networkRootTrustS
|
||||
|
||||
private val nodeRegistration = NodeRegistrationOption(networkRootTrustStorePath, networkRootTrustStorePassword)
|
||||
|
||||
private val EXISTING_STATE_GENERIC_WARNING = "Initial registration can only be run on a new, clean node."
|
||||
|
||||
@VisibleForTesting
|
||||
fun registerWithNetwork(conf: NodeConfiguration) {
|
||||
verifyNoStateFromPreviousRuns(conf)
|
||||
|
||||
private fun registerWithNetwork(conf: NodeConfiguration) {
|
||||
val versionInfo = startup.getVersionInfo()
|
||||
|
||||
println("\n" +
|
||||
@ -92,29 +82,10 @@ class InitialRegistration(val baseDirectory: Path, private val networkRootTrustS
|
||||
println("Corda node will now terminate.")
|
||||
}
|
||||
|
||||
private fun verifyNoStateFromPreviousRuns(conf: NodeConfiguration) {
|
||||
val artemisDirectory = baseDirectory / "artemis"
|
||||
check(!artemisDirectory.exists()) { "The node folder contains an artemis directory. $EXISTING_STATE_GENERIC_WARNING" }
|
||||
val brokersDirectory = baseDirectory / "brokers"
|
||||
check(!brokersDirectory.exists()) { "The node folder contains a brokers directory. $EXISTING_STATE_GENERIC_WARNING" }
|
||||
|
||||
try {
|
||||
val datasource = DataSourceFactory.createDataSource(conf.dataSourceProperties, false)
|
||||
val connectionMetadata = datasource.connection.metaData
|
||||
// Accounting for different case-sensitivity behaviours (i.e. H2 creates tables in upper-case in some cases)
|
||||
val tablesLowerCaseResultSet = connectionMetadata.getTables(null, null, "$NODE_DATABASE_PREFIX%", null)
|
||||
val tablesUpperCaseResultSet = connectionMetadata.getTables(null, null, "${NODE_DATABASE_PREFIX.toUpperCase()}%", null)
|
||||
check(!tablesLowerCaseResultSet.first() && !tablesUpperCaseResultSet.first()) {
|
||||
"The database contains Corda-specific tables, while it should be empty. $EXISTING_STATE_GENERIC_WARNING"
|
||||
}
|
||||
} catch (exception: SQLException) {
|
||||
throw Exception("An error occurred whilst connecting to \"${conf.dataSourceProperties.getProperty("dataSource.url")}\". ", exception)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initialRegistration(config: NodeConfiguration) {
|
||||
// Null checks for [compatibilityZoneURL], [rootTruststorePath] and [rootTruststorePassword] has been done in [CmdLineOptions.loadConfig]
|
||||
attempt { registerWithNetwork(config) }.doOnFailure(Consumer(this::handleRegistrationError))
|
||||
attempt { registerWithNetwork(config) }.doOnFailure(Consumer(this::handleRegistrationError)) as Try.Success
|
||||
// At this point the node registration was successful. We can delete the marker file.
|
||||
deleteNodeRegistrationMarker(baseDirectory)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user