diff --git a/internal/pkg/gateway/api_test.go b/internal/pkg/gateway/api_test.go index 3bbede8b027..5e43bc30fe0 100644 --- a/internal/pkg/gateway/api_test.go +++ b/internal/pkg/gateway/api_test.go @@ -281,6 +281,16 @@ func TestEvaluate(t *testing.T) { }, errString: "failed to create new connection: orderer not answering", }, + { + name: "discovery returns incomplete information - no Properties", + postSetup: func(t *testing.T, def *preparedTest) { + def.discovery.PeersOfChannelReturns([]gdiscovery.NetworkMember{{ + Endpoint: "localhost:7051", + PKIid: []byte("ill-defined"), + }}) + }, + errString: "no endorsing peers found for channel", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -428,6 +438,35 @@ func TestEndorse(t *testing.T) { }, errString: "peach-melba", }, + { + name: "discovery returns incomplete protos - nil layout", + plan: endorsementPlan{ + "g1": {{endorser: localhostMock, height: 2}}, + }, + postSetup: func(t *testing.T, def *preparedTest) { + ed := &dp.EndorsementDescriptor{ + Chaincode: "my_channel", + Layouts: []*dp.Layout{nil}, + } + def.discovery.PeersForEndorsementReturns(ed, nil) + }, + errString: "failed to assemble transaction", + }, + { + name: "discovery returns incomplete protos - nil state info", + plan: endorsementPlan{ + "g1": {{endorser: localhostMock, height: 2}}, + }, + postSetup: func(t *testing.T, def *preparedTest) { + ed := &dp.EndorsementDescriptor{ + Chaincode: "my_channel", + Layouts: []*dp.Layout{{QuantitiesByGroup: map[string]uint32{"g1": 1}}}, + EndorsersByGroups: map[string]*dp.Peers{"g1": {Peers: []*dp.Peer{{StateInfo: nil}}}}, + } + def.discovery.PeersForEndorsementReturns(ed, nil) + }, + errString: "failed to select a set of endorsers that satisfy the endorsement policy", + }, { name: "process proposal fails", plan: endorsementPlan{ diff --git a/internal/pkg/gateway/registry.go b/internal/pkg/gateway/registry.go index 3703cdb5d17..a1a675d5993 100644 --- a/internal/pkg/gateway/registry.go +++ b/internal/pkg/gateway/registry.go @@ -69,27 +69,27 @@ func (reg *registry) endorsers(channel string, chaincode string) ([]*endorser, e reg.configLock.RLock() defer reg.configLock.RUnlock() - for _, layout := range descriptor.Layouts { + for _, layout := range descriptor.GetLayouts() { var receivers []*endorserState // The set of peers the client needs to request endorsements from abandonLayout := false - for group, quantity := range layout.QuantitiesByGroup { + for group, quantity := range layout.GetQuantitiesByGroup() { // Select n remoteEndorsers from each group sorted by block height // block heights var groupPeers []*endorserState - for _, peer := range descriptor.EndorsersByGroups[group].Peers { + for _, peer := range descriptor.GetEndorsersByGroups()[group].GetPeers() { msg := &gossip.GossipMessage{} - err := proto.Unmarshal(peer.StateInfo.Payload, msg) + err := proto.Unmarshal(peer.GetStateInfo().GetPayload(), msg) if err != nil { return nil, err } - height := msg.GetStateInfo().Properties.LedgerHeight - err = proto.Unmarshal(peer.MembershipInfo.Payload, msg) + height := msg.GetStateInfo().GetProperties().GetLedgerHeight() + err = proto.Unmarshal(peer.GetMembershipInfo().GetPayload(), msg) if err != nil { return nil, err } - endpoint := msg.GetAliveMsg().Membership.Endpoint + endpoint := msg.GetAliveMsg().GetMembership().GetEndpoint() // find the endorser in the registry for this endpoint var endorser *endorser @@ -165,7 +165,7 @@ func (reg *registry) endorsersByOrg(channel string, chaincode string) map[string defer reg.configLock.RUnlock() for _, member := range members { - endpoint := member.Endpoint + endpoint := member.PreferredEndpoint() // find the endorser in the registry for this endpoint var endorser *endorser if endpoint == reg.localEndorser.address { @@ -178,8 +178,8 @@ func (reg *registry) endorsersByOrg(channel string, chaincode string) map[string } for _, installedChaincode := range member.Properties.GetChaincodes() { // only consider the peers that have our chaincode installed - if installedChaincode.Name == chaincode { - endorsersByOrg[endorser.mspid] = append(endorsersByOrg[endorser.mspid], &endorserState{endorser: endorser, height: member.Properties.LedgerHeight}) + if installedChaincode.GetName() == chaincode { + endorsersByOrg[endorser.mspid] = append(endorsersByOrg[endorser.mspid], &endorserState{endorser: endorser, height: member.Properties.GetLedgerHeight()}) } } for _, es := range endorsersByOrg {