diff --git a/pkg/client/channel/chclient_test.go b/pkg/client/channel/chclient_test.go index f7b16dde34..49c16ef97f 100644 --- a/pkg/client/channel/chclient_test.go +++ b/pkg/client/channel/chclient_test.go @@ -355,9 +355,7 @@ func TestOrdererStatusError(t *testing.T) { chClient := setupChannelClientWithNodes(peers, orderers, t) chClient.eventHub = fcmocks.NewMockEventHub() - mockOrderer, ok := testOrderer1.(fcmocks.MockOrderer) - assert.True(t, ok, "Expected object to be mock orderer") - mockOrderer.EnqueueSendBroadcastError(status.New(status.OrdererClientStatus, + testOrderer1.EnqueueSendBroadcastError(status.New(status.OrdererClientStatus, status.ConnectionFailed.ToInt32(), testErrorMessage, nil)) _, err := chClient.Execute(Request{ChaincodeID: "test", Fcn: "invoke", diff --git a/pkg/client/common/selection/dynamicselection/dynamicselection.go b/pkg/client/common/selection/dynamicselection/dynamicselection.go index 892bc04256..c4d6fe0d91 100644 --- a/pkg/client/common/selection/dynamicselection/dynamicselection.go +++ b/pkg/client/common/selection/dynamicselection/dynamicselection.go @@ -10,7 +10,7 @@ import ( "fmt" "sync" - "github.com/hyperledger/fabric-sdk-go/pkg/context" + contextAPI "github.com/hyperledger/fabric-sdk-go/pkg/common/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/pkg/errors" @@ -53,7 +53,7 @@ type selectionService struct { } // Initialize allow for initializing providers -func (p *SelectionProvider) Initialize(providers *context.Provider) error { +func (p *SelectionProvider) Initialize(providers contextAPI.Providers) error { p.providers = providers return nil } diff --git a/pkg/client/resmgmt/resmgmt_test.go b/pkg/client/resmgmt/resmgmt_test.go index 982d12b423..82a4a3fb4c 100644 --- a/pkg/client/resmgmt/resmgmt_test.go +++ b/pkg/client/resmgmt/resmgmt_test.go @@ -64,7 +64,7 @@ func TestJoinChannel(t *testing.T) { // Create mock orderer with simple mock block orderer := fcmocks.NewMockOrderer("", nil) - orderer.(fcmocks.MockOrderer).EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock()) + orderer.EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock()) rc := setupResMgmtClient(ctx, nil, t) // Setup target peers @@ -95,7 +95,7 @@ func TestJoinChannelWithFilter(t *testing.T) { // Create mock orderer with simple mock block orderer := fcmocks.NewMockOrderer("", nil) - orderer.(fcmocks.MockOrderer).EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock()) + orderer.EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock()) //the target filter ( client option) will be set rc := setupResMgmtClient(ctx, nil, t) @@ -263,7 +263,8 @@ func TestJoinChannelNoOrdererConfig(t *testing.T) { t.Fatal(err) } ctx.SetConfig(invalidOrdererConfig) - customFabProvider := fabpvdr.New(ctx) + customFabProvider := fabpvdr.New(ctx.Config()) + customFabProvider.Initialize(ctx) ctx.SetCustomInfraProvider(customFabProvider) rc = setupResMgmtClient(ctx, nil, t) diff --git a/pkg/context/api/fab/provider.go b/pkg/context/api/fab/provider.go index 3d4a02919e..b22a9c5797 100644 --- a/pkg/context/api/fab/provider.go +++ b/pkg/context/api/fab/provider.go @@ -7,10 +7,13 @@ SPDX-License-Identifier: Apache-2.0 package fab import ( + reqContext "context" + "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" + "google.golang.org/grpc" ) -// InfraProvider enables access to fabric objects such as peer and user based on config or +// InfraProvider enables access to fabric objects such as peer based on config type InfraProvider interface { CreateChannelLedger(ic IdentityContext, name string) (ChannelLedger, error) CreateChannelConfig(user IdentityContext, name string) (ChannelConfig, error) @@ -19,6 +22,7 @@ type InfraProvider interface { CreateEventHub(ic IdentityContext, name string) (EventHub, error) CreatePeerFromConfig(peerCfg *core.NetworkPeer) (Peer, error) CreateOrdererFromConfig(cfg *core.OrdererConfig) (Orderer, error) + CommManager() CommManager Close() } @@ -50,6 +54,12 @@ type TargetFilter interface { Accept(peer Peer) bool } +// CommManager enables network communication. +type CommManager interface { + DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (*grpc.ClientConn, error) + ReleaseConn(conn *grpc.ClientConn) +} + // Providers represents the SDK configured service providers context. type Providers interface { DiscoveryProvider() DiscoveryProvider diff --git a/pkg/context/context.go b/pkg/context/context.go index e56c739b36..13ebeabc38 100644 --- a/pkg/context/context.go +++ b/pkg/context/context.go @@ -7,12 +7,14 @@ SPDX-License-Identifier: Apache-2.0 package context import ( + reqContext "context" "strings" + "github.com/pkg/errors" + "github.com/hyperledger/fabric-sdk-go/pkg/common/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" - "github.com/pkg/errors" ) // Client supplies the configuration and signing identity to client objects. @@ -215,3 +217,19 @@ func NewChannel(clientProvider context.ClientProvider, channelID string) (*Chann channelService: channelService, }, nil } + +type reqContextKey string + +var reqContextCommManager = reqContextKey("commManager") + +// NewRequest creates a request-scoped context. +func NewRequest(client context.Client) reqContext.Context { + ctx := reqContext.WithValue(reqContext.Background(), reqContextCommManager, client.InfraProvider().CommManager()) + return ctx +} + +// RequestCommManager extracts the CommManager from the request-scoped context. +func RequestCommManager(ctx reqContext.Context) (fab.CommManager, bool) { + commManager, ok := ctx.Value(reqContextCommManager).(fab.CommManager) + return commManager, ok +} diff --git a/pkg/fab/mocks/mockfabricprovider.go b/pkg/fab/mocks/mockfabricprovider.go index 37b8ef4bc1..cf223c099f 100644 --- a/pkg/fab/mocks/mockfabricprovider.go +++ b/pkg/fab/mocks/mockfabricprovider.go @@ -69,10 +69,14 @@ func (f *MockInfraProvider) CreatePeerFromConfig(peerCfg *core.NetworkPeer) (fab // CreateOrdererFromConfig creates a default implementation of Orderer based on configuration. func (f *MockInfraProvider) CreateOrdererFromConfig(cfg *core.OrdererConfig) (fab.Orderer, error) { - return &mockOrderer{}, nil + return &MockOrderer{}, nil +} + +//CommManager returns comm provider +func (f *MockInfraProvider) CommManager() fab.CommManager { + return nil } //Close mock close function func (f *MockInfraProvider) Close() { - return } diff --git a/pkg/fab/mocks/mockorderer.go b/pkg/fab/mocks/mockorderer.go index 8f8b9dec8c..340e0cbcb6 100644 --- a/pkg/fab/mocks/mockorderer.go +++ b/pkg/fab/mocks/mockorderer.go @@ -18,14 +18,7 @@ import ( // Nothe that calling broadcast doesn't deliver anythng. This implies // that the broadcast side and the deliver side are totally // independent from the mocking point of view. -type MockOrderer interface { - fab.Orderer - // Enqueues a mock error to be returned to the client calling SendBroadcast - EnqueueSendBroadcastError(err error) - // Enqueues a mock value (block or error) for delivery - EnqueueForSendDeliver(value interface{}) -} -type mockOrderer struct { +type MockOrderer struct { OrdererURL string BroadcastListener chan *fab.SignedEnvelope BroadcastErrors chan error @@ -37,8 +30,8 @@ type mockOrderer struct { } // NewMockOrderer ... -func NewMockOrderer(url string, broadcastListener chan *fab.SignedEnvelope) fab.Orderer { - o := &mockOrderer{ +func NewMockOrderer(url string, broadcastListener chan *fab.SignedEnvelope) *MockOrderer { + o := &MockOrderer{ OrdererURL: url, BroadcastListener: broadcastListener, BroadcastErrors: make(chan error, 100), @@ -48,22 +41,35 @@ func NewMockOrderer(url string, broadcastListener chan *fab.SignedEnvelope) fab. DeliveryQueue: make(chan interface{}, 100), } - go broadcast(o) + if broadcastListener != nil { + go broadcast(o) + } go delivery(o) return o } -func broadcast(o *mockOrderer) { +func broadcast(o *MockOrderer) { for { - value := <-o.BroadcastQueue + value, ok := <-o.BroadcastQueue + if !ok { + close(o.BroadcastListener) + return + } o.BroadcastListener <- value } } -func delivery(o *mockOrderer) { +func delivery(o *MockOrderer) { for { - value := <-o.DeliveryQueue + value, ok := <-o.DeliveryQueue + if !ok { + close(o.Deliveries) + return + } switch value.(type) { + case common.Status: + close(o.Deliveries) + return case *common.Block: o.Deliveries <- value.(*common.Block) case error: @@ -75,13 +81,13 @@ func delivery(o *mockOrderer) { } // URL returns the URL of the mock Orderer -func (o *mockOrderer) URL() string { +func (o *MockOrderer) URL() string { return o.OrdererURL } // SendBroadcast accepts client broadcast calls and reports them to the listener channel // Returns the first enqueued error, or nil if there are no enqueued errors -func (o *mockOrderer) SendBroadcast(ctx reqContext.Context, envelope *fab.SignedEnvelope) (*common.Status, error) { +func (o *MockOrderer) SendBroadcast(ctx reqContext.Context, envelope *fab.SignedEnvelope) (*common.Status, error) { // Report this call to the listener if o.BroadcastListener != nil { o.BroadcastQueue <- envelope @@ -95,21 +101,30 @@ func (o *mockOrderer) SendBroadcast(ctx reqContext.Context, envelope *fab.Signed } // SendDeliver returns the channels for delivery of prepared mock values and errors (if any) -func (o *mockOrderer) SendDeliver(ctx reqContext.Context, envelope *fab.SignedEnvelope) (chan *common.Block, chan error) { +func (o *MockOrderer) SendDeliver(ctx reqContext.Context, envelope *fab.SignedEnvelope) (chan *common.Block, chan error) { return o.Deliveries, o.DeliveryErrors } -func (o *mockOrderer) EnqueueSendBroadcastError(err error) { +// Close cleans up the instance and ends goroutines +func (o *MockOrderer) Close() { + close(o.BroadcastQueue) + close(o.DeliveryQueue) +} + +// EnqueueSendBroadcastError enqueues error +func (o *MockOrderer) EnqueueSendBroadcastError(err error) { o.BroadcastErrors <- err } // EnqueueForSendDeliver enqueues a mock value (block or error) for delivery -func (o *mockOrderer) EnqueueForSendDeliver(value interface{}) { +func (o *MockOrderer) EnqueueForSendDeliver(value interface{}) { switch value.(type) { + case common.Status: + o.DeliveryQueue <- value case *common.Block: - o.DeliveryQueue <- value.(*common.Block) + o.DeliveryQueue <- value case error: - o.DeliveryQueue <- value.(error) + o.DeliveryQueue <- value default: panic(fmt.Sprintf("Value not *common.Block nor error: %v", value)) } diff --git a/pkg/fab/orderer/orderer.go b/pkg/fab/orderer/orderer.go index 71ea064461..4e0185e83d 100644 --- a/pkg/fab/orderer/orderer.go +++ b/pkg/fab/orderer/orderer.go @@ -19,6 +19,7 @@ import ( grpcstatus "google.golang.org/grpc/status" ab "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/protos/orderer" + "github.com/hyperledger/fabric-sdk-go/pkg/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/core/config/comm" @@ -30,11 +31,6 @@ import ( var logger = logging.NewLogger("fabsdk/fab") -type connProvider interface { - DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) - ReleaseConn(conn *grpc.ClientConn) -} - // Orderer allows a client to broadcast a transaction. type Orderer struct { config core.Config @@ -47,7 +43,7 @@ type Orderer struct { failFast bool transportCredentials credentials.TransportCredentials allowInsecure bool - connector connProvider + commManager fab.CommManager } // Option describes a functional parameter for the New constructor @@ -56,8 +52,8 @@ type Option func(*Orderer) error // New Returns a Orderer instance func New(config core.Config, opts ...Option) (*Orderer, error) { orderer := &Orderer{ - config: config, - connector: &defConnector{}, + config: config, + commManager: &defCommManager{}, } for _, opt := range opts { @@ -127,15 +123,6 @@ func WithInsecure() Option { } } -// WithConnProvider allows a custom GRPC connection provider to be used. -func WithConnProvider(provider connProvider) Option { - return func(p *Orderer) error { - p.connector = provider - - return nil - } -} - // FromOrdererConfig is a functional option for the orderer.New constructor that configures a new orderer // from a apiconfig.OrdererConfig struct func FromOrdererConfig(ordererCfg *core.OrdererConfig) Option { @@ -222,7 +209,21 @@ func (o *Orderer) conn(ctx reqContext.Context) (*grpc.ClientConn, error) { ctx, cancel := reqContext.WithTimeout(ctx, o.dialTimeout) defer cancel() - return o.connector.DialContext(ctx, o.url, o.grpcDialOption...) + commManager, ok := context.RequestCommManager(ctx) + if !ok { + commManager = o.commManager + } + + return commManager.DialContext(ctx, o.url, o.grpcDialOption...) +} + +func (o *Orderer) releaseConn(ctx reqContext.Context, conn *grpc.ClientConn) { + commManager, ok := context.RequestCommManager(ctx) + if !ok { + commManager = o.commManager + } + + commManager.ReleaseConn(conn) } // URL Get the Orderer url. Required property for the instance objects. @@ -242,7 +243,7 @@ func (o *Orderer) SendBroadcast(ctx reqContext.Context, envelope *fab.SignedEnve return nil, status.New(status.OrdererClientStatus, status.ConnectionFailed.ToInt32(), err.Error(), nil) } - defer o.connector.ReleaseConn(conn) + defer o.releaseConn(ctx, conn) broadcastStream, err := ab.NewAtomicBroadcastClient(conn).Broadcast(ctx) if err != nil { @@ -316,7 +317,7 @@ func (o *Orderer) SendDeliver(ctx reqContext.Context, envelope *fab.SignedEnvelo broadcastStream, err := ab.NewAtomicBroadcastClient(conn).Deliver(ctx) if err != nil { logger.Errorf("deliver failed [%s]", err) - o.connector.ReleaseConn(conn) + o.commManager.ReleaseConn(conn) errs <- errors.Wrap(err, "deliver failed") return responses, errs @@ -327,15 +328,16 @@ func (o *Orderer) SendDeliver(ctx reqContext.Context, envelope *fab.SignedEnvelo Payload: envelope.Payload, Signature: envelope.Signature, }); err != nil { - o.connector.ReleaseConn(conn) + o.commManager.ReleaseConn(conn) errs <- errors.Wrap(err, "failed to send block request to orderer") return responses, errs } + broadcastStream.CloseSend() // Receive blocks from the GRPC stream and put them on the channel go func() { - defer o.connector.ReleaseConn(conn) + defer o.commManager.ReleaseConn(conn) blockStream(broadcastStream, responses, errs) }() @@ -374,13 +376,13 @@ func blockStream(broadcastStream ab.AtomicBroadcast_DeliverClient, responses cha } } -type defConnector struct{} +type defCommManager struct{} -func (*defConnector) DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { +func (*defCommManager) DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { opts = append(opts, grpc.WithBlock()) return grpc.DialContext(ctx, target, opts...) } -func (*defConnector) ReleaseConn(conn *grpc.ClientConn) { +func (*defCommManager) ReleaseConn(conn *grpc.ClientConn) { conn.Close() } diff --git a/pkg/fab/orderer/orderer_test.go b/pkg/fab/orderer/orderer_test.go index 650512b296..1f629e0492 100644 --- a/pkg/fab/orderer/orderer_test.go +++ b/pkg/fab/orderer/orderer_test.go @@ -564,30 +564,3 @@ func TestNewOrdererSecured(t *testing.T) { } } - -func TestNewOrdererCustomConnector(t *testing.T) { - mc := &mockConnector{} - - ordererConfig := getGRPCOpts(ordererAddr, true, false, true) - orderer, _ := New(mocks.NewMockConfig(), FromOrdererConfig(ordererConfig), WithConnProvider(mc)) - - _, err := orderer.SendBroadcast(reqContext.Background(), &fab.SignedEnvelope{}) - assert.Nil(t, err) - assert.True(t, mc.dialCalled) - assert.True(t, mc.releaseConnCalled) -} - -type mockConnector struct { - dialCalled bool - releaseConnCalled bool -} - -func (mc *mockConnector) DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { - mc.dialCalled = true - opts = append(opts, grpc.WithBlock()) - return grpc.DialContext(ctx, target, opts...) -} - -func (mc *mockConnector) ReleaseConn(conn *grpc.ClientConn) { - mc.releaseConnCalled = true -} diff --git a/pkg/fab/peer/peer.go b/pkg/fab/peer/peer.go index a724d6997d..076c7e494a 100644 --- a/pkg/fab/peer/peer.go +++ b/pkg/fab/peer/peer.go @@ -25,11 +25,6 @@ import ( var logger = logging.NewLogger("fabsdk/fab") -type connProvider interface { - DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) - ReleaseConn(conn *grpc.ClientConn) -} - // Peer represents a node in the target blockchain network to which // HFC sends endorsement proposals, transaction ordering or query requests. type Peer struct { @@ -45,7 +40,7 @@ type Peer struct { kap keepalive.ClientParameters failFast bool inSecure bool - connector connProvider + commManager fab.CommManager } // Option describes a functional parameter for the New constructor @@ -54,8 +49,8 @@ type Option func(*Peer) error // New Returns a new Peer instance func New(config core.Config, opts ...Option) (*Peer, error) { peer := &Peer{ - config: config, - connector: &defConnector{}, + config: config, + commManager: &defCommManager{}, } var err error @@ -77,7 +72,7 @@ func New(config core.Config, opts ...Option) (*Peer, error) { kap: peer.kap, failFast: peer.failFast, allowInsecure: peer.inSecure, - connector: peer.connector, + commManager: peer.commManager, } peer.processor, err = newPeerEndorser(&endorseRequest) @@ -203,15 +198,6 @@ func WithPeerProcessor(processor fab.ProposalProcessor) Option { } } -// WithConnProvider allows a custom GRPC connection provider to be used. -func WithConnProvider(provider connProvider) Option { - return func(p *Peer) error { - p.connector = provider - - return nil - } -} - // Name gets the Peer name. func (p *Peer) Name() string { return p.name @@ -283,13 +269,13 @@ func PeersToTxnProcessors(peers []fab.Peer) []fab.ProposalProcessor { return tpp } -type defConnector struct{} +type defCommManager struct{} -func (*defConnector) DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { +func (*defCommManager) DialContext(ctx reqContext.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { opts = append(opts, grpc.WithBlock()) return grpc.DialContext(ctx, target, opts...) } -func (*defConnector) ReleaseConn(conn *grpc.ClientConn) { +func (*defCommManager) ReleaseConn(conn *grpc.ClientConn) { conn.Close() } diff --git a/pkg/fab/peer/peerendorser.go b/pkg/fab/peer/peerendorser.go index 4e0f863756..4c38bfeb6f 100644 --- a/pkg/fab/peer/peerendorser.go +++ b/pkg/fab/peer/peerendorser.go @@ -17,6 +17,7 @@ import ( "google.golang.org/grpc/keepalive" grpcstatus "google.golang.org/grpc/status" + "github.com/hyperledger/fabric-sdk-go/pkg/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/core/config/comm" @@ -31,7 +32,7 @@ type peerEndorser struct { target string dialTimeout time.Duration failFast bool - connector connProvider + commManager fab.CommManager } type peerEndorserRequest struct { @@ -42,7 +43,7 @@ type peerEndorserRequest struct { kap keepalive.ClientParameters failFast bool allowInsecure bool - connector connProvider + commManager fab.CommManager } func newPeerEndorser(endorseReq *peerEndorserRequest) (*peerEndorser, error) { @@ -52,7 +53,7 @@ func newPeerEndorser(endorseReq *peerEndorserRequest) (*peerEndorser, error) { // Construct dialer options for the connection var grpcOpts []grpc.DialOption - if endorseReq.kap.Time > 0 || endorseReq.kap.Timeout > 0 { + if endorseReq.kap.Time > 0 { grpcOpts = append(grpcOpts, grpc.WithKeepaliveParams(endorseReq.kap)) } grpcOpts = append(grpcOpts, grpc.WithDefaultCallOptions(grpc.FailFast(endorseReq.failFast))) @@ -73,7 +74,7 @@ func newPeerEndorser(endorseReq *peerEndorserRequest) (*peerEndorser, error) { grpcDialOption: grpcOpts, target: urlutil.ToAddress(endorseReq.target), dialTimeout: timeout, - connector: endorseReq.connector, + commManager: endorseReq.commManager, } return pc, nil @@ -98,11 +99,24 @@ func (p *peerEndorser) ProcessTransactionProposal(ctx reqContext.Context, reques } func (p *peerEndorser) conn(ctx reqContext.Context) (*grpc.ClientConn, error) { - // Establish connection to Ordering Service + commManager, ok := context.RequestCommManager(ctx) + if !ok { + commManager = p.commManager + } + ctx, cancel := reqContext.WithTimeout(ctx, p.dialTimeout) defer cancel() - return p.connector.DialContext(ctx, p.target, p.grpcDialOption...) + return commManager.DialContext(ctx, p.target, p.grpcDialOption...) +} + +func (p *peerEndorser) releaseConn(ctx reqContext.Context, conn *grpc.ClientConn) { + commManager, ok := context.RequestCommManager(ctx) + if !ok { + commManager = p.commManager + } + + commManager.ReleaseConn(conn) } func (p *peerEndorser) sendProposal(ctx reqContext.Context, proposal fab.ProcessProposalRequest) (*pb.ProposalResponse, error) { @@ -114,7 +128,7 @@ func (p *peerEndorser) sendProposal(ctx reqContext.Context, proposal fab.Process } return nil, status.New(status.EndorserClientStatus, status.ConnectionFailed.ToInt32(), err.Error(), []interface{}{p.target}) } - defer p.connector.ReleaseConn(conn) + defer p.releaseConn(ctx, conn) endorserClient := pb.NewEndorserClient(conn) resp, err := endorserClient.ProcessProposal(ctx, proposal.SignedProposal) diff --git a/pkg/fab/peer/peerendorser_test.go b/pkg/fab/peer/peerendorser_test.go index 284bbfb8d2..d94b8774f8 100644 --- a/pkg/fab/peer/peerendorser_test.go +++ b/pkg/fab/peer/peerendorser_test.go @@ -230,7 +230,7 @@ func getPeerEndorserRequest(url string, cert *x509.Certificate, serverHostOverri kap: kap, failFast: false, allowInsecure: allowInsecure, - connector: &defConnector{}, + commManager: &defCommManager{}, } } diff --git a/pkg/fab/resource/resource.go b/pkg/fab/resource/resource.go index b6887f7e2f..8dbf3f2a72 100644 --- a/pkg/fab/resource/resource.go +++ b/pkg/fab/resource/resource.go @@ -14,7 +14,8 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" - "github.com/hyperledger/fabric-sdk-go/pkg/common/context" + contextAPI "github.com/hyperledger/fabric-sdk-go/pkg/common/context" + "github.com/hyperledger/fabric-sdk-go/pkg/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" ccomm "github.com/hyperledger/fabric-sdk-go/pkg/core/config/comm" @@ -30,22 +31,22 @@ var logger = logging.NewLogger("fabsdk/fab") // Resource is a client that provides access to fabric network resource management. type Resource struct { - clientContext context.Client + clientContext contextAPI.Client } // New returns a Client instance with the SDK context. -func New(ctx context.Client) *Resource { +func New(ctx contextAPI.Client) *Resource { c := Resource{clientContext: ctx} return &c } type fabCtx struct { - context.Providers - context.Identity + contextAPI.Providers + contextAPI.Identity } // SignChannelConfig signs a configuration. -func (c *Resource) SignChannelConfig(config []byte, signer context.Identity) (*common.ConfigSignature, error) { +func (c *Resource) SignChannelConfig(config []byte, signer contextAPI.Identity) (*common.ConfigSignature, error) { logger.Debug("SignChannelConfig - start") if config == nil { @@ -108,7 +109,7 @@ func (c *Resource) createChannelFromEnvelope(request api.CreateChannelRequest) ( } // Send request - reqCtx, cancel := reqContext.WithTimeout(reqContext.Background(), c.clientContext.Config().TimeoutOrDefault(core.OrdererResponse)) + reqCtx, cancel := reqContext.WithTimeout(context.NewRequest(c.clientContext), c.clientContext.Config().TimeoutOrDefault(core.OrdererResponse)) defer cancel() _, err = request.Orderer.SendBroadcast(reqCtx, env) if err != nil { diff --git a/pkg/fab/resource/resource_test.go b/pkg/fab/resource/resource_test.go index 50f034d382..1269456c50 100644 --- a/pkg/fab/resource/resource_test.go +++ b/pkg/fab/resource/resource_test.go @@ -20,6 +20,7 @@ import ( "github.com/hyperledger/fabric-sdk-go/pkg/fab/peer" "github.com/hyperledger/fabric-sdk-go/pkg/fab/resource/api" "github.com/hyperledger/fabric-sdk-go/test/metadata" + "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common" pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer" "github.com/pkg/errors" "google.golang.org/grpc" @@ -110,8 +111,11 @@ func TestJoinChannel(t *testing.T) { endorserServer, addr := startEndorserServer(t, grpcServer) peer, _ := peer.New(mocks.NewMockConfig(), peer.WithURL("grpc://"+addr), peer.WithInsecure()) peers = append(peers, peer) + orderer := mocks.NewMockOrderer("", nil) - orderer.(mocks.MockOrderer).EnqueueForSendDeliver(mocks.NewSimpleMockBlock()) + defer orderer.Close() + orderer.EnqueueForSendDeliver(mocks.NewSimpleMockBlock()) + orderer.EnqueueForSendDeliver(common.Status_SUCCESS) client := setupTestClient() @@ -212,7 +216,8 @@ func TestGenesisBlockOrdererErr(t *testing.T) { client := setupTestClient() orderer := mocks.NewMockOrderer("", nil) - orderer.(mocks.MockOrderer).EnqueueForSendDeliver(mocks.NewSimpleMockError()) + defer orderer.Close() + orderer.EnqueueForSendDeliver(mocks.NewSimpleMockError()) _, err := client.GenesisBlockFromOrderer(channelName, orderer) @@ -226,7 +231,9 @@ func TestGenesisBlock(t *testing.T) { client := setupTestClient() orderer := mocks.NewMockOrderer("", nil) - orderer.(mocks.MockOrderer).EnqueueForSendDeliver(mocks.NewSimpleMockBlock()) + defer orderer.Close() + orderer.EnqueueForSendDeliver(mocks.NewSimpleMockBlock()) + orderer.EnqueueForSendDeliver(common.Status_SUCCESS) _, err := client.GenesisBlockFromOrderer(channelName, orderer) @@ -256,7 +263,8 @@ func TestGenesisBlockOrderer(t *testing.T) { client := setupTestClient() orderer := mocks.NewMockOrderer("", nil) - orderer.(mocks.MockOrderer).EnqueueForSendDeliver(mocks.NewSimpleMockError()) + defer orderer.Close() + orderer.EnqueueForSendDeliver(mocks.NewSimpleMockError()) //Call get Genesis block _, err := client.GenesisBlockFromOrderer(channelName, orderer) diff --git a/pkg/fab/txn/env.go b/pkg/fab/txn/env.go index 2598ec5bdd..af5030e930 100644 --- a/pkg/fab/txn/env.go +++ b/pkg/fab/txn/env.go @@ -100,7 +100,7 @@ func computeTxnID(nonce, creator []byte, h hash.Hash) (string, error) { } // signPayload signs payload -func signPayload(ctx context, payload *common.Payload) (*fab.SignedEnvelope, error) { +func signPayload(ctx contextApi.Client, payload *common.Payload) (*fab.SignedEnvelope, error) { payloadBytes, err := proto.Marshal(payload) if err != nil { return nil, errors.WithMessage(err, "marshaling of payload failed") diff --git a/pkg/fab/txn/proposal.go b/pkg/fab/txn/proposal.go index eb99d077d1..f4708ca076 100644 --- a/pkg/fab/txn/proposal.go +++ b/pkg/fab/txn/proposal.go @@ -7,12 +7,13 @@ SPDX-License-Identifier: Apache-2.0 package txn import ( - reqContext "context" "sync" "github.com/golang/protobuf/proto" "github.com/pkg/errors" + contextApi "github.com/hyperledger/fabric-sdk-go/pkg/common/context" + "github.com/hyperledger/fabric-sdk-go/pkg/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/errors/multi" "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common" @@ -56,7 +57,7 @@ func CreateChaincodeInvokeProposal(txh fab.TransactionHeader, request fab.Chainc } // signProposal creates a SignedProposal based on the current context. -func signProposal(ctx context, proposal *pb.Proposal) (*pb.SignedProposal, error) { +func signProposal(ctx contextApi.Client, proposal *pb.Proposal) (*pb.SignedProposal, error) { proposalBytes, err := proto.Marshal(proposal) if err != nil { return nil, errors.Wrap(err, "mashal proposal failed") @@ -76,7 +77,7 @@ func signProposal(ctx context, proposal *pb.Proposal) (*pb.SignedProposal, error } // SendProposal sends a TransactionProposal to ProposalProcessor. -func SendProposal(ctx context, proposal *fab.TransactionProposal, targets []fab.ProposalProcessor) ([]*fab.TransactionProposalResponse, error) { +func SendProposal(ctx contextApi.Client, proposal *fab.TransactionProposal, targets []fab.ProposalProcessor) ([]*fab.TransactionProposalResponse, error) { if proposal == nil { return nil, errors.New("proposal is required") @@ -104,7 +105,7 @@ func SendProposal(ctx context, proposal *fab.TransactionProposal, targets []fab. defer wg.Done() // TODO: The RPC should be timed-out. - resp, err := processor.ProcessTransactionProposal(reqContext.Background(), request) + resp, err := processor.ProcessTransactionProposal(context.NewRequest(ctx), request) if err != nil { logger.Debugf("Received error response from txn proposal processing: %v", err) responseMtx.Lock() diff --git a/pkg/fab/txn/txn.go b/pkg/fab/txn/txn.go index 906f26aed0..2961d8add8 100644 --- a/pkg/fab/txn/txn.go +++ b/pkg/fab/txn/txn.go @@ -15,6 +15,7 @@ import ( "github.com/pkg/errors" contextApi "github.com/hyperledger/fabric-sdk-go/pkg/common/context" + "github.com/hyperledger/fabric-sdk-go/pkg/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/logging" @@ -34,11 +35,6 @@ const ( Upgrade ) -type context interface { - core.Providers - contextApi.Identity -} - // New create a transaction with proposal response, following the endorsement policy. func New(request fab.TransactionRequest) (*fab.Transaction, error) { if len(request.ProposalResponses) == 0 { @@ -109,7 +105,7 @@ func New(request fab.TransactionRequest) (*fab.Transaction, error) { } // Send send a transaction to the chain’s orderer service (one or more orderer endpoints) for consensus and committing to the ledger. -func Send(ctx context, tx *fab.Transaction, orderers []fab.Orderer) (*fab.TransactionResponse, error) { +func Send(ctx contextApi.Client, tx *fab.Transaction, orderers []fab.Orderer) (*fab.TransactionResponse, error) { if orderers == nil || len(orderers) == 0 { return nil, errors.New("orderers is nil") } @@ -144,7 +140,7 @@ func Send(ctx context, tx *fab.Transaction, orderers []fab.Orderer) (*fab.Transa // BroadcastPayload will send the given payload to some orderer, picking random endpoints // until all are exhausted -func BroadcastPayload(ctx context, payload *common.Payload, orderers []fab.Orderer) (*fab.TransactionResponse, error) { +func BroadcastPayload(ctx contextApi.Client, payload *common.Payload, orderers []fab.Orderer) (*fab.TransactionResponse, error) { // Check if orderers are defined if len(orderers) == 0 { return nil, errors.New("orderers not set") @@ -160,7 +156,7 @@ func BroadcastPayload(ctx context, payload *common.Payload, orderers []fab.Order // broadcastEnvelope will send the given envelope to some orderer, picking random endpoints // until all are exhausted -func broadcastEnvelope(ctx context, envelope *fab.SignedEnvelope, orderers []fab.Orderer) (*fab.TransactionResponse, error) { +func broadcastEnvelope(ctx contextApi.Client, envelope *fab.SignedEnvelope, orderers []fab.Orderer) (*fab.TransactionResponse, error) { // Check if orderers are defined if len(orderers) == 0 { return nil, errors.New("orderers not set") @@ -185,9 +181,9 @@ func broadcastEnvelope(ctx context, envelope *fab.SignedEnvelope, orderers []fab return nil, errResp } -func sendBroadcast(ctx context, envelope *fab.SignedEnvelope, orderer fab.Orderer) (*fab.TransactionResponse, error) { +func sendBroadcast(ctx contextApi.Client, envelope *fab.SignedEnvelope, orderer fab.Orderer) (*fab.TransactionResponse, error) { logger.Debugf("Broadcasting envelope to orderer :%s\n", orderer.URL()) - reqCtx, cancel := reqContext.WithTimeout(reqContext.Background(), ctx.Config().TimeoutOrDefault(core.OrdererResponse)) + reqCtx, cancel := reqContext.WithTimeout(context.NewRequest(ctx), ctx.Config().TimeoutOrDefault(core.OrdererResponse)) defer cancel() if _, err := orderer.SendBroadcast(reqCtx, envelope); err != nil { logger.Debugf("Receive Error Response from orderer :%v\n", err) @@ -199,7 +195,7 @@ func sendBroadcast(ctx context, envelope *fab.SignedEnvelope, orderer fab.Ordere } // SendPayload sends the given payload to each orderer and returns a block response -func SendPayload(ctx context, payload *common.Payload, orderers []fab.Orderer) (*common.Block, error) { +func SendPayload(ctx contextApi.Client, payload *common.Payload, orderers []fab.Orderer) (*common.Block, error) { if orderers == nil || len(orderers) == 0 { return nil, errors.New("orderers not set") } @@ -229,20 +225,28 @@ func SendPayload(ctx context, payload *common.Payload, orderers []fab.Orderer) ( } // sendEnvelope sends the given envelope to each orderer and returns a block response -func sendEnvelope(ctx context, envelope *fab.SignedEnvelope, orderer fab.Orderer) (*common.Block, error) { +func sendEnvelope(ctx contextApi.Client, envelope *fab.SignedEnvelope, orderer fab.Orderer) (*common.Block, error) { logger.Debugf("Broadcasting envelope to orderer :%s\n", orderer.URL()) - reqCtx, cancel := reqContext.WithTimeout(reqContext.Background(), ctx.Config().TimeoutOrDefault(core.OrdererResponse)) + reqCtx, cancel := reqContext.WithTimeout(context.NewRequest(ctx), ctx.Config().TimeoutOrDefault(core.OrdererResponse)) defer cancel() blocks, errs := orderer.SendDeliver(reqCtx, envelope) - select { - case block := <-blocks: - return block, nil - case err := <-errs: - return nil, errors.Wrapf(err, "error from orderer") + var block *common.Block + for { + select { + case b, ok := <-blocks: + // We need to block until SendDeliver releases the connection. Currently + // this is trigged by the go chan closing. + // TODO: we may want to refactor (e.g., adding a synchronous SendDeliver) + if !ok { + return block, nil + } + block = b + case err := <-errs: + return nil, errors.Wrapf(err, "error from orderer") + } } - } // Status is the transaction status returned from eventhub tx events diff --git a/pkg/fab/txn/txn_test.go b/pkg/fab/txn/txn_test.go index 03cb54ad2a..7ccdd62684 100644 --- a/pkg/fab/txn/txn_test.go +++ b/pkg/fab/txn/txn_test.go @@ -181,7 +181,7 @@ func TestBroadcastEnvelope(t *testing.T) { // Now make 1 of them fail and repeatedly broadcast broadcastCount := 50 for i := 0; i < broadcastCount; i++ { - orderer1.(mocks.MockOrderer).EnqueueSendBroadcastError(errors.New("Service Unavailable")) + orderer1.EnqueueSendBroadcastError(errors.New("Service Unavailable")) } // It should always succeed even though one of them has failed for i := 0; i < broadcastCount; i++ { @@ -192,8 +192,8 @@ func TestBroadcastEnvelope(t *testing.T) { // Now, fail both and ensure any attempt fails for i := 0; i < broadcastCount; i++ { - orderer1.(mocks.MockOrderer).EnqueueSendBroadcastError(errors.New("Service Unavailable")) - orderer2.(mocks.MockOrderer).EnqueueSendBroadcastError(errors.New("Service Unavailable")) + orderer1.EnqueueSendBroadcastError(errors.New("Service Unavailable")) + orderer2.EnqueueSendBroadcastError(errors.New("Service Unavailable")) } for i := 0; i < broadcastCount; i++ { diff --git a/pkg/fabsdk/api/factory.go b/pkg/fabsdk/api/factory.go index 337bf81c84..034a9db2ec 100644 --- a/pkg/fabsdk/api/factory.go +++ b/pkg/fabsdk/api/factory.go @@ -23,7 +23,7 @@ type CoreProviderFactory interface { CreateCryptoSuiteProvider(config core.Config) (core.CryptoSuite, error) CreateSigningManager(cryptoProvider core.CryptoSuite, config core.Config) (core.SigningManager, error) CreateIdentityManager(orgName string, stateStore core.KVStore, cryptoProvider core.CryptoSuite, config core.Config) (core.IdentityManager, error) - CreateInfraProvider(context Providers) (fab.InfraProvider, error) + CreateInfraProvider(config core.Config) (fab.InfraProvider, error) } // ServiceProviderFactory allows overriding default service providers (such as peer discovery) diff --git a/pkg/fabsdk/fabsdk.go b/pkg/fabsdk/fabsdk.go index 78ffabcc17..f77fc2d230 100644 --- a/pkg/fabsdk/fabsdk.go +++ b/pkg/fabsdk/fabsdk.go @@ -119,7 +119,7 @@ func WithLoggerPkg(logger api.LoggerProvider) Option { // providerInit interface allows for initializing providers // TODO: minimize interface type providerInit interface { - Initialize(providers *context.Provider) error + Initialize(providers contextApi.Providers) error } func initSDK(sdk *FabricSDK, config core.Config, opts []Option) error { @@ -174,14 +174,8 @@ func initSDK(sdk *FabricSDK, config core.Config, opts []Option) error { identityManager[orgName] = mgr } - //prepare basic providers needed for initialzing rest of the providers - basicProviders := context.NewProvider(context.WithConfig(config), - context.WithCryptoSuite(cryptoSuite), - context.WithSigningManager(signingManager), - ) - // Initialize Fabric Provider - infraProvider, err := sdk.opts.Core.CreateInfraProvider(basicProviders) + infraProvider, err := sdk.opts.Core.CreateInfraProvider(config) if err != nil { return errors.WithMessage(err, "failed to initialize core fabric provider") } @@ -215,6 +209,10 @@ func initSDK(sdk *FabricSDK, config core.Config, opts []Option) error { context.WithChannelProvider(channelProvider)) //initialize + if pi, ok := infraProvider.(providerInit); ok { + pi.Initialize(sdk.provider) + } + if pi, ok := discoveryProvider.(providerInit); ok { pi.Initialize(sdk.provider) } diff --git a/pkg/fabsdk/factory/defcore/corefactory.go b/pkg/fabsdk/factory/defcore/corefactory.go index b855b2553e..a63d370034 100644 --- a/pkg/fabsdk/factory/defcore/corefactory.go +++ b/pkg/fabsdk/factory/defcore/corefactory.go @@ -18,7 +18,6 @@ import ( "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/provider/fabpvdr" "github.com/pkg/errors" - sdkApi "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api" "github.com/hyperledger/fabric-sdk-go/pkg/logging/modlog" ) @@ -65,8 +64,8 @@ func (f *ProviderFactory) CreateIdentityManager(org string, stateStore core.KVSt } // CreateInfraProvider returns a new default implementation of fabric primitives -func (f *ProviderFactory) CreateInfraProvider(context sdkApi.Providers) (fab.InfraProvider, error) { - return fabpvdr.New(context), nil +func (f *ProviderFactory) CreateInfraProvider(config core.Config) (fab.InfraProvider, error) { + return fabpvdr.New(config), nil } // NewLoggerProvider returns a new default implementation of a logger backend diff --git a/pkg/fabsdk/factory/defcore/corefactory_test.go b/pkg/fabsdk/factory/defcore/corefactory_test.go index 7555c9dc3c..55e7b51984 100644 --- a/pkg/fabsdk/factory/defcore/corefactory_test.go +++ b/pkg/fabsdk/factory/defcore/corefactory_test.go @@ -169,7 +169,7 @@ func TestNewFactoryInfraProvider(t *testing.T) { factory := NewProviderFactory() ctx := mocks.NewMockProviderContext() - infraProvider, err := factory.CreateInfraProvider(ctx) + infraProvider, err := factory.CreateInfraProvider(ctx.Config()) if err != nil { t.Fatalf("Unexpected error creating fabric provider %v", err) } diff --git a/pkg/fabsdk/factory/defsvc/svcfactory_test.go b/pkg/fabsdk/factory/defsvc/svcfactory_test.go index c0a090c1ab..5e55fc54c3 100644 --- a/pkg/fabsdk/factory/defsvc/svcfactory_test.go +++ b/pkg/fabsdk/factory/defsvc/svcfactory_test.go @@ -20,7 +20,7 @@ import ( func TestCreateDiscoveryProvider(t *testing.T) { ctx := mocks.NewMockContext(mocks.NewMockUser("testuser")) - fabPvdr := fabpvdr.New(ctx) + fabPvdr := fabpvdr.New(ctx.Config()) factory := NewProviderFactory() config := mocks.NewMockConfig() diff --git a/pkg/fabsdk/mocks/mockfabsdkapi.gen.go b/pkg/fabsdk/mocks/mockfabsdkapi.gen.go index 4dd1ba4de2..24f894c0ce 100644 --- a/pkg/fabsdk/mocks/mockfabsdkapi.gen.go +++ b/pkg/fabsdk/mocks/mockfabsdkapi.gen.go @@ -10,7 +10,6 @@ import ( gomock "github.com/golang/mock/gomock" core "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" fab "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" - api "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api" ) // MockCoreProviderFactory is a mock of CoreProviderFactory interface @@ -63,7 +62,7 @@ func (mr *MockCoreProviderFactoryMockRecorder) CreateIdentityManager(arg0, arg1, } // CreateInfraProvider mocks base method -func (m *MockCoreProviderFactory) CreateInfraProvider(arg0 api.Providers) (fab.InfraProvider, error) { +func (m *MockCoreProviderFactory) CreateInfraProvider(arg0 core.Config) (fab.InfraProvider, error) { ret := m.ctrl.Call(m, "CreateInfraProvider", arg0) ret0, _ := ret[0].(fab.InfraProvider) ret1, _ := ret[1].(error) diff --git a/pkg/fabsdk/mocks_test.go b/pkg/fabsdk/mocks_test.go index c0af5e42d3..148fa8bce1 100644 --- a/pkg/fabsdk/mocks_test.go +++ b/pkg/fabsdk/mocks_test.go @@ -10,7 +10,6 @@ import ( "fmt" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" - "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks" "github.com/hyperledger/fabric-sdk-go/pkg/logging/api" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" @@ -60,8 +59,7 @@ func newMockCorePkg(config core.Config) (*mockCorePkg, error) { im[orgName] = mgr } - ctx := mocks.NewMockProviderContextCustom(config, cs, sm, stateStore, im) - fp, err := sdkcore.CreateInfraProvider(ctx) + fp, err := sdkcore.CreateInfraProvider(config) if err != nil { return nil, err } @@ -97,7 +95,7 @@ func (mc *mockCorePkg) CreateIdentityManager(orgName string, stateStore core.KVS return mgr, nil } -func (mc *mockCorePkg) CreateInfraProvider(ctx sdkApi.Providers) (fab.InfraProvider, error) { +func (mc *mockCorePkg) CreateInfraProvider(config core.Config) (fab.InfraProvider, error) { return mc.infraProvider, nil } diff --git a/pkg/fabsdk/provider/chpvdr/chprovider_test.go b/pkg/fabsdk/provider/chpvdr/chprovider_test.go index 7200e58dfd..9353c80c60 100644 --- a/pkg/fabsdk/provider/chpvdr/chprovider_test.go +++ b/pkg/fabsdk/provider/chpvdr/chprovider_test.go @@ -10,10 +10,10 @@ import ( "testing" "github.com/hyperledger/fabric-sdk-go/pkg/common/context" + "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/fab/chconfig" "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks" - "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/api" "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/factory/defcore" "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/provider/fabpvdr" "github.com/stretchr/testify/assert" @@ -25,7 +25,7 @@ func TestBasicValidChannel(t *testing.T) { user := mocks.NewMockUser("user") - fp, err := pf.CreateInfraProvider(ctx) + fp, err := pf.CreateInfraProvider(ctx.Config()) if err != nil { t.Fatalf("Unexpected error creating Fabric Provider: %v", err) } @@ -75,12 +75,11 @@ func (f *MockInfraProvider) CreateChannelConfig(ic fab.IdentityContext, channelI } // CreateInfraProvider mocks new default implementation of fabric primitives -func (f *MockProviderFactory) CreateInfraProvider(context api.Providers) (fab.InfraProvider, error) { - fabProvider := fabpvdr.New(context) +func (f *MockProviderFactory) CreateInfraProvider(config core.Config) (fab.InfraProvider, error) { + fabProvider := fabpvdr.New(config) cfp := MockInfraProvider{ - InfraProvider: fabProvider, - providerContext: context, + InfraProvider: fabProvider, } return &cfp, nil } diff --git a/pkg/fabsdk/provider/fabpvdr/fabpvdr.go b/pkg/fabsdk/provider/fabpvdr/fabpvdr.go index 2d91805171..f3584d5acb 100644 --- a/pkg/fabsdk/provider/fabpvdr/fabpvdr.go +++ b/pkg/fabsdk/provider/fabpvdr/fabpvdr.go @@ -25,7 +25,7 @@ import ( // InfraProvider represents the default implementation of Fabric objects. type InfraProvider struct { providerContext context.Providers - connector *comm.CachingConnector + commManager *comm.CachingConnector } type fabContext struct { @@ -34,22 +34,32 @@ type fabContext struct { } // New creates a InfraProvider enabling access to core Fabric objects and functionality. -func New(ctx context.Providers) *InfraProvider { - idleTime := ctx.Config().TimeoutOrDefault(core.ConnectionIdle) - sweepTime := ctx.Config().TimeoutOrDefault(core.CacheSweepInterval) +func New(config core.Config) *InfraProvider { + idleTime := config.TimeoutOrDefault(core.ConnectionIdle) + sweepTime := config.TimeoutOrDefault(core.CacheSweepInterval) cc := comm.NewCachingConnector(sweepTime, idleTime) f := InfraProvider{ - providerContext: ctx, - connector: cc, + commManager: cc, } return &f } +// Initialize sets the provider context +func (f *InfraProvider) Initialize(providers context.Providers) error { + f.providerContext = providers + return nil +} + // Close frees resources and caches. func (f *InfraProvider) Close() { - f.connector.Close() + f.commManager.Close() +} + +// CommManager provides comm support such as GRPC onnections +func (f *InfraProvider) CommManager() fab.CommManager { + return f.commManager } // CreateResourceClient returns a new client initialized for the current instance of the SDK. @@ -133,7 +143,7 @@ func (f *InfraProvider) CreateChannelTransactor(ic fab.IdentityContext, cfg fab. // CreatePeerFromConfig returns a new default implementation of Peer based configuration func (f *InfraProvider) CreatePeerFromConfig(peerCfg *core.NetworkPeer) (fab.Peer, error) { - return peerImpl.New(f.providerContext.Config(), peerImpl.FromPeerConfig(peerCfg), peerImpl.WithConnProvider(f.connector)) + return peerImpl.New(f.providerContext.Config(), peerImpl.FromPeerConfig(peerCfg)) } // CreateOrdererFromConfig creates a default implementation of Orderer based on configuration. diff --git a/pkg/fabsdk/provider/fabpvdr/fabpvdr_test.go b/pkg/fabsdk/provider/fabpvdr/fabpvdr_test.go index 2e09692a95..8237f38ffe 100644 --- a/pkg/fabsdk/provider/fabpvdr/fabpvdr_test.go +++ b/pkg/fabsdk/provider/fabpvdr/fabpvdr_test.go @@ -93,5 +93,8 @@ func newMockInfraProvider(t *testing.T) *InfraProvider { im[""] = &mocks.MockIdentityManager{} ctx := mocks.NewMockProviderContextCustom(cfg, cryptoSuite, mocks.NewMockSigningManager(), mocks.NewMockStateStore(), im) - return New(ctx) + ip := New(cfg) + ip.Initialize(ctx) + + return ip } diff --git a/test/fixtures/config/config_pkcs11_test.yaml b/test/fixtures/config/config_pkcs11_test.yaml index a829e0b423..10aebe960f 100755 --- a/test/fixtures/config/config_pkcs11_test.yaml +++ b/test/fixtures/config/config_pkcs11_test.yaml @@ -55,11 +55,11 @@ client: eventService: timeout: connection: 3s - registrationResponse: 3s + registrationResponse: 10s orderer: timeout: connection: 3s - response: 5s + response: 10s global: timeout: query: 45s diff --git a/test/fixtures/config/config_test.yaml b/test/fixtures/config/config_test.yaml index 9f6d95084e..dc53fee071 100755 --- a/test/fixtures/config/config_test.yaml +++ b/test/fixtures/config/config_test.yaml @@ -56,11 +56,11 @@ client: eventService: timeout: connection: 3s - registrationResponse: 3s + registrationResponse: 10s orderer: timeout: connection: 3s - response: 5s + response: 10s global: timeout: query: 45s diff --git a/test/fixtures/config/config_test_embedded_pems.yaml b/test/fixtures/config/config_test_embedded_pems.yaml index 2737dd693d..73ffdb8ee5 100755 --- a/test/fixtures/config/config_test_embedded_pems.yaml +++ b/test/fixtures/config/config_test_embedded_pems.yaml @@ -49,18 +49,18 @@ client: connection: 3s discovery: # Expiry period for discovery service greylist filter - # The channel client will lock peers that are found to be offline + # The channel client will greylist peers that are found to be offline # to prevent re-selecting them in subsequent retries. # This interval will define how long a peer is greylisted greylistExpiry: 5s eventService: timeout: connection: 3s - registrationResponse: 3s + registrationResponse: 10s orderer: timeout: connection: 3s - response: 5s + response: 10s global: timeout: query: 45s diff --git a/test/fixtures/config/config_test_no_orderer.yaml b/test/fixtures/config/config_test_no_orderer.yaml index 284f2196c0..2d167ab18c 100755 --- a/test/fixtures/config/config_test_no_orderer.yaml +++ b/test/fixtures/config/config_test_no_orderer.yaml @@ -56,11 +56,11 @@ client: eventService: timeout: connection: 3s - registrationResponse: 3s + registrationResponse: 10s orderer: timeout: connection: 3s - response: 5s + response: 10s global: timeout: query: 45s diff --git a/test/integration/base_test_setup.go b/test/integration/base_test_setup.go index 9070482c7b..8c80e752d7 100644 --- a/test/integration/base_test_setup.go +++ b/test/integration/base_test_setup.go @@ -23,7 +23,6 @@ import ( // BaseSetupImpl implementation of BaseTestSetup type BaseSetupImpl struct { - SDK *fabsdk.FabricSDK Identity fab.IdentityContext Targets []fab.ProposalProcessor ConfigFile string @@ -68,13 +67,7 @@ func ExampleCCUpgradeArgs() [][]byte { } // Initialize reads configuration from file and sets up client, channel and event hub -func (setup *BaseSetupImpl) Initialize() error { - // Create SDK setup for the integration tests - sdk, err := fabsdk.New(config.FromFile(setup.ConfigFile)) - if err != nil { - return errors.WithMessage(err, "SDK init failed") - } - setup.SDK = sdk +func (setup *BaseSetupImpl) Initialize(sdk *fabsdk.FabricSDK) error { adminIdentity, err := GetSigningIdentity(sdk, AdminUser, setup.OrgID) if err != nil { diff --git a/test/integration/fab/events_test.go b/test/integration/fab/events_test.go index f7d5ac8ab0..5358e67a80 100644 --- a/test/integration/fab/events_test.go +++ b/test/integration/fab/events_test.go @@ -31,14 +31,15 @@ var eventCCArgs = [][]byte{[]byte("invoke"), []byte("SEVERE")} func TestEvents(t *testing.T) { chainCodeID := integration.GenerateRandomID() - testSetup := initializeTests(t, chainCodeID) + testSetup, sdk := initializeTests(t, chainCodeID) + defer sdk.Close() - transactor, err := getTransactor(testSetup.SDK, testSetup.ChannelID, "Admin", testSetup.OrgID) + transactor, err := getTransactor(sdk, testSetup.ChannelID, "Admin", testSetup.OrgID) if err != nil { t.Fatalf("Failed to get channel transactor: %s", err) } - eventHub, err := getEventHub(testSetup.SDK, testSetup.ChannelID, "Admin", testSetup.OrgID) + eventHub, err := getEventHub(sdk, testSetup.ChannelID, "Admin", testSetup.OrgID) if err != nil { t.Fatalf("Failed to get channel event hub: %s", err) } diff --git a/test/integration/fab/install_chaincode_test.go b/test/integration/fab/install_chaincode_test.go index b0e8590688..57db5b6ab3 100644 --- a/test/integration/fab/install_chaincode_test.go +++ b/test/integration/fab/install_chaincode_test.go @@ -14,8 +14,10 @@ import ( "testing" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" + "github.com/hyperledger/fabric-sdk-go/pkg/core/config" packager "github.com/hyperledger/fabric-sdk-go/pkg/fab/ccpackager/gopackager" "github.com/hyperledger/fabric-sdk-go/pkg/fab/resource/api" + "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk" "github.com/hyperledger/fabric-sdk-go/test/integration" "github.com/hyperledger/fabric-sdk-go/test/metadata" "github.com/pkg/errors" @@ -35,19 +37,23 @@ func TestChaincodeInstal(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) + sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) + if err != nil { + t.Fatalf("Failed to create new SDK: %s", err) } + defer sdk.Close() - defer testSetup.SDK.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } - testChaincodeInstallUsingChaincodePath(t, testSetup) + testChaincodeInstallUsingChaincodePath(t, sdk, testSetup) - testChaincodeInstallUsingChaincodePackage(t, testSetup) + testChaincodeInstallUsingChaincodePackage(t, sdk, testSetup) } // Test chaincode install using chaincodePath to create chaincodePackage -func testChaincodeInstallUsingChaincodePath(t *testing.T, testSetup *integration.BaseSetupImpl) { +func testChaincodeInstallUsingChaincodePath(t *testing.T, sdk *fabsdk.FabricSDK, testSetup *integration.BaseSetupImpl) { chainCodeVersion := getRandomCCVersion() ccPkg, err := packager.NewCCPackage(chainCodePath, integration.GetDeployPath()) @@ -56,7 +62,7 @@ func testChaincodeInstallUsingChaincodePath(t *testing.T, testSetup *integration } // Low level resource - client, err := getResource(testSetup.SDK, "Admin", orgName) + client, err := getResource(sdk, "Admin", orgName) if err != nil { t.Fatalf("Failed to get resource: %s", err) } @@ -91,7 +97,7 @@ func testChaincodeInstallUsingChaincodePath(t *testing.T, testSetup *integration } // Test chaincode install using chaincodePackage[byte] -func testChaincodeInstallUsingChaincodePackage(t *testing.T, testSetup *integration.BaseSetupImpl) { +func testChaincodeInstallUsingChaincodePackage(t *testing.T, sdk *fabsdk.FabricSDK, testSetup *integration.BaseSetupImpl) { chainCodeVersion := getRandomCCVersion() @@ -101,7 +107,7 @@ func testChaincodeInstallUsingChaincodePackage(t *testing.T, testSetup *integrat } // Low level resource - client, err := getResource(testSetup.SDK, "Admin", orgName) + client, err := getResource(sdk, "Admin", orgName) if err != nil { t.Fatalf("Failed to get resource: %s", err) } diff --git a/test/integration/fab/main_test.go b/test/integration/fab/main_test.go index e9064e0e16..c0a6bb241e 100644 --- a/test/integration/fab/main_test.go +++ b/test/integration/fab/main_test.go @@ -11,13 +11,14 @@ import ( "path" "testing" - config "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" + "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" + "github.com/hyperledger/fabric-sdk-go/pkg/core/config" "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk" "github.com/hyperledger/fabric-sdk-go/test/integration" "github.com/hyperledger/fabric-sdk-go/test/metadata" ) -var testFabricConfig config.Config +var testFabricConfig core.Config func TestMain(m *testing.M) { setup() @@ -46,7 +47,7 @@ func teardown() { testFabricConfig = nil } -func initializeTests(t *testing.T, chainCodeID string) integration.BaseSetupImpl { +func initializeTests(t *testing.T, chainCodeID string) (integration.BaseSetupImpl, *fabsdk.FabricSDK) { testSetup := integration.BaseSetupImpl{ ConfigFile: "../" + integration.ConfigTestFile, @@ -55,13 +56,18 @@ func initializeTests(t *testing.T, chainCodeID string) integration.BaseSetupImpl ChannelConfig: path.Join("../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { + sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) + if err != nil { + t.Fatalf("Failed to create new SDK: %s", err) + } + + if err := testSetup.Initialize(sdk); err != nil { t.Fatalf(err.Error()) } - if err := integration.InstallAndInstantiateCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID, "github.com/events_cc", "v0", integration.GetDeployPath(), nil); err != nil { + if err := integration.InstallAndInstantiateCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID, "github.com/events_cc", "v0", integration.GetDeployPath(), nil); err != nil { t.Fatalf("InstallAndInstantiateCC return error: %v", err) } - return testSetup + return testSetup, sdk } diff --git a/test/integration/fab/resource_queries_test.go b/test/integration/fab/resource_queries_test.go index 63d3e021d1..ae0231aaf9 100644 --- a/test/integration/fab/resource_queries_test.go +++ b/test/integration/fab/resource_queries_test.go @@ -16,11 +16,11 @@ import ( func TestChannelQueries(t *testing.T) { chaincodeID := integration.GenerateRandomID() - testSetup := initializeTests(t, chaincodeID) - defer testSetup.SDK.Close() + testSetup, sdk := initializeTests(t, chaincodeID) + defer sdk.Close() // Low level resource - client, err := getResource(testSetup.SDK, "Admin", orgName) + client, err := getResource(sdk, "Admin", orgName) if err != nil { t.Fatalf("Failed to get resource: %s", err) } diff --git a/test/integration/fab/transient_data_test.go b/test/integration/fab/transient_data_test.go index 5a0a5040db..5a6f4b00ad 100644 --- a/test/integration/fab/transient_data_test.go +++ b/test/integration/fab/transient_data_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" + "github.com/hyperledger/fabric-sdk-go/pkg/core/config" "github.com/hyperledger/fabric-sdk-go/pkg/fab/txn" "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk" "github.com/hyperledger/fabric-sdk-go/test/integration" @@ -28,13 +29,18 @@ func TestTransient(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { + sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) + if err != nil { + t.Fatalf("Failed to create new SDK: %s", err) + } + defer sdk.Close() + + if err := testSetup.Initialize(sdk); err != nil { t.Fatalf(err.Error()) } - defer testSetup.SDK.Close() chaincodeID := integration.GenerateRandomID() - if err := integration.InstallAndInstantiateExampleCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, chaincodeID); err != nil { + if err := integration.InstallAndInstantiateExampleCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, chaincodeID); err != nil { t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) } @@ -44,7 +50,7 @@ func TestTransient(t *testing.T) { transientDataMap := make(map[string][]byte) transientDataMap["result"] = []byte(transientData) - transactor, err := getTransactor(testSetup.SDK, testSetup.ChannelID, "Admin", testSetup.OrgID) + transactor, err := getTransactor(sdk, testSetup.ChannelID, "Admin", testSetup.OrgID) if err != nil { t.Fatalf("Failed to get channel transactor: %s", err) } diff --git a/test/integration/sdk/channel_client_test.go b/test/integration/sdk/channel_client_test.go index f894fd0938..44c5eed982 100644 --- a/test/integration/sdk/channel_client_test.go +++ b/test/integration/sdk/channel_client_test.go @@ -37,15 +37,6 @@ func TestChannelClient(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - - chainCodeID := integration.GenerateRandomID() - if err := integration.InstallAndInstantiateExampleCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { - t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) - } - // Create SDK setup for the integration tests sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) if err != nil { @@ -53,6 +44,15 @@ func TestChannelClient(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + + chainCodeID := integration.GenerateRandomID() + if err := integration.InstallAndInstantiateExampleCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { + t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) + } + //prepare context org1ChannelClientContext := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name)) diff --git a/test/integration/sdk/channel_config_test.go b/test/integration/sdk/channel_config_test.go index 26594097bd..ad4202674a 100644 --- a/test/integration/sdk/channel_config_test.go +++ b/test/integration/sdk/channel_config_test.go @@ -11,6 +11,7 @@ import ( "strings" "testing" + contextAPI "github.com/hyperledger/fabric-sdk-go/pkg/common/context" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/core" "github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab" "github.com/hyperledger/fabric-sdk-go/pkg/core/config" @@ -34,10 +35,6 @@ func TestChannelConfig(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - // Create SDK setup for the integration tests sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) if err != nil { @@ -45,6 +42,10 @@ func TestChannelConfig(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + //prepare contexts org1ChannelClientContext := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name)) @@ -89,10 +90,6 @@ func TestChannelConfigWithOrderer(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - confProvider := config.FromFile(testSetup.ConfigFile) // Create SDK setup for channel client with retrieve channel configuration from orderer sdk, err := fabsdk.New(confProvider, @@ -102,6 +99,10 @@ func TestChannelConfigWithOrderer(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + //prepare contexts org1ChannelClientContext := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name)) @@ -150,6 +151,13 @@ type CustomInfraProvider struct { providerContext api.Providers } +// Initialize sets the provider context +func (f *CustomInfraProvider) Initialize(providers contextAPI.Providers) error { + f.providerContext = providers + f.InfraProvider.Initialize(providers) + return nil +} + // CreateChannelConfig initializes the channel config func (f *CustomInfraProvider) CreateChannelConfig(ic fab.IdentityContext, channelID string) (fab.ChannelConfig, error) { ctx := chconfig.Context{ @@ -161,14 +169,13 @@ func (f *CustomInfraProvider) CreateChannelConfig(ic fab.IdentityContext, channe } // CreateInfraProvider returns a new default implementation of fabric primitives -func (f *ChannelConfigFromOrdererProviderFactory) CreateInfraProvider(context api.Providers) (fab.InfraProvider, error) { +func (f *ChannelConfigFromOrdererProviderFactory) CreateInfraProvider(config core.Config) (fab.InfraProvider, error) { - fabProvider := fabpvdr.New(context) + fabProvider := fabpvdr.New(config) cfp := CustomInfraProvider{ - InfraProvider: fabProvider, - providerContext: context, - orderer: f.orderer, + InfraProvider: fabProvider, + orderer: f.orderer, } return &cfp, nil } diff --git a/test/integration/sdk/custom_cryptosuite_test.go b/test/integration/sdk/custom_cryptosuite_test.go index c5f04e7d6d..aee7c02a4d 100644 --- a/test/integration/sdk/custom_cryptosuite_test.go +++ b/test/integration/sdk/custom_cryptosuite_test.go @@ -26,8 +26,7 @@ import ( const samplekey = "sample-key" -func TestEndToEndForCustomCryptoSuite(t *testing.T) { - +func customCryptoSuiteInit(t *testing.T) (*integration.BaseSetupImpl, string) { testSetup := integration.BaseSetupImpl{ ConfigFile: "../" + integration.ConfigTestFile, ChannelID: "mychannel", @@ -35,15 +34,29 @@ func TestEndToEndForCustomCryptoSuite(t *testing.T) { ChannelConfig: path.Join("../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { + // Create SDK setup for the integration tests + sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) + if err != nil { + t.Fatalf("Failed to create new SDK: %s", err) + } + defer sdk.Close() + + if err := testSetup.Initialize(sdk); err != nil { t.Fatalf(err.Error()) } chainCodeID := integration.GenerateRandomID() - if err := integration.InstallAndInstantiateExampleCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { + if err := integration.InstallAndInstantiateExampleCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) } + return &testSetup, chainCodeID +} + +func TestEndToEndForCustomCryptoSuite(t *testing.T) { + + testSetup, chainCodeID := customCryptoSuiteInit(t) + defaultConfig, err := testSetup.InitConfig()() if err != nil { diff --git a/test/integration/sdk/ledger_queries_test.go b/test/integration/sdk/ledger_queries_test.go index c33549b9e9..26c06b91fa 100644 --- a/test/integration/sdk/ledger_queries_test.go +++ b/test/integration/sdk/ledger_queries_test.go @@ -29,10 +29,6 @@ func TestLedgerClientQueries(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - // Create SDK setup for the integration tests sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) if err != nil { @@ -40,6 +36,10 @@ func TestLedgerClientQueries(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + //prepare contexts org1AdminClientContext := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name)) diff --git a/test/integration/sdk/resmgmt_queries_test.go b/test/integration/sdk/resmgmt_queries_test.go index f1ae568ec5..b963dc9206 100644 --- a/test/integration/sdk/resmgmt_queries_test.go +++ b/test/integration/sdk/resmgmt_queries_test.go @@ -27,15 +27,6 @@ func TestResMgmtClientQueries(t *testing.T) { ChannelConfig: path.Join("../../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - - ccID := integration.GenerateRandomID() - if err := integration.InstallAndInstantiateExampleCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, ccID); err != nil { - t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) - } - // Create SDK setup for the integration tests sdk, err := fabsdk.New(config.FromFile(testSetup.ConfigFile)) if err != nil { @@ -43,6 +34,15 @@ func TestResMgmtClientQueries(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + + ccID := integration.GenerateRandomID() + if err := integration.InstallAndInstantiateExampleCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, ccID); err != nil { + t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) + } + //prepare contexts org1AdminClientContext := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name)) diff --git a/test/integration/sdk/sdk_provider_test.go b/test/integration/sdk/sdk_provider_test.go index 1f293afa41..4aa2e8167a 100644 --- a/test/integration/sdk/sdk_provider_test.go +++ b/test/integration/sdk/sdk_provider_test.go @@ -34,15 +34,6 @@ func TestDynamicSelection(t *testing.T) { ChannelConfig: path.Join("../../", metadata.ChannelConfigPath, "mychannel.tx"), } - if err := testSetup.Initialize(); err != nil { - t.Fatalf(err.Error()) - } - - chainCodeID := integration.GenerateRandomID() - if err := integration.InstallAndInstantiateExampleCC(testSetup.SDK, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { - t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) - } - // Specify user that will be used by dynamic selection service (to retrieve chanincode policy information) // This user has to have privileges to query lscc for chaincode data mychannelUser := selection.ChannelUser{ChannelID: testSetup.ChannelID, UserName: "User1", OrgName: "Org1"} @@ -56,6 +47,15 @@ func TestDynamicSelection(t *testing.T) { } defer sdk.Close() + if err := testSetup.Initialize(sdk); err != nil { + t.Fatalf(err.Error()) + } + + chainCodeID := integration.GenerateRandomID() + if err := integration.InstallAndInstantiateExampleCC(sdk, fabsdk.WithUser("Admin"), testSetup.OrgID, chainCodeID); err != nil { + t.Fatalf("InstallAndInstantiateExampleCC return error: %v", err) + } + //prepare contexts org1ChannelClientContext := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name))