corda icon indicating copy to clipboard operation
corda copied to clipboard

DriverDSLImpl: incompatible API between Corda CE and OS (4.6.1)

Open manosbatsis opened this issue 5 years ago • 2 comments

  • A clear description of the issue

Tools designed to use OS' DriverDSLImpl fail constructing an instance of the same class using CE. The reason seems to be that CE adds an enableSNI: Boolean constructor parameter, perhaps without a default value.

  • Any logs or stack traces that you can provide (use a site like https://pastebin.com for larger logs)
java.lang.NoSuchMethodError: net.corda.testing.node.internal.DriverDSLImpl.<init>(Lnet/corda/testing/driver/PortAllocation;Lnet/corda/testing/driver/PortAllocation;Ljava/util/Map;Ljava/nio/file/Path;ZZZZLjava/util/List;Lnet/corda/testing/driver/JmxPolicy;Ljava/util/List;Lnet/corda/testing/node/internal/CompatibilityZoneParams;Lnet/corda/core/node/NetworkParameters;Ljava/util/Map;ZLjava/util/Collection;Ljava/nio/file/Path;Ljava/util/List;Ljava/util/Map;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
  • Steps to reproduce the issue

Try to construct an instance like

DriverDSLImpl(
                    portAllocation = defaultParameters.portAllocation,
                    debugPortAllocation = defaultParameters.debugPortAllocation,
                    systemProperties = defaultParameters.systemProperties,
                    driverDirectory = defaultParameters.driverDirectory.toAbsolutePath(),
                    useTestClock = defaultParameters.useTestClock,
                    isDebug = defaultParameters.isDebug,
                    startNodesInProcess = defaultParameters.startNodesInProcess,
                    waitForAllNodesToFinish = defaultParameters.waitForAllNodesToFinish,
                    extraCordappPackagesToScan = @Suppress("DEPRECATION") defaultParameters.extraCordappPackagesToScan,
                    notarySpecs = defaultParameters.notarySpecs,
                    jmxPolicy = defaultParameters.jmxPolicy,
                    compatibilityZone = null,
                    networkParameters = defaultParameters.networkParameters,
                    notaryCustomOverrides = defaultParameters.notaryCustomOverrides,
                    inMemoryDB = defaultParameters.inMemoryDB,
                    cordappsForAllNodes = uncheckedCast(defaultParameters.cordappsForAllNodes),
                    djvmBootstrapSource = defaultParameters.djvmBootstrapSource,
                    djvmCordaSource = defaultParameters.djvmCordaSource,
                    environmentVariables = defaultParameters.environmentVariables,
                    // This is missing from OS so it wont compile
                    // enableSNI = true,
                    allowHibernateToManageAppSchema = true,
                    premigrateH2Database = true
  • The version/tag/release or commit hash it occurred on

Corda CE 4.6.1

manosbatsis avatar Nov 26 '20 23:11 manosbatsis

Automatically created Jira issue: CORDA-4090

r3jirabot avatar Nov 26 '20 23:11 r3jirabot

For the unlikely future bloke looking for a workaround, i used this in my node driver helper:

fun createDriver(defaultParameters: DriverParameters ): DriverDSLImpl {
    val driverParams = mapOf(
            "portAllocation" to defaultParameters.portAllocation,
            "debugPortAllocation" to defaultParameters.debugPortAllocation,
            "systemProperties" to defaultParameters.systemProperties,
            "driverDirectory" to defaultParameters.driverDirectory.toAbsolutePath(),
            "useTestClock" to defaultParameters.useTestClock,
            "isDebug" to defaultParameters.isDebug,
            "startNodesInProcess" to defaultParameters.startNodesInProcess,
            "waitForAllNodesToFinish" to defaultParameters.waitForAllNodesToFinish,
            "extraCordappPackagesToScan" to emptyList<String>(),//@Suppress("DEPRECATION") defaultParameters.extraCordappPackagesToScan,
            "notarySpecs" to defaultParameters.notarySpecs,
            "jmxPolicy" to defaultParameters.jmxPolicy,
            "compatibilityZone" to null,
            "networkParameters" to defaultParameters.networkParameters,
            "notaryCustomOverrides" to defaultParameters.notaryCustomOverrides,
            "inMemoryDB" to defaultParameters.inMemoryDB,
            "cordappsForAllNodes" to defaultParameters.cordappsForAllNodes as Collection<TestCordappInternal>?,
            "djvmBootstrapSource" to defaultParameters.djvmBootstrapSource,
            "djvmCordaSource" to defaultParameters.djvmCordaSource,
            "environmentVariables" to defaultParameters.environmentVariables,
            "enableSNI" to true,
            "allowHibernateToManageAppSchema" to true,
            "premigrateH2Database" to true

    )
    return createDriver(DriverDSLImpl::class, driverParams)
}


/**
 * A reflection-based tmp fix for managing differences
 * between Corda 4.0 and 4.6, also servig as a workaround for
 * - https://github.com/corda/corda/issues/6826
 * - https://r3-cev.atlassian.net/browse/CORDA-4090
 */
fun <T: Any> createDriver(
        targetClass: KClass<T>,
        parameters: Map<String,Any?>,
        targetConstructor: KFunction<T> = targetClass.primaryConstructor!!
):T{
    val constructorParameters = targetConstructor.parameters.associateBy({it},{ parameters[it.name] })
    return targetConstructor.callBy(constructorParameters)
}

manosbatsis avatar Nov 30 '20 10:11 manosbatsis