Skip to content

Commit

Permalink
[FAB-8437]High-level client New(context,options)
Browse files Browse the repository at this point in the history
Change-Id: I85c3604f46c9e571147f57352d38b3e6cd2ed475
Signed-off-by: biljana lukovic <biljana.lukovic@securekey.com>
  • Loading branch information
biljanaLukovic committed Feb 21, 2018
1 parent 0a84288 commit 68f94f9
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 31 deletions.
51 changes: 33 additions & 18 deletions pkg/fabric-txn/resmgmtclient/resmgmt.go
Expand Up @@ -66,36 +66,51 @@ type fabContext struct {
fab.IdentityContext
}

// Option describes a functional parameter for the New constructor
type Option func(*ResourceMgmtClient) error

// New returns a ResourceMgmtClient instance
func New(ctx Context, filter resmgmt.TargetFilter) (*ResourceMgmtClient, error) {
func New(ctx Context, opts ...Option) (*ResourceMgmtClient, error) {

rcFilter := filter
if rcFilter == nil {
// Default target filter is based on user msp
if ctx.MspID() == "" {
return nil, errors.New("mspID not available in user context")
resourceClient := &ResourceMgmtClient{
provider: ctx,
identity: ctx,
discoveryProvider: ctx.DiscoveryProvider,
channelProvider: ctx.ChannelProvider,
fabricProvider: ctx.FabricProvider,
resource: ctx.Resource,
}
for _, opt := range opts {
err := opt(resourceClient)
if err != nil {
return nil, err
}

rcFilter = &MSPFilter{mspID: ctx.MspID()}
}

// setup global discovery service
discovery, err := ctx.DiscoveryProvider.NewDiscoveryService("")
if err != nil {
return nil, errors.WithMessage(err, "failed to create global discovery service")
}
resourceClient.discovery = discovery
//check if target filter was set - if not set the default
if resourceClient.filter == nil {
// Default target filter is based on user msp
if ctx.MspID() == "" {
return nil, errors.New("mspID not available in user context")
}
rcFilter := &MSPFilter{mspID: ctx.MspID()}
resourceClient.filter = rcFilter
}
return resourceClient, nil
}

resourceClient := ResourceMgmtClient{
provider: ctx,
identity: ctx,
discoveryProvider: ctx.DiscoveryProvider,
channelProvider: ctx.ChannelProvider,
fabricProvider: ctx.FabricProvider,
resource: ctx.Resource,
discovery: discovery,
filter: rcFilter,
// WithTargetFilter option to configure new
func WithTargetFilter(filter resmgmt.TargetFilter) Option {
return func(rmc *ResourceMgmtClient) error {
rmc.filter = filter
return nil
}
return &resourceClient, nil
}

// JoinChannel allows for peers to join existing channel with optional custom options (specific peers, filtered peers)
Expand Down
69 changes: 57 additions & 12 deletions pkg/fabric-txn/resmgmtclient/resmgmt_test.go
Expand Up @@ -41,7 +41,6 @@ func TestJoinChannelFail(t *testing.T) {
// Setup resource management client
config := getNetworkConfig(t)
ctx.SetConfig(config)

rc := setupResMgmtClient(ctx, nil, t)
rc.resource = fcmocks.NewMockInvalidResource()

Expand All @@ -53,6 +52,7 @@ func TestJoinChannelFail(t *testing.T) {
if err == nil {
t.Fatal("Should have failed to get genesis block")
}

}

func TestJoinChannel(t *testing.T) {
Expand All @@ -64,7 +64,48 @@ func TestJoinChannel(t *testing.T) {
// Create mock orderer with simple mock block
orderer := fcmocks.NewMockOrderer("", nil)
orderer.(fcmocks.MockOrderer).EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock())
rc := setupResMgmtClient(ctx, nil, t)

channel, err := channel.New(ctx, fcmocks.NewMockChannelCfg("mychannel"))
if err != nil {
t.Fatalf("Error setting up channel: %v", err)
}
err = channel.AddOrderer(orderer)
if err != nil {
t.Fatalf("Error adding orderer: %v", err)
}
rc.channelProvider.(*fcmocks.MockChannelProvider).SetChannel("mychannel", channel)

// Setup target peers
var peers []fab.Peer
peer1, _ := peer.New(fcmocks.NewMockConfig(), peer.WithURL("example.com"))
peers = append(peers, peer1)

// Test valid join channel request (success)
err = rc.JoinChannel("mychannel", resmgmt.WithTargets(peer1))
if err != nil {
t.Fatal(err)
}

}

func TestWithFilterOption(t *testing.T) {
ctx := setupTestContext("test", "Org1MSP")
rc := setupResMgmtClient(ctx, nil, t, getTargetFilterOption())
if rc == nil {
t.Fatal("Expected Resource Management Client to be set")
}
}
func TestJoinChannelWithFilter(t *testing.T) {
grpcServer := grpc.NewServer()
defer grpcServer.Stop()

ctx := setupTestContext("test", "Org1MSP")

// Create mock orderer with simple mock block
orderer := fcmocks.NewMockOrderer("", nil)
orderer.(fcmocks.MockOrderer).EnqueueForSendDeliver(fcmocks.NewSimpleMockBlock())
//the terget filter (option) will be set
rc := setupResMgmtClient(ctx, nil, t)

channel, err := channel.New(ctx, fcmocks.NewMockChannelCfg("mychannel"))
Expand Down Expand Up @@ -115,7 +156,7 @@ func TestNoSigningUserFailure(t *testing.T) {
ChannelProvider: chProvider,
DiscoveryProvider: discovery,
}
_, err = New(ctx, nil)
_, err = New(ctx)
if err == nil {
t.Fatal("Should have failed due to missing msp")
}
Expand Down Expand Up @@ -240,6 +281,7 @@ func TestJoinChannelNoOrdererConfig(t *testing.T) {
t.Fatal(err)
}
ctx.SetConfig(invalidChOrdererConfig)

rc = setupResMgmtClient(ctx, nil, t)

err = rc.JoinChannel("mychannel")
Expand Down Expand Up @@ -944,7 +986,6 @@ func TestCCProposal(t *testing.T) {

// Create mock orderer
orderer := fcmocks.NewMockOrderer("", nil)

rc := setupResMgmtClient(ctx, nil, t)

channel, err := channel.New(ctx, fcmocks.NewMockChannelCfg("mychannel"))
Expand Down Expand Up @@ -1014,14 +1055,18 @@ func TestCCProposal(t *testing.T) {
t.Fatal(err)
}
ctx.SetConfig(cfg)

rc = setupResMgmtClient(ctx, nil, t)
rc = setupResMgmtClient(ctx, nil, t, getTargetFilterOption())
err = rc.InstantiateCC("mychannel", instantiateReq)
if err == nil {
t.Fatalf("Should have failed since no event source has been configured")
}
}

func getTargetFilterOption() Option {
targetFilter := &MSPFilter{mspID: "Org1MSP"}
return WithTargetFilter(targetFilter)
}

func setupTestDiscovery(discErr error, peers []fab.Peer) (fab.DiscoveryProvider, error) {

mockDiscovery, err := txnmocks.NewMockDiscoveryProvider(discErr, peers)
Expand All @@ -1036,11 +1081,10 @@ func setupDefaultResMgmtClient(t *testing.T) *ResourceMgmtClient {
ctx := setupTestContext("test", "Org1MSP")
network := getNetworkConfig(t)
ctx.SetConfig(network)

return setupResMgmtClient(ctx, nil, t)
return setupResMgmtClient(ctx, nil, t, getTargetFilterOption())
}

func setupResMgmtClient(fabCtx fab.Context, discErr error, t *testing.T) *ResourceMgmtClient {
func setupResMgmtClient(fabCtx fab.Context, discErr error, t *testing.T, opts ...Option) *ResourceMgmtClient {

fabProvider := fabpvdr.New(fabCtx)

Expand Down Expand Up @@ -1070,12 +1114,13 @@ func setupResMgmtClient(fabCtx fab.Context, discErr error, t *testing.T) *Resour
DiscoveryProvider: discovery,
FabricProvider: fabProvider,
}
resClient, err := New(ctx, nil)

resClient, err := New(ctx, opts...)
if err != nil {
t.Fatalf("Failed to create new channel management client: %s", err)
t.Fatalf("Failed to create new client with options: %s %v", err, opts)
}

return resClient

}

func setupTestContext(userName string, mspID string) *fcmocks.MockContext {
Expand Down Expand Up @@ -1174,7 +1219,7 @@ func TestSaveChannelFailure(t *testing.T) {
ChannelProvider: chProvider,
DiscoveryProvider: discovery,
}
cc, err := New(ctx, nil)
cc, err := New(ctx)
if err != nil {
t.Fatalf("Failed to create new channel management client: %s", err)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/fabsdk/factory/defclient/sessfactory.go
Expand Up @@ -47,7 +47,7 @@ func (f *SessionClientFactory) NewResourceMgmtClient(providers apisdk.Providers,
ChannelProvider: chProvider,
FabricProvider: fabProvider,
}
return resmgmtclient.New(ctx, filter)
return resmgmtclient.New(ctx, resmgmtclient.WithTargetFilter(filter))
}

// NewChannelClient returns a client that can execute transactions on specified channel
Expand Down

0 comments on commit 68f94f9

Please sign in to comment.