Skip to content

Commit

Permalink
Update Splice from CCI (#236)
Browse files Browse the repository at this point in the history
Signed-off-by: DA Automation <[email protected]>
Co-authored-by: DA Automation <[email protected]>
  • Loading branch information
canton-network-da and DA Automation authored Feb 21, 2025
1 parent 8ee87af commit 893346e
Show file tree
Hide file tree
Showing 107 changed files with 555 additions and 213 deletions.
2 changes: 1 addition & 1 deletion LATEST_RELEASE
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.11
0.3.12
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.12
0.3.13
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,15 @@ object ConfigTransforms {
.focus(_.ledgerApi)
.modify(portTransform(bump, _))

private def portTransform(
bump: Int,
c: SvParticipantClientConfig,
): SvParticipantClientConfig =
c.focus(_.adminApi)
.modify(portTransform(bump, _))
.focus(_.ledgerApi)
.modify(portTransform(bump, _))

private def portTransform(bump: Int, c: SvSequencerConfig): SvSequencerConfig =
c.focus(_.adminApi)
.modify(portTransform(bump, _))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,8 @@ object SpliceConfig {
)
implicit val beneficiaryConfigReader: ConfigReader[BeneficiaryConfig] =
deriveReader[BeneficiaryConfig]
implicit val svParticipantClientConfigReader: ConfigReader[SvParticipantClientConfig] =
deriveReader[SvParticipantClientConfig]
implicit val svConfigReader: ConfigReader[SvAppBackendConfig] =
deriveReader[SvAppBackendConfig].emap { conf =>
def checkFoundDsoConfig(check: (SvAppBackendConfig, FoundDso) => Boolean) =
Expand Down Expand Up @@ -847,6 +849,8 @@ object SpliceConfig {
implicitly[ConfigWriter[String]].contramap(_.toString)
implicit val beneficiaryConfigWriter: ConfigWriter[BeneficiaryConfig] =
deriveWriter[BeneficiaryConfig]
implicit val svParticipantClientConfigWriter: ConfigWriter[SvParticipantClientConfig] =
deriveWriter[SvParticipantClientConfig]
implicit val svConfigWriter: ConfigWriter[SvAppBackendConfig] =
deriveWriter[SvAppBackendConfig]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.lfdecentralizedtrust.splice.integration.plugins.toxiproxy

import org.lfdecentralizedtrust.splice.config.{SpliceConfig, ParticipantClientConfig}
import org.lfdecentralizedtrust.splice.sv.config.SvParticipantClientConfig
import org.lfdecentralizedtrust.splice.environment.EnvironmentImpl
import org.lfdecentralizedtrust.splice.integration.tests.SpliceTests.SpliceTestConsoleEnvironment
import org.lfdecentralizedtrust.splice.scan.admin.api.client.BftScanConnection.BftScanClientConfig
Expand Down Expand Up @@ -35,20 +36,35 @@ case class UseToxiproxy(
proxies += (name -> proxy)
}

def addLedgerApiProxy(
instanceName: String,
participantClient: SvParticipantClientConfig,
extraPortBump: Int,
): SvParticipantClientConfig = {
val bump = portBump + extraPortBump
val lapiHost = participantClient.ledgerApi.clientConfig.address
val lapiPort = participantClient.ledgerApi.clientConfig.port
val upstream = s"${lapiHost}:${lapiPort}"
val listenPort = lapiPort + bump
addProxy(s"${instanceName}-ledger-api", s"localhost:${listenPort}", upstream)
participantClient.focus(_.ledgerApi.clientConfig).modify(c => c.copy(port = c.port + bump))
}

def addLedgerApiProxy(
instanceName: String,
participantClient: ParticipantClientConfig,
extraPortBump: Int,
): ParticipantClientConfig = {
val bump = portBump + extraPortBump
val lapiHost = participantClient.ledgerApi.clientConfig.address
val lapiPort = participantClient.ledgerApi.clientConfig.port
val upstream = s"${lapiHost}:${lapiPort}"
val listenPort = lapiPort + bump
addProxy(s"${instanceName}-ledger-api", s"localhost:${listenPort}", upstream)
participantClient.focus(_.ledgerApi.clientConfig).modify(c => c.copy(port = c.port + bump))
}

override def beforeEnvironmentCreated(config: SpliceConfig): SpliceConfig = {
def addLedgerApiProxy(
instanceName: String,
participantClient: ParticipantClientConfig,
extraPortBump: Int,
): ParticipantClientConfig = {
val bump = portBump + extraPortBump
val lapiHost = participantClient.ledgerApi.clientConfig.address
val lapiPort = participantClient.ledgerApi.clientConfig.port
val upstream = s"${lapiHost}:${lapiPort}"
val listenPort = lapiPort + bump
addProxy(s"${instanceName}-ledger-api", s"localhost:${listenPort}", upstream)
participantClient.focus(_.ledgerApi.clientConfig).modify(c => c.copy(port = c.port + bump))
}

def addScanAppHttpProxy(
instanceName: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.lfdecentralizedtrust.splice.integration.tests

import com.daml.nonempty.NonEmpty
import com.digitalasset.canton.DomainAlias
import com.digitalasset.canton.admin.api.client.data.PruningSchedule
import com.digitalasset.canton.config.CantonRequireTypes.InstanceName
import com.digitalasset.canton.config.PositiveDurationSeconds
Expand Down Expand Up @@ -195,6 +196,28 @@ class ManualStartIntegrationTest
}
}

clue("SV1 and SV2 have configured amplification on the participant sequencer connection") {
Seq(
participantAdminConnection("sv1", sv1Backend.config),
participantAdminConnection("sv2", sv2Backend.config),
).map { participantConnection =>
val sequencerConnections =
participantConnection
.lookupDomainConnectionConfig(DomainAlias.tryCreate("global"))
.futureValue
.value
.sequencerConnections
sequencerConnections.connections.size shouldBe 1
sequencerConnections.sequencerTrustThreshold shouldBe PositiveInt.tryCreate(1)
sequencerConnections.submissionRequestAmplification shouldBe SubmissionRequestAmplification(
PositiveInt.tryCreate(5),
NonNegativeFiniteDuration.ofSeconds(5),
)
// otherwise we get log warnings
participantConnection.close()
}
}

// A most basic check to see whether the network is functional
onboardWalletUser(aliceWalletClient, aliceValidatorBackend)
actAndCheck(
Expand Down
2 changes: 1 addition & 1 deletion apps/common/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"common-typeface-termina": "1.0.0",
"date-fns": "2.29.3",
"decimal.js-light": "2.5.1",
"dompurify": "3.1.6",
"dompurify": "3.2.4",
"grpc-web": "1.3.1",
"html-react-parser": "5.1.15",
"jose": "4.10.3",
Expand Down
31 changes: 29 additions & 2 deletions apps/common/frontend/src/contexts/LedgerApiContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,26 @@ import { Choice, ContractId, Template, TemplateOrInterface } from '@daml/types';

const ANS_LEDGER_NAME = 'ans-ledger';

interface JsonApiErrorResponse {
status: number;
statusText: string;
body: string;
}

export class JsonApiError extends Error {
status: number;
statusText: string;
body: string;

constructor({ status, body, statusText }: JsonApiErrorResponse) {
super(body);
this.name = 'JsonApiError';
this.status = status;
this.statusText = statusText;
this.body = body;
}
}

export abstract class PackageIdResolver {
protected getQualifiedName(templateId: string): string {
const parts = templateId.split(':');
Expand Down Expand Up @@ -81,6 +101,7 @@ export class LedgerApiClient {
);
return user.primaryParty!;
}

async exercise<T extends object, C, R, K>(
actAs: string[],
readAs: string[],
Expand Down Expand Up @@ -142,11 +163,17 @@ export class LedgerApiClient {
return r.json();
} else {
const body = await r.text();
throw new Error(`HTTP ${r.status} ${r.statusText}: ${body}`);
throw new JsonApiError({ status: r.status, body: body, statusText: r.statusText });
}
})
.catch(e => {
console.debug(`${describeChoice} failed: ${JSON.stringify(e)}`);
if (e instanceof JsonApiError) {
console.debug(
`${describeChoice} failed with status ${e.status}: ${e.statusText} and body: ${e.body}`
);
} else {
console.debug(`${describeChoice} failed: ${JSON.stringify(e)}`);
}
throw e;
});

Expand Down
1 change: 1 addition & 0 deletions apps/common/frontend/src/contexts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ export {
LedgerApiClientProvider,
useLedgerApiClient,
PackageIdResolver,
JsonApiError,
} from './LedgerApiContext';
export { ConfigProvider, useConfig } from './ConfigContext';
3 changes: 2 additions & 1 deletion apps/common/src/main/openapi/common-internal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -273,4 +273,5 @@ components:
type: integer
format: int64
description: |
When requesting the next page of results, pass this as URL query parameter `after`.
When requesting the next page of results, pass this as URL query parameter `after`.
If absent or `null`, there are no more pages.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
DROP INDEX scan_txlog_store_store_id_entry_type_idx; -- covered by the one below

CREATE INDEX scan_txlog_store_sid_et_ei ON scan_txlog_store(store_id, entry_type, event_id);
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,9 @@ import org.apache.pekko.actor.ActorSystem
import com.digitalasset.canton.config.ClientConfig
import com.digitalasset.canton.participant.config.{BaseParticipantConfig, RemoteParticipantConfig}

/** Configuration to connect the console to a participant running remotely.
*
* @param adminApi the configuration to connect the console to the remote admin api
* @param ledgerApi the configuration to connect the console to the remote ledger api
*/
case class ParticipantClientConfig(
adminApi: ClientConfig,
ledgerApi: LedgerApiClientConfig,
abstract class BaseParticipantClientConfig(
val adminApi: ClientConfig,
val ledgerApi: LedgerApiClientConfig,
) extends BaseParticipantConfig {
override def clientAdminApi: ClientConfig = adminApi
override def clientLedgerApi: ClientConfig = ledgerApi.clientConfig
Expand All @@ -27,3 +22,13 @@ case class ParticipantClientConfig(
def participantClientConfigWithAdminToken: RemoteParticipantConfig =
RemoteParticipantConfig(adminApi, ledgerApi.clientConfig, ledgerApi.authConfig.adminToken)
}

/** Configuration to connect the console to a participant running remotely.
*
* @param adminApi the configuration to connect the console to the remote admin api
* @param ledgerApi the configuration to connect the console to the remote ledger api
*/
case class ParticipantClientConfig(
override val adminApi: ClientConfig,
override val ledgerApi: LedgerApiClientConfig,
) extends BaseParticipantClientConfig(adminApi, ledgerApi)
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ abstract class SpliceBackendConfig extends LocalNodeConfig {
override val topology: TopologyConfig = TopologyConfig()

override val monitoring: NodeMonitoringConfig = NodeMonitoringConfig()
def participantClient: ParticipantClientConfig
def participantClient: BaseParticipantClientConfig
def automation: AutomationConfig
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@ import com.digitalasset.canton.tracing.{TraceContext, TracerProvider}
import io.grpc.Status
import io.opentelemetry.api.trace.Tracer

import scala.annotation.nowarn
import scala.concurrent.{ExecutionContextExecutor, Future}

/** Subclass of NodeBase that provides default initialization for most apps */
abstract class Node[State <: AutoCloseable & HasHealth](
abstract class Node[State <: AutoCloseable & HasHealth, PreInitializeState](
serviceUser: String,
participantClient: ParticipantClientConfig,
parameters: SharedSpliceAppParameters,
Expand Down Expand Up @@ -51,16 +50,15 @@ abstract class Node[State <: AutoCloseable & HasHealth](
// Code that is run after a ledger connection becomes available but before
// waiting for the primary party. This can be used for things like
// domain connections and allocation of the primary party.
@nowarn("cat=unused")
protected def preInitializeAfterLedgerConnection(
connection: BaseLedgerConnection,
ledgerClient: SpliceLedgerClient,
)(implicit tc: TraceContext): Future[Unit] =
Future.unit
)(implicit tc: TraceContext): Future[PreInitializeState]

def initialize(
ledgerClient: SpliceLedgerClient,
party: PartyId,
preInitializeState: PreInitializeState,
)(implicit tc: TraceContext): Future[State]

override protected def initializeNode(
Expand All @@ -73,7 +71,7 @@ abstract class Node[State <: AutoCloseable & HasHealth](
loggerFactory,
)
}
_ <- preInitializeAfterLedgerConnection(initConnection, ledgerClient)
preInitializeState <- preInitializeAfterLedgerConnection(initConnection, ledgerClient)
serviceParty <- appInitStep("Get primary party") {
retryProvider.getValueWithRetries[PartyId](
RetryFor.WaitingOnInitDependency,
Expand All @@ -92,6 +90,6 @@ abstract class Node[State <: AutoCloseable & HasHealth](
logger.info(s"Required packages: ${requiredPackageIds}")
initConnection.waitForPackages(requiredPackageIds)
}
state <- initialize(ledgerClient, serviceParty)
state <- initialize(ledgerClient, serviceParty, preInitializeState)
} yield state
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ import org.lfdecentralizedtrust.splice.auth.{
AuthTokenSourceNone,
}
import org.lfdecentralizedtrust.splice.automation.AutomationService
import org.lfdecentralizedtrust.splice.config.{ParticipantClientConfig, SharedSpliceAppParameters}
import org.lfdecentralizedtrust.splice.config.{
BaseParticipantClientConfig,
SharedSpliceAppParameters,
}
import org.lfdecentralizedtrust.splice.http.HttpClient
import org.lfdecentralizedtrust.splice.util.{
HasHealth,
Expand Down Expand Up @@ -66,7 +69,7 @@ import scala.util.control.NonFatal
/** A running instance of a canton node. See Node for the subclass that provides the default initialization for most apps. */
abstract class NodeBase[State <: AutoCloseable & HasHealth](
serviceUser: String,
participantClient: ParticipantClientConfig,
participantClient: BaseParticipantClientConfig,
parameters: SharedSpliceAppParameters,
loggerFactory: NamedLoggerFactory,
tracerProvider: TracerProvider,
Expand Down
14 changes: 9 additions & 5 deletions apps/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 893346e

Please sign in to comment.