diff --git a/integration/nwo/fabric/network/network_support.go b/integration/nwo/fabric/network/network_support.go index 80d4a266c..f59cd2f4b 100755 --- a/integration/nwo/fabric/network/network_support.go +++ b/integration/nwo/fabric/network/network_support.go @@ -27,6 +27,8 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fabric/fabricconfig" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fabric/topology" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fsc/node" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql" "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/onsi/gomega/gexec" @@ -1368,6 +1370,8 @@ const ( AdminPort api.PortName = "Admin" ) +const VaultPersistencePrefix = "fabric.vault" + // PeerPortNames returns the list of ports that need to be reserved for a Peer. func PeerPortNames() []api.PortName { return []api.PortName{ListenPort, ChaincodePort, EventsPort, ProfilePort, OperationsPort, P2PPort, WebPort} @@ -1611,13 +1615,14 @@ func (n *Network) GenerateCoreConfig(p *topology.Peer) { "OrdererAddress": func(o *topology.Orderer, portName api.PortName) string { return n.OrdererAddress(o, portName) }, "PeerAddress": func(o *topology.Peer, portName api.PortName) string { return n.PeerAddress(o, portName) }, "CACertsBundlePath": func() string { return n.CACertsBundlePath() }, - "FSCNodeVaultPath": func() string { return n.FSCNodeVaultDir(uniqueName) }, - "FSCNodeVaultPersistence": func() node.PersistenceOpts { return p.FSCNode.Options.GetPersistence("fabric.vault") }, - "FabricName": func() string { return n.topology.Name() }, - "DefaultNetwork": func() bool { return defaultNetwork }, - "Driver": func() string { return driver }, - "Chaincodes": func(channel string) []*topology.ChannelChaincode { return n.Chaincodes(channel) }, - "TLSEnabled": func() bool { return tlsEnabled }, + "VaultOpts": func() node.PersistenceOpts { + return n.PersistenceOpts(VaultPersistencePrefix, uniqueName, p.FSCNode.Options) + }, + "FabricName": func() string { return n.topology.Name() }, + "DefaultNetwork": func() bool { return defaultNetwork }, + "Driver": func() string { return driver }, + "Chaincodes": func(channel string) []*topology.ChannelChaincode { return n.Chaincodes(channel) }, + "TLSEnabled": func() bool { return tlsEnabled }, }).Parse(coreTemplate) Expect(err).NotTo(HaveOccurred()) @@ -1629,6 +1634,20 @@ func (n *Network) GenerateCoreConfig(p *topology.Peer) { } } +func (n *Network) PersistenceOpts(prefix string, uniqueName string, o *node.Options) node.PersistenceOpts { + if sqlOpts := o.GetPersistence(prefix); sqlOpts != nil { + return node.PersistenceOpts{ + Type: sql.SQLPersistence, + SQL: sqlOpts, + } + } else { + return node.PersistenceOpts{ + Type: badger.BadgerPersistence, + Badger: &node.BadgerOpts{Path: n.FSCNodeVaultDir(uniqueName)}, + } + } +} + func (n *Network) PeersByName(names []string) []*topology.Peer { var peers []*topology.Peer for _, p := range n.Peers { diff --git a/integration/nwo/fabric/topology.go b/integration/nwo/fabric/topology.go index adbcc1899..a3d09347b 100644 --- a/integration/nwo/fabric/topology.go +++ b/integration/nwo/fabric/topology.go @@ -8,6 +8,7 @@ package fabric import ( "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/common/context" + "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fabric/network" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fabric/opts" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fabric/topology" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fsc/node" @@ -182,17 +183,18 @@ func NewTopologyWithName(name string) *topology.Topology { } } -// WithPostgresVaultPersistence is a configuration with SQL vault persistence -func WithPostgresVaultPersistence(config postgres.DataSourceProvider) node.Option { +const VaultPersistencePrefix = network.VaultPersistencePrefix + +// WithPostgresPersistence is a configuration with SQL persistence +func WithPostgresPersistence(config postgres.DataSourceProvider, prefixes ...string) node.Option { return func(o *node.Options) error { if config != nil { - o.PutPersistence("fabric.vault", node.PersistenceOpts{ - Type: sql.SQLPersistence, - SQL: node.SQLOpts{ + for _, prefix := range prefixes { + o.PutSQLPersistence(prefix, node.SQLOpts{ DataSource: config.DataSource(), DriverType: sql.Postgres, - }, - }) + }) + } } return nil } diff --git a/integration/nwo/fabric/topology/core_template.go b/integration/nwo/fabric/topology/core_template.go index ac869b5d0..1777af928 100644 --- a/integration/nwo/fabric/topology/core_template.go +++ b/integration/nwo/fabric/topology/core_template.go @@ -316,18 +316,18 @@ fabric: {{- end }} vault: persistence: - # Persistence type can be \'badger\' (on disk) or \'memory\' - type: {{ FSCNodeVaultPersistence.Type }} + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ VaultOpts.Type }} opts: - {{- if eq FSCNodeVaultPersistence.Type "sql" }} - driver: {{ FSCNodeVaultPersistence.SQL.DriverType }} - dataSource: {{ FSCNodeVaultPersistence.SQL.DataSource }} - # {{- else if eq FSCNodeVaultPersistence.Type "orion" }} - # network: {{ FSCNodeVaultPersistence.Orion.Network }} - # database: {{ FSCNodeVaultPersistence.Orion.Database }} - # creator: {{ FSCNodeVaultPersistence.Orion.Creator }} + {{- if eq VaultOpts.Type "sql" }} + driver: {{ VaultOpts.SQL.DriverType }} + dataSource: {{ VaultOpts.SQL.DataSource }} + {{- else if eq VaultOpts.Type "badger" }} + path: {{ VaultOpts.Badger.Path }} + {{- else if eq VaultOpts.Type "memory" }} + # Memory has hard-coded opts {{- else }} - path: {{ FSCNodeVaultPath }} + # Unknown type {{ VaultOpts.Type }} {{- end }} txidstore: cache: diff --git a/integration/nwo/fsc/fsc.go b/integration/nwo/fsc/fsc.go index 3bfab7e41..5fed3fa4e 100755 --- a/integration/nwo/fsc/fsc.go +++ b/integration/nwo/fsc/fsc.go @@ -29,13 +29,13 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fsc/commands" node2 "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fsc/node" "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/monitoring/optl" - driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils" tracing2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/sdk/tracing" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/client/view" view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/client/view/cmd" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/client/web" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/crypto" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/grpc" "github.com/miracl/conflate" @@ -483,17 +483,36 @@ func (p *Platform) GenerateCoreConfig(peer *node2.Replica) { } t, err := template.New("peer").Funcs(template.FuncMap{ - "Replica": func() *node2.Replica { return peer }, - "Peer": func() *node2.Peer { return peer.Peer }, - "NetworkID": func() string { return p.NetworkID }, - "Topology": func() *Topology { return p.Topology }, - "Extensions": func() []string { return extensions }, - "ToLower": func(s string) string { return strings.ToLower(s) }, - "ReplaceAll": func(s, old, new string) string { return strings.Replace(s, old, new, -1) }, - "NodeKVSPath": func() string { return p.NodeKVSDir(peer) }, - "NodeKVSPersistence": func() node2.PersistenceOpts { return peer.Options.GetPersistence("fsc") }, - "Resolvers": func() []*Resolver { return resolvers }, - "WebEnabled": func() bool { return p.Topology.WebEnabled }, + "Replica": func() *node2.Replica { return peer }, + "Peer": func() *node2.Peer { return peer.Peer }, + "NetworkID": func() string { return p.NetworkID }, + "Topology": func() *Topology { return p.Topology }, + "Extensions": func() []string { return extensions }, + "ToLower": func(s string) string { return strings.ToLower(s) }, + "ReplaceAll": func(s, old, new string) string { return strings.Replace(s, old, new, -1) }, + "KVSOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(KvsPersistencePrefix, peer.UniqueName, peer.Options, "kvs") + }, + "BindingOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(BindingPersistencePrefix, peer.UniqueName, peer.Options, "binding") + }, + "SignerInfoOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(SignerInfoPersistencePrefix, peer.UniqueName, peer.Options, "signer") + }, + "AuditInfoOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(AuditInfoPersistencePrefix, peer.UniqueName, peer.Options, "audit") + }, + "EndorseTxOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(EndorseTxPersistencePrefix, peer.UniqueName, peer.Options, "etx") + }, + "EnvelopeOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(EnvelopePersistencePrefix, peer.UniqueName, peer.Options, "env") + }, + "MetadataOpts": func() node2.PersistenceOpts { + return p.PersistenceOpts(MetadataPersistencePrefix, peer.UniqueName, peer.Options, "metadata") + }, + "Resolvers": func() []*Resolver { return resolvers }, + "WebEnabled": func() bool { return p.Topology.WebEnabled }, "TracingEndpoint": func() string { return utils.DefaultString(p.Topology.Monitoring.TracingEndpoint, fmt.Sprintf("0.0.0.0:%d", optl.JaegerCollectorPort)) }, @@ -502,6 +521,21 @@ func (p *Platform) GenerateCoreConfig(peer *node2.Replica) { Parse(p.Topology.Templates.CoreTemplate()) Expect(err).NotTo(HaveOccurred()) Expect(t.Execute(io.MultiWriter(core), p)).NotTo(HaveOccurred()) + +} + +func (p *Platform) PersistenceOpts(prefix string, uniqueName string, o *node2.Options, dirName string) node2.PersistenceOpts { + if sqlOpts := o.GetPersistence(prefix); sqlOpts != nil { + return node2.PersistenceOpts{ + Type: sql.SQLPersistence, + SQL: sqlOpts, + } + } else { + return node2.PersistenceOpts{ + Type: badger.BadgerPersistence, + Badger: &node2.BadgerOpts{Path: p.NodeStorageDir(uniqueName, dirName)}, + } + } } func (p *Platform) BootstrapViewNodeGroupRunner() ifrit.Runner { @@ -589,9 +623,8 @@ func (p *Platform) GenerateCmd(output io.Writer, node *node2.Replica) string { } t, err := template.New("node").Funcs(template.FuncMap{ - "Alias": func(s string) string { return node.Node.Alias(s) }, - "InstallView": func() bool { return len(node.Node.Responders) != 0 || len(node.Node.Factories) != 0 }, - "InstallPostgres": func() bool { return GetPersistenceType(node.Peer) == sql.SQLPersistence }, + "Alias": func(s string) string { return node.Node.Alias(s) }, + "InstallView": func() bool { return len(node.Node.Responders) != 0 || len(node.Node.Factories) != 0 }, }).Parse(p.Topology.Templates.NodeTemplate()) Expect(err).NotTo(HaveOccurred()) @@ -611,8 +644,8 @@ func (p *Platform) NodeClientConfigPath(peer *node2.Replica) string { return filepath.Join(p.Context.RootDir(), "fsc", "nodes", peer.UniqueName, "client-config.yaml") } -func (p *Platform) NodeKVSDir(peer *node2.Replica) string { - return filepath.Join(p.Context.RootDir(), "fsc", "nodes", peer.UniqueName, "kvs") +func (p *Platform) NodeStorageDir(uniqueName string, dirName string) string { + return filepath.Join(p.Context.RootDir(), "fsc", "nodes", uniqueName, dirName) } func (p *Platform) NodeConfigPath(peer *node2.Replica) string { @@ -873,14 +906,6 @@ func (p *Platform) nextColor() string { return fmt.Sprintf("%dm", color) } -func GetPersistenceType(peer *node2.Peer) driver2.PersistenceType { - return peer.Options.GetPersistence("fsc").Type -} - -func GetPersistenceDataSource(peer *node2.Peer) string { - return peer.Options.GetPersistence("fsc").SQL.DataSource -} - // PeerPortNames returns the list of ports that need to be reserved for a Peer. func PeerPortNames() []api.PortName { return []api.PortName{ListenPort, P2PPort, WebPort} diff --git a/integration/nwo/fsc/node/core_template.go b/integration/nwo/fsc/node/core_template.go index ddc10a426..074d15d7a 100755 --- a/integration/nwo/fsc/node/core_template.go +++ b/integration/nwo/fsc/node/core_template.go @@ -87,24 +87,154 @@ fsc: # The Key-Value Store is used to store various information related to the FSC node kvs: persistence: - # Persistence type can be \'badger\' (on disk) or \'memory\' - type: {{ NodeKVSPersistence.Type }} + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ KVSOpts.Type }} opts: - {{- if eq NodeKVSPersistence.Type "sql" }} - driver: {{ NodeKVSPersistence.SQL.DriverType }} - dataSource: {{ NodeKVSPersistence.SQL.DataSource }} - createSchema: {{ NodeKVSPersistence.SQL.CreateSchema }} - tablePrefix: {{ NodeKVSPersistence.SQL.TablePrefix }} - maxOpenConns: {{ NodeKVSPersistence.SQL.MaxOpenConns }} + {{- if eq KVSOpts.Type "sql" }} + driver: {{ KVSOpts.SQL.DriverType }} + dataSource: {{ KVSOpts.SQL.DataSource }} + createSchema: {{ KVSOpts.SQL.CreateSchema }} + tablePrefix: {{ KVSOpts.SQL.TablePrefix }} + maxOpenConns: {{ KVSOpts.SQL.MaxOpenConns }} maxIdleConns: 3 maxIdleTime: 45s - {{- else }} - path: {{ NodeKVSPath }} + {{- else if eq KVSOpts.Type "badger" }} + path: {{ KVSOpts.Badger.Path }} SyncWrites: false + {{- else if eq KVSOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ KVSOpts.Type }} {{- end }} cache: # Sets the maximum number of cached items size: 200 + binding: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ BindingOpts.Type }} + opts: + {{- if eq BindingOpts.Type "sql" }} + driver: {{ BindingOpts.SQL.DriverType }} + dataSource: {{ BindingOpts.SQL.DataSource }} + createSchema: {{ BindingOpts.SQL.CreateSchema }} + tablePrefix: {{ BindingOpts.SQL.TablePrefix }} + maxOpenConns: {{ BindingOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq BindingOpts.Type "badger" }} + path: {{ BindingOpts.Badger.Path }} + SyncWrites: false + {{- else if eq BindingOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ BindingOpts.Type }} + {{- end }} + signerinfo: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ SignerInfoOpts.Type }} + opts: + {{- if eq SignerInfoOpts.Type "sql" }} + driver: {{ SignerInfoOpts.SQL.DriverType }} + dataSource: {{ SignerInfoOpts.SQL.DataSource }} + createSchema: {{ SignerInfoOpts.SQL.CreateSchema }} + tablePrefix: {{ SignerInfoOpts.SQL.TablePrefix }} + maxOpenConns: {{ SignerInfoOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq SignerInfoOpts.Type "badger" }} + path: {{ SignerInfoOpts.Badger.Path }} + SyncWrites: false + {{- else if eq SignerInfoOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ SignerInfoOpts.Type }} + {{- end }} + auditinfo: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ AuditInfoOpts.Type }} + opts: + {{- if eq AuditInfoOpts.Type "sql" }} + driver: {{ AuditInfoOpts.SQL.DriverType }} + dataSource: {{ AuditInfoOpts.SQL.DataSource }} + createSchema: {{ AuditInfoOpts.SQL.CreateSchema }} + tablePrefix: {{ AuditInfoOpts.SQL.TablePrefix }} + maxOpenConns: {{ AuditInfoOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq AuditInfoOpts.Type "badger" }} + path: {{ AuditInfoOpts.Badger.Path }} + SyncWrites: false + {{- else if eq AuditInfoOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ AuditInfoOpts.Type }} + {{- end }} + endorsetx: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ EndorseTxOpts.Type }} + opts: + {{- if eq EndorseTxOpts.Type "sql" }} + driver: {{ EndorseTxOpts.SQL.DriverType }} + dataSource: {{ EndorseTxOpts.SQL.DataSource }} + createSchema: {{ EndorseTxOpts.SQL.CreateSchema }} + tablePrefix: {{ EndorseTxOpts.SQL.TablePrefix }} + maxOpenConns: {{ EndorseTxOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq EndorseTxOpts.Type "badger" }} + path: {{ EndorseTxOpts.Badger.Path }} + SyncWrites: false + {{- else if eq EndorseTxOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ EndorseTxOpts.Type }} + {{- end }} + envelope: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ EnvelopeOpts.Type }} + opts: + {{- if eq EnvelopeOpts.Type "sql" }} + driver: {{ EnvelopeOpts.SQL.DriverType }} + dataSource: {{ EnvelopeOpts.SQL.DataSource }} + createSchema: {{ EnvelopeOpts.SQL.CreateSchema }} + tablePrefix: {{ EnvelopeOpts.SQL.TablePrefix }} + maxOpenConns: {{ EnvelopeOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq EnvelopeOpts.Type "badger" }} + path: {{ EnvelopeOpts.Badger.Path }} + SyncWrites: false + {{- else if eq EnvelopeOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ EnvelopeOpts.Type }} + {{- end }} + metadata: + persistence: + # Persistence type can be \'badger\' (on disk), \'memory\' or \'sql\' + type: {{ MetadataOpts.Type }} + opts: + {{- if eq MetadataOpts.Type "sql" }} + driver: {{ MetadataOpts.SQL.DriverType }} + dataSource: {{ MetadataOpts.SQL.DataSource }} + createSchema: {{ MetadataOpts.SQL.CreateSchema }} + tablePrefix: {{ MetadataOpts.SQL.TablePrefix }} + maxOpenConns: {{ MetadataOpts.SQL.MaxOpenConns }} + maxIdleConns: 3 + maxIdleTime: 45s + {{- else if eq MetadataOpts.Type "badger" }} + path: {{ MetadataOpts.Badger.Path }} + SyncWrites: false + {{- else if eq MetadataOpts.Type "memory" }} + # Memory has hard-coded opts + {{- else }} + # Unknown type {{ MetadataOpts.Type }} + {{- end }} # HTML Server configuration for REST calls web: enabled: {{ WebEnabled }} diff --git a/integration/nwo/fsc/node/node.go b/integration/nwo/fsc/node/node.go index a3a094174..72939fd17 100644 --- a/integration/nwo/fsc/node/node.go +++ b/integration/nwo/fsc/node/node.go @@ -16,7 +16,6 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils" - "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql/common" . "github.com/onsi/gomega" @@ -68,56 +67,35 @@ type SQLOpts struct { MaxOpenConns int } -//type OrionOpts struct { -// Network string -// Database string -// Creator string -//} +type BadgerOpts struct { + Path string +} type PersistenceOpts struct { - Type driver.PersistenceType - SQL SQLOpts - //Orion OrionOpts -} - -func (o *Options) PutPersistence(k string, p PersistenceOpts) { - if p.Type == sql.SQLPersistence { - o.Put(k+".persistence.sql", p.SQL.DataSource) - o.Put(k+".persistence.driver", p.SQL.DriverType) - o.Put(k+"persistence.createSchema", p.SQL.CreateSchema) - o.Put(k+"persistence.tablePrefix", p.SQL.TablePrefix) - o.Put(k+"persistence.maxOpenConns", p.SQL.MaxOpenConns) - //} else if p.Type == "orion" { - // o.Put(k+".persistence.orion", p.Orion.Network) - // o.Put(k+".persistence.orion.database", p.Orion.Database) - // o.Put(k+".persistence.orion.creator", p.Orion.Creator) - } + Type driver.PersistenceType + SQL *SQLOpts + Badger *BadgerOpts } -func (o *Options) GetPersistence(k string) PersistenceOpts { - //if v := o.Get(k + ".persistence.orion"); v != nil { - // return PersistenceOpts{ - // Type: "orion", - // Orion: OrionOpts{ - // Network: v.(string), - // Database: o.Get(k + ".persistence.orion.database").(string), - // Creator: o.Get(k + ".persistence.orion.creator").(string), - // }, - // } - //} +func (o *Options) PutSQLPersistence(k string, p SQLOpts) { + o.Put(k+".persistence.sql", p.DataSource) + o.Put(k+".persistence.driver", p.DriverType) + o.Put(k+"persistence.createSchema", p.CreateSchema) + o.Put(k+"persistence.tablePrefix", p.TablePrefix) + o.Put(k+"persistence.maxOpenConns", p.MaxOpenConns) +} + +func (o *Options) GetPersistence(k string) *SQLOpts { if v := o.Get(k + ".persistence.sql"); v != nil { - return PersistenceOpts{ - Type: sql.SQLPersistence, - SQL: SQLOpts{ - DataSource: v.(string), - DriverType: common.SQLDriverType(utils.DefaultString(o.Get(k+".persistence.driver"), string(sql.Postgres))), - CreateSchema: utils.DefaultZero[bool](o.Get(k + ".persistence.createSchema")), - TablePrefix: utils.DefaultZero[string](o.Get(k + ".persistence.tablePrefix")), - MaxOpenConns: utils.DefaultInt(o.Get(k+".persistence.maxOpenConns"), 200), - }, + return &SQLOpts{ + DataSource: v.(string), + DriverType: common.SQLDriverType(utils.DefaultString(o.Get(k+".persistence.driver"), string(sql.Postgres))), + CreateSchema: utils.DefaultZero[bool](o.Get(k + ".persistence.createSchema")), + TablePrefix: utils.DefaultZero[string](o.Get(k + ".persistence.tablePrefix")), + MaxOpenConns: utils.DefaultInt(o.Get(k+".persistence.maxOpenConns"), 200), } } - return PersistenceOpts{Type: badger.BadgerPersistence} + return nil } func (o *Options) ReplicationFactor() int { diff --git a/integration/nwo/fsc/options.go b/integration/nwo/fsc/options.go index a77a55874..395efdb28 100644 --- a/integration/nwo/fsc/options.go +++ b/integration/nwo/fsc/options.go @@ -6,24 +6,12 @@ SPDX-License-Identifier: Apache-2.0 package fsc -import ( - "github.com/hyperledger-labs/fabric-smart-client/integration/nwo/fsc/node" - "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql" - "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql/postgres" +const ( + KvsPersistencePrefix = "fsc.kvs" + AuditInfoPersistencePrefix = "fsc.auditinfo" + SignerInfoPersistencePrefix = "fsc.signerinfo" + BindingPersistencePrefix = "fsc.binding" + EndorseTxPersistencePrefix = "fsc.endorsetx" + MetadataPersistencePrefix = "fsc.metadata" + EnvelopePersistencePrefix = "fsc.envelope" ) - -// WithPostgresPersistence is a configuration with SQL vault persistence -func WithPostgresPersistence(config postgres.DataSourceProvider) node.Option { - return func(o *node.Options) error { - if config != nil { - o.PutPersistence("fsc", node.PersistenceOpts{ - Type: sql.SQLPersistence, - SQL: node.SQLOpts{ - DataSource: config.DataSource(), - DriverType: sql.Postgres, - }, - }) - } - return nil - } -} diff --git a/integration/utils.go b/integration/utils.go index 20eadc49e..5c765458d 100644 --- a/integration/utils.go +++ b/integration/utils.go @@ -30,7 +30,16 @@ func (o *ReplicationOptions) For(name string) []node.Option { opts = append(opts, fsc.WithReplicationFactor(f)) } if sqlConfig, ok := o.SQLConfigs[name]; ok { - opts = append(opts, fsc.WithPostgresPersistence(sqlConfig), fabric.WithPostgresVaultPersistence(sqlConfig)) + opts = append(opts, fabric.WithPostgresPersistence(sqlConfig, + fsc.KvsPersistencePrefix, + fsc.BindingPersistencePrefix, + fsc.AuditInfoPersistencePrefix, + fsc.SignerInfoPersistencePrefix, + fsc.EndorseTxPersistencePrefix, + fsc.EnvelopePersistencePrefix, + fsc.MetadataPersistencePrefix, + fabric.VaultPersistencePrefix, + )) } return opts } diff --git a/platform/fabric/sdk/dig/generic/providers.go b/platform/fabric/sdk/dig/generic/providers.go index 8f6cc0f85..c7637bd65 100644 --- a/platform/fabric/sdk/dig/generic/providers.go +++ b/platform/fabric/sdk/dig/generic/providers.go @@ -10,7 +10,6 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors" committer2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/core/generic/committer" driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" - "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils" digutils "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/dig" "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core" "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic" @@ -28,7 +27,6 @@ import ( vdriver "github.com/hyperledger-labs/fabric-smart-client/platform/view/driver" sdk "github.com/hyperledger-labs/fabric-smart-client/platform/view/sdk/dig" dbdriver "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" - mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" @@ -187,8 +185,8 @@ func NewEndorseTxStore(in struct { Config vdriver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver.EndorseTxStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.endorsetx.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.endorsetx.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedEndorseTxStore(in.KVS), nil } for _, d := range in.Drivers { @@ -205,8 +203,8 @@ func NewMetadataStore(in struct { Config vdriver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver.MetadataStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.metadata.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.metadata.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedMetadataStore(in.KVS), nil } for _, d := range in.Drivers { @@ -223,8 +221,8 @@ func NewEnvelopeStore(in struct { Config vdriver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver.EnvelopeStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.envelope.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.envelope.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedEnvelopeStore(in.KVS), nil } for _, d := range in.Drivers { diff --git a/platform/orion/sdk/dig/providers.go b/platform/orion/sdk/dig/providers.go index 58926d355..53498f36c 100644 --- a/platform/orion/sdk/dig/providers.go +++ b/platform/orion/sdk/dig/providers.go @@ -8,13 +8,11 @@ package orion import ( driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" - "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils" driver3 "github.com/hyperledger-labs/fabric-smart-client/platform/orion/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/orion/services" "github.com/hyperledger-labs/fabric-smart-client/platform/view/driver" sdk "github.com/hyperledger-labs/fabric-smart-client/platform/view/sdk/dig" dbdriver "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" - mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" "github.com/pkg/errors" "go.uber.org/dig" @@ -26,8 +24,8 @@ func NewEndorseTxStore(in struct { Config driver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver3.EndorseTxStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.endorsetx.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.endorsetx.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedEndorseTxStore(in.KVS), nil } for _, d := range in.Drivers { @@ -44,8 +42,8 @@ func NewMetadataStore(in struct { Config driver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver3.MetadataStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.metadata.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.metadata.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedMetadataStore(in.KVS), nil } for _, d := range in.Drivers { @@ -62,8 +60,8 @@ func NewEnvelopeStore(in struct { Config driver.ConfigService Drivers []dbdriver.NamedDriver `group:"db-drivers"` }) (driver3.EnvelopeStore, error) { - driverName := driver2.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.envelope.persistence.type"), string(mem.MemoryPersistence))) - if sdk.UnsupportedStores.Contains(driverName) { + driverName := driver2.PersistenceType(in.Config.GetString("fsc.envelope.persistence.type")) + if !sdk.SupportedStores.Contains(driverName) { return services.NewKVSBasedEnvelopeStore(in.KVS), nil } for _, d := range in.Drivers { diff --git a/platform/view/sdk/dig/providers.go b/platform/view/sdk/dig/providers.go index e674064f8..8bde1cd9d 100644 --- a/platform/view/sdk/dig/providers.go +++ b/platform/view/sdk/dig/providers.go @@ -12,8 +12,8 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/collections" "github.com/hyperledger-labs/fabric-smart-client/platform/view/driver" driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" - "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger" mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms" driver3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" @@ -38,7 +38,7 @@ func newKVS(in struct { return nil, errors.New("driver not found") } -var UnsupportedStores = collections.NewSet(badger.FilePersistence, badger.BadgerPersistence) +var SupportedStores = collections.NewSet(mem.MemoryPersistence, sql.SQLPersistence) func newBindingStore(in struct { dig.In @@ -46,8 +46,8 @@ func newBindingStore(in struct { Config driver.ConfigService Drivers []driver2.NamedDriver `group:"db-drivers"` }) (driver4.BindingStore, error) { - driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.binding.persistence.type"), string(mem.MemoryPersistence))) - if UnsupportedStores.Contains(driverName) { + driverName := driver4.PersistenceType(in.Config.GetString("fsc.binding.persistence.type")) + if !SupportedStores.Contains(driverName) { return binding.NewKVSBased(in.KVS), nil } for _, d := range in.Drivers { @@ -64,8 +64,8 @@ func newSignerInfoStore(in struct { Config driver.ConfigService Drivers []driver2.NamedDriver `group:"db-drivers"` }) (driver4.SignerInfoStore, error) { - driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.signerinfo.persistence.type"), string(mem.MemoryPersistence))) - if UnsupportedStores.Contains(driverName) { + driverName := driver4.PersistenceType(in.Config.GetString("fsc.signerinfo.persistence.type")) + if !SupportedStores.Contains(driverName) { return signerinfo.NewKVSBased(in.KVS), nil } for _, d := range in.Drivers { @@ -82,8 +82,8 @@ func newAuditInfoStore(in struct { Config driver.ConfigService Drivers []driver2.NamedDriver `group:"db-drivers"` }) (driver4.AuditInfoStore, error) { - driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.auditinfo.persistence.type"), string(mem.MemoryPersistence))) - if UnsupportedStores.Contains(driverName) { + driverName := driver4.PersistenceType(in.Config.GetString("fsc.auditinfo.persistence.type")) + if !SupportedStores.Contains(driverName) { return auditinfo.NewKVSBased(in.KVS), nil } for _, d := range in.Drivers { diff --git a/platform/view/services/db/driver/sql/common/signerinfo.go b/platform/view/services/db/driver/sql/common/signerinfo.go index 70e9ce5f1..1f2cb7253 100644 --- a/platform/view/services/db/driver/sql/common/signerinfo.go +++ b/platform/view/services/db/driver/sql/common/signerinfo.go @@ -43,7 +43,7 @@ func (db *SignerInfoPersistence) FilterExistingSigners(ids ...view.Identity) ([] } where, params := Where(db.ci.InStrings("id", idHashes)) query := fmt.Sprintf("SELECT id FROM %s %s", db.table, where) - logger.Debug(query, params) + logger.Info(query, params) rows, err := db.readDB.Query(query, params...) if err != nil { @@ -58,13 +58,13 @@ func (db *SignerInfoPersistence) FilterExistingSigners(ids ...view.Identity) ([] } existingSigners = append(existingSigners, inverseMap[idHash]) } - logger.Debugf("Found %d out of %d signers", len(existingSigners), len(ids)) + logger.Infof("Found %d out of %d signers", len(existingSigners), len(ids)) return existingSigners, nil } func (db *SignerInfoPersistence) PutSigner(id view.Identity) error { query := fmt.Sprintf("INSERT INTO %s (id) VALUES ($1)", db.table) - logger.Debugf(query, id) + logger.Info(query, id) _, err := db.writeDB.Exec(query, id.UniqueID()) if err != nil && errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) { logger.Warnf("Signer [%s] already in db. Skipping...", id) @@ -73,7 +73,7 @@ func (db *SignerInfoPersistence) PutSigner(id view.Identity) error { if err != nil { return errors.Wrapf(err, "failed executing query [%s]", query) } - logger.Debugf("Signer [%s] registered", id) + logger.Infof("Signer [%s] registered", id) return nil } diff --git a/platform/view/services/storage/auditinfo/standalone.go b/platform/view/services/storage/auditinfo/standalone.go index 6245eec67..af4507922 100644 --- a/platform/view/services/storage/auditinfo/standalone.go +++ b/platform/view/services/storage/auditinfo/standalone.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package auditinfo import ( + "fmt" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" ) @@ -16,5 +18,5 @@ const ( ) func NewWithConfig(dbDriver driver.Driver, namespace string, cp db.Config) (driver.AuditInfoPersistence, error) { - return dbDriver.NewAuditInfo(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + return dbDriver.NewAuditInfo(fmt.Sprintf("%s_audit", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) } diff --git a/platform/view/services/storage/binding/kvsbased.go b/platform/view/services/storage/binding/kvsbased.go index 4dc65f532..d8083312e 100644 --- a/platform/view/services/storage/binding/kvsbased.go +++ b/platform/view/services/storage/binding/kvsbased.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package binding import ( + errors2 "errors" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" "github.com/pkg/errors" @@ -34,23 +36,24 @@ func (kvs *kvsBased) HaveSameBinding(this, that view.Identity) (bool, error) { func (kvs *kvsBased) GetLongTerm(ephemeral view.Identity) (view.Identity, error) { return kvs.e.Get(ephemeral) } + func (kvs *kvsBased) PutBinding(ephemeral, longTerm view.Identity) error { if ephemeral.IsNone() || longTerm.IsNone() { return errors.New("empty ids passed") } // Make sure the long term is passed, so that the hierarchy is flat and all ephemerals point to the long term - longTerm, err := kvs.e.Get(longTerm) + lt, err := kvs.e.Get(longTerm) if err != nil { return errors.Wrapf(err, "no long term found for [%s]. if long term was passed, it has to be registered first.", longTerm) } - if longTerm != nil { - return kvs.e.Put(ephemeral, longTerm) + if lt != nil { + return kvs.e.Put(ephemeral, lt) } - if err := kvs.e.Put(longTerm, longTerm); err != nil { - return errors.Wrapf(err, "failed to register [%s] as long term", longTerm) - } - return kvs.e.Put(ephemeral, longTerm) + return errors2.Join( + kvs.e.Put(longTerm, longTerm), + kvs.e.Put(ephemeral, longTerm), + ) } func bindingKey(ephemeral view.Identity) (string, error) { diff --git a/platform/view/services/storage/binding/standalone.go b/platform/view/services/storage/binding/standalone.go index 5944a0344..8a7028830 100644 --- a/platform/view/services/storage/binding/standalone.go +++ b/platform/view/services/storage/binding/standalone.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package binding import ( + "fmt" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" ) @@ -16,5 +18,5 @@ const ( ) func NewWithConfig(dbDriver driver.Driver, namespace string, cp db.Config) (driver.BindingPersistence, error) { - return dbDriver.NewBinding(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + return dbDriver.NewBinding(fmt.Sprintf("%s_bind", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) } diff --git a/platform/view/services/storage/endorsetx/standalone.go b/platform/view/services/storage/endorsetx/standalone.go index bfd3e41d3..b0a9ed797 100644 --- a/platform/view/services/storage/endorsetx/standalone.go +++ b/platform/view/services/storage/endorsetx/standalone.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package endorsetx import ( + "fmt" + driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" @@ -21,7 +23,7 @@ type identifier interface { } func NewWithConfig[K identifier](dbDriver driver.Driver, namespace string, cp db.Config) (driver2.EndorseTxStore[K], error) { - e, err := dbDriver.NewEndorseTx(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + e, err := dbDriver.NewEndorseTx(fmt.Sprintf("%s_etx", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) if err != nil { return nil, err } diff --git a/platform/view/services/storage/envelope/standalone.go b/platform/view/services/storage/envelope/standalone.go index 52433c4a9..cfb221fad 100644 --- a/platform/view/services/storage/envelope/standalone.go +++ b/platform/view/services/storage/envelope/standalone.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package envelope import ( + "fmt" + driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" @@ -21,7 +23,7 @@ type identifier interface { } func NewWithConfig[K identifier](dbDriver driver.Driver, namespace string, cp db.Config) (driver2.EnvelopeStore[K], error) { - e, err := dbDriver.NewEnvelope(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + e, err := dbDriver.NewEnvelope(fmt.Sprintf("%s_env", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) if err != nil { return nil, err } diff --git a/platform/view/services/storage/metadata/standalone.go b/platform/view/services/storage/metadata/standalone.go index 039d433b6..aae508ae1 100644 --- a/platform/view/services/storage/metadata/standalone.go +++ b/platform/view/services/storage/metadata/standalone.go @@ -8,6 +8,7 @@ package metadata import ( "encoding/json" + "fmt" driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" @@ -23,7 +24,7 @@ type identifier interface { } func NewWithConfig[K identifier, M any](dbDriver driver.Driver, namespace string, cp db.Config) (driver2.MetadataStore[K, M], error) { - m, err := dbDriver.NewMetadata(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + m, err := dbDriver.NewMetadata(fmt.Sprintf("%s_meta", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) if err != nil { return nil, err } diff --git a/platform/view/services/storage/signerinfo/standalone.go b/platform/view/services/storage/signerinfo/standalone.go index de0132ad2..4f57fbceb 100644 --- a/platform/view/services/storage/signerinfo/standalone.go +++ b/platform/view/services/storage/signerinfo/standalone.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package signerinfo import ( + "fmt" + "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver" ) @@ -16,5 +18,5 @@ const ( ) func NewWithConfig(dbDriver driver.Driver, namespace string, cp db.Config) (driver.SignerInfoPersistence, error) { - return dbDriver.NewSignerInfo(namespace, db.NewPrefixConfig(cp, persistenceOptsConfigKey)) + return dbDriver.NewSignerInfo(fmt.Sprintf("%s_signer", namespace), db.NewPrefixConfig(cp, persistenceOptsConfigKey)) }