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:
Thomas Schroeter 2019-03-29 18:06:12 +00:00 committed by Rick Parker
parent add380b135
commit e0f19ca70b
2 changed files with 3 additions and 137 deletions

View File

@ -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)
}
}

View File

@ -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)
}