Search in sources :

Example 1 with EventHub

use of org.hyperledger.fabric.sdk.EventHub in project fabric-sdk-java by hyperledger.

the class End2endIT method runChannel.

// CHECKSTYLE.OFF: Method length is 320 lines (max allowed is 150).
void runChannel(HFClient client, Channel channel, boolean installChaincode, SampleOrg sampleOrg, int delta) {
    class ChaincodeEventCapture {

        final String handle;

        final BlockEvent blockEvent;

        final ChaincodeEvent chaincodeEvent;

        ChaincodeEventCapture(String handle, BlockEvent blockEvent, ChaincodeEvent chaincodeEvent) {
            this.handle = handle;
            this.blockEvent = blockEvent;
            this.chaincodeEvent = chaincodeEvent;
        }
    }
    // Test list to capture chaincode events.
    Vector<ChaincodeEventCapture> chaincodeEvents = new Vector<>();
    try {
        final String channelName = channel.getName();
        boolean isFooChain = FOO_CHANNEL_NAME.equals(channelName);
        out("Running channel %s", channelName);
        Collection<Orderer> orderers = channel.getOrderers();
        final ChaincodeID chaincodeID;
        Collection<ProposalResponse> responses;
        Collection<ProposalResponse> successful = new LinkedList<>();
        Collection<ProposalResponse> failed = new LinkedList<>();
        // Register a chaincode event listener that will trigger for any chaincode id and only for EXPECTED_EVENT_NAME event.
        String chaincodeEventListenerHandle = channel.registerChaincodeEventListener(Pattern.compile(".*"), Pattern.compile(Pattern.quote(EXPECTED_EVENT_NAME)), (handle, blockEvent, chaincodeEvent) -> {
            chaincodeEvents.add(new ChaincodeEventCapture(handle, blockEvent, chaincodeEvent));
            String es = blockEvent.getPeer() != null ? blockEvent.getPeer().getName() : blockEvent.getEventHub().getName();
            out("RECEIVED Chaincode event with handle: %s, chaincode Id: %s, chaincode event name: %s, " + "transaction id: %s, event payload: \"%s\", from eventhub: %s", handle, chaincodeEvent.getChaincodeId(), chaincodeEvent.getEventName(), chaincodeEvent.getTxId(), new String(chaincodeEvent.getPayload()), es);
        });
        // For non foo channel unregister event listener to test events are not called.
        if (!isFooChain) {
            channel.unregisterChaincodeEventListener(chaincodeEventListenerHandle);
            chaincodeEventListenerHandle = null;
        }
        ChaincodeID.Builder chaincodeIDBuilder = ChaincodeID.newBuilder().setName(CHAIN_CODE_NAME).setVersion(CHAIN_CODE_VERSION);
        if (null != CHAIN_CODE_PATH) {
            chaincodeIDBuilder.setPath(CHAIN_CODE_PATH);
        }
        chaincodeID = chaincodeIDBuilder.build();
        if (installChaincode) {
            // //////////////////////////
            // Install Proposal Request
            // 
            client.setUserContext(sampleOrg.getPeerAdmin());
            out("Creating install proposal");
            InstallProposalRequest installProposalRequest = client.newInstallProposalRequest();
            installProposalRequest.setChaincodeID(chaincodeID);
            if (isFooChain) {
                // on foo chain install from directory.
                // //For GO language and serving just a single user, chaincodeSource is mostly likely the users GOPATH
                installProposalRequest.setChaincodeSourceLocation(Paths.get(TEST_FIXTURES_PATH, CHAIN_CODE_FILEPATH).toFile());
            } else {
                if (CHAIN_CODE_LANG.equals(Type.GO_LANG)) {
                    installProposalRequest.setChaincodeInputStream(Util.generateTarGzInputStream((Paths.get(TEST_FIXTURES_PATH, CHAIN_CODE_FILEPATH, "src", CHAIN_CODE_PATH).toFile()), Paths.get("src", CHAIN_CODE_PATH).toString()));
                } else {
                    installProposalRequest.setChaincodeInputStream(Util.generateTarGzInputStream((Paths.get(TEST_FIXTURES_PATH, CHAIN_CODE_FILEPATH).toFile()), "src"));
                }
            }
            installProposalRequest.setChaincodeVersion(CHAIN_CODE_VERSION);
            installProposalRequest.setChaincodeLanguage(CHAIN_CODE_LANG);
            out("Sending install proposal");
            // //////////////////////////
            // only a client from the same org as the peer can issue an install request
            int numInstallProposal = 0;
            // Set<String> orgs = orgPeers.keySet();
            // for (SampleOrg org : testSampleOrgs) {
            Collection<Peer> peers = channel.getPeers();
            numInstallProposal = numInstallProposal + peers.size();
            responses = client.sendInstallProposal(installProposalRequest, peers);
            for (ProposalResponse response : responses) {
                if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
                    out("Successful install proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName());
                    successful.add(response);
                } else {
                    failed.add(response);
                }
            }
            // }
            out("Received %d install proposal responses. Successful+verified: %d . Failed: %d", numInstallProposal, successful.size(), failed.size());
            if (failed.size() > 0) {
                ProposalResponse first = failed.iterator().next();
                fail("Not enough endorsers for install :" + successful.size() + ".  " + first.getMessage());
            }
        }
        // client.setUserContext(sampleOrg.getUser(TEST_ADMIN_NAME));
        // final ChaincodeID chaincodeID = firstInstallProposalResponse.getChaincodeID();
        // Note installing chaincode does not require transaction no need to
        // send to Orderers
        // /////////////
        // // Instantiate chaincode.
        InstantiateProposalRequest instantiateProposalRequest = client.newInstantiationProposalRequest();
        instantiateProposalRequest.setProposalWaitTime(testConfig.getProposalWaitTime());
        instantiateProposalRequest.setChaincodeID(chaincodeID);
        instantiateProposalRequest.setChaincodeLanguage(CHAIN_CODE_LANG);
        instantiateProposalRequest.setFcn("init");
        instantiateProposalRequest.setArgs(new String[] { "a", "500", "b", "" + (200 + delta) });
        Map<String, byte[]> tm = new HashMap<>();
        tm.put("HyperLedgerFabric", "InstantiateProposalRequest:JavaSDK".getBytes(UTF_8));
        tm.put("method", "InstantiateProposalRequest".getBytes(UTF_8));
        instantiateProposalRequest.setTransientMap(tm);
        /*
              policy OR(Org1MSP.member, Org2MSP.member) meaning 1 signature from someone in either Org1 or Org2
              See README.md Chaincode endorsement policies section for more details.
            */
        ChaincodeEndorsementPolicy chaincodeEndorsementPolicy = new ChaincodeEndorsementPolicy();
        chaincodeEndorsementPolicy.fromYamlFile(new File(TEST_FIXTURES_PATH + "/sdkintegration/chaincodeendorsementpolicy.yaml"));
        instantiateProposalRequest.setChaincodeEndorsementPolicy(chaincodeEndorsementPolicy);
        out("Sending instantiateProposalRequest to all peers with arguments: a and b set to 100 and %s respectively", "" + (200 + delta));
        successful.clear();
        failed.clear();
        if (isFooChain) {
            // Send responses both ways with specifying peers and by using those on the channel.
            responses = channel.sendInstantiationProposal(instantiateProposalRequest, channel.getPeers());
        } else {
            responses = channel.sendInstantiationProposal(instantiateProposalRequest);
        }
        for (ProposalResponse response : responses) {
            if (response.isVerified() && response.getStatus() == ProposalResponse.Status.SUCCESS) {
                successful.add(response);
                out("Succesful instantiate proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName());
            } else {
                failed.add(response);
            }
        }
        out("Received %d instantiate proposal responses. Successful+verified: %d . Failed: %d", responses.size(), successful.size(), failed.size());
        if (failed.size() > 0) {
            for (ProposalResponse fail : failed) {
                out("Not enough endorsers for instantiate :" + successful.size() + "endorser failed with " + fail.getMessage() + ", on peer" + fail.getPeer());
            }
            ProposalResponse first = failed.iterator().next();
            fail("Not enough endorsers for instantiate :" + successful.size() + "endorser failed with " + first.getMessage() + ". Was verified:" + first.isVerified());
        }
        // /////////////
        // / Send instantiate transaction to orderer
        out("Sending instantiateTransaction to orderer with a and b set to 100 and %s respectively", "" + (200 + delta));
        // Specify what events should complete the interest in this transaction. This is the default
        // for all to complete. It's possible to specify many different combinations like
        // any from a group, all from one group and just one from another or even None(NOfEvents.createNoEvents).
        // See. Channel.NOfEvents
        Channel.NOfEvents nOfEvents = createNofEvents();
        if (!channel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).isEmpty()) {
            nOfEvents.addPeers(channel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)));
        }
        if (!channel.getEventHubs().isEmpty()) {
            nOfEvents.addEventHubs(channel.getEventHubs());
        }
        channel.sendTransaction(successful, // Basically the default options but shows it's usage.
        createTransactionOptions().userContext(// could be a different user context. this is the default.
        client.getUserContext()).shuffleOrders(// don't shuffle any orderers the default is true.
        false).orderers(// specify the orderers we want to try this transaction. Fails once all Orderers are tried.
        channel.getOrderers()).nOfEvents(// The events to signal the completion of the interest in the transaction
        nOfEvents)).thenApply(transactionEvent -> {
            waitOnFabric(0);
            // must be valid to be here.
            assertTrue(transactionEvent.isValid());
            // musth have a signature.
            assertNotNull(transactionEvent.getSignature());
            // This is the blockevent that has this transaction.
            BlockEvent blockEvent = transactionEvent.getBlockEvent();
            // Make sure the RAW Fabric block is returned.
            assertNotNull(blockEvent.getBlock());
            out("Finished instantiate transaction with transaction id %s", transactionEvent.getTransactionID());
            try {
                assertEquals(blockEvent.getChannelId(), channel.getName());
                successful.clear();
                failed.clear();
                client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
                // /////////////
                // / Send transaction proposal to all peers
                TransactionProposalRequest transactionProposalRequest = client.newTransactionProposalRequest();
                transactionProposalRequest.setChaincodeID(chaincodeID);
                transactionProposalRequest.setChaincodeLanguage(CHAIN_CODE_LANG);
                // transactionProposalRequest.setFcn("invoke");
                transactionProposalRequest.setFcn("move");
                transactionProposalRequest.setProposalWaitTime(testConfig.getProposalWaitTime());
                transactionProposalRequest.setArgs("a", "b", "100");
                Map<String, byte[]> tm2 = new HashMap<>();
                // Just some extra junk in transient map
                tm2.put("HyperLedgerFabric", "TransactionProposalRequest:JavaSDK".getBytes(UTF_8));
                // ditto
                tm2.put("method", "TransactionProposalRequest".getBytes(UTF_8));
                // This should be returned see chaincode why.
                tm2.put("result", ":)".getBytes(UTF_8));
                // This should trigger an event see chaincode why.
                tm2.put(EXPECTED_EVENT_NAME, EXPECTED_EVENT_DATA);
                transactionProposalRequest.setTransientMap(tm2);
                out("sending transactionProposal to all peers with arguments: move(a,b,100)");
                Collection<ProposalResponse> transactionPropResp = channel.sendTransactionProposal(transactionProposalRequest, channel.getPeers());
                for (ProposalResponse response : transactionPropResp) {
                    if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
                        out("Successful transaction proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName());
                        successful.add(response);
                    } else {
                        failed.add(response);
                    }
                }
                // Check that all the proposals are consistent with each other. We should have only one set
                // where all the proposals above are consistent. Note the when sending to Orderer this is done automatically.
                // Shown here as an example that applications can invoke and select.
                // See org.hyperledger.fabric.sdk.proposal.consistency_validation config property.
                Collection<Set<ProposalResponse>> proposalConsistencySets = SDKUtils.getProposalConsistencySets(transactionPropResp);
                if (proposalConsistencySets.size() != 1) {
                    fail(format("Expected only one set of consistent proposal responses but got %d", proposalConsistencySets.size()));
                }
                out("Received %d transaction proposal responses. Successful+verified: %d . Failed: %d", transactionPropResp.size(), successful.size(), failed.size());
                if (failed.size() > 0) {
                    ProposalResponse firstTransactionProposalResponse = failed.iterator().next();
                    fail("Not enough endorsers for invoke(move a,b,100):" + failed.size() + " endorser error: " + firstTransactionProposalResponse.getMessage() + ". Was verified: " + firstTransactionProposalResponse.isVerified());
                }
                out("Successfully received transaction proposal responses.");
                ProposalResponse resp = successful.iterator().next();
                // This is the data returned by the chaincode.
                byte[] x = resp.getChaincodeActionResponsePayload();
                String resultAsString = null;
                if (x != null) {
                    resultAsString = new String(x, "UTF-8");
                }
                assertEquals(":)", resultAsString);
                // Chaincode's status.
                assertEquals(200, resp.getChaincodeActionResponseStatus());
                TxReadWriteSetInfo readWriteSetInfo = resp.getChaincodeActionResponseReadWriteSetInfo();
                // See blockwalker below how to transverse this
                assertNotNull(readWriteSetInfo);
                assertTrue(readWriteSetInfo.getNsRwsetCount() > 0);
                ChaincodeID cid = resp.getChaincodeID();
                assertNotNull(cid);
                final String path = cid.getPath();
                if (null == CHAIN_CODE_PATH) {
                    assertTrue(path == null || "".equals(path));
                } else {
                    assertEquals(CHAIN_CODE_PATH, path);
                }
                assertEquals(CHAIN_CODE_NAME, cid.getName());
                assertEquals(CHAIN_CODE_VERSION, cid.getVersion());
                // //////////////////////////
                // Send Transaction Transaction to orderer
                out("Sending chaincode transaction(move a,b,100) to orderer.");
                return channel.sendTransaction(successful).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS);
            } catch (Exception e) {
                out("Caught an exception while invoking chaincode");
                e.printStackTrace();
                fail("Failed invoking chaincode with error : " + e.getMessage());
            }
            return null;
        }).thenApply(transactionEvent -> {
            try {
                waitOnFabric(0);
                // must be valid to be here.
                assertTrue(transactionEvent.isValid());
                out("Finished transaction with transaction id %s", transactionEvent.getTransactionID());
                // used in the channel queries later
                testTxID = transactionEvent.getTransactionID();
                // //////////////////////////
                // Send Query Proposal to all peers
                // 
                String expect = "" + (300 + delta);
                out("Now query chaincode for the value of b.");
                QueryByChaincodeRequest queryByChaincodeRequest = client.newQueryProposalRequest();
                queryByChaincodeRequest.setArgs(new String[] { "b" });
                queryByChaincodeRequest.setFcn("query");
                queryByChaincodeRequest.setChaincodeID(chaincodeID);
                Map<String, byte[]> tm2 = new HashMap<>();
                tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8));
                tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8));
                queryByChaincodeRequest.setTransientMap(tm2);
                Collection<ProposalResponse> queryProposals = channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers());
                for (ProposalResponse proposalResponse : queryProposals) {
                    if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ProposalResponse.Status.SUCCESS) {
                        fail("Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " + proposalResponse.getStatus() + ". Messages: " + proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified());
                    } else {
                        String payload = proposalResponse.getProposalResponse().getResponse().getPayload().toStringUtf8();
                        out("Query payload of b from peer %s returned %s", proposalResponse.getPeer().getName(), payload);
                        assertEquals(payload, expect);
                    }
                }
                return null;
            } catch (Exception e) {
                out("Caught exception while running query");
                e.printStackTrace();
                fail("Failed during chaincode query with error : " + e.getMessage());
            }
            return null;
        }).exceptionally(e -> {
            if (e instanceof TransactionEventException) {
                BlockEvent.TransactionEvent te = ((TransactionEventException) e).getTransactionEvent();
                if (te != null) {
                    throw new AssertionError(format("Transaction with txid %s failed. %s", te.getTransactionID(), e.getMessage()), e);
                }
            }
            throw new AssertionError(format("Test failed with %s exception %s", e.getClass().getName(), e.getMessage()), e);
        }).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS);
        // Channel queries
        // We can only send channel queries to peers that are in the same org as the SDK user context
        // Get the peers from the current org being used and pick one randomly to send the queries to.
        // Set<Peer> peerSet = sampleOrg.getPeers();
        // Peer queryPeer = peerSet.iterator().next();
        // out("Using peer %s for channel queries", queryPeer.getName());
        BlockchainInfo channelInfo = channel.queryBlockchainInfo();
        out("Channel info for : " + channelName);
        out("Channel height: " + channelInfo.getHeight());
        String chainCurrentHash = Hex.encodeHexString(channelInfo.getCurrentBlockHash());
        String chainPreviousHash = Hex.encodeHexString(channelInfo.getPreviousBlockHash());
        out("Chain current block hash: " + chainCurrentHash);
        out("Chainl previous block hash: " + chainPreviousHash);
        // Query by block number. Should return latest block, i.e. block number 2
        BlockInfo returnedBlock = channel.queryBlockByNumber(channelInfo.getHeight() - 1);
        String previousHash = Hex.encodeHexString(returnedBlock.getPreviousHash());
        out("queryBlockByNumber returned correct block with blockNumber " + returnedBlock.getBlockNumber() + " \n previous_hash " + previousHash);
        assertEquals(channelInfo.getHeight() - 1, returnedBlock.getBlockNumber());
        assertEquals(chainPreviousHash, previousHash);
        // Query by block hash. Using latest block's previous hash so should return block number 1
        byte[] hashQuery = returnedBlock.getPreviousHash();
        returnedBlock = channel.queryBlockByHash(hashQuery);
        out("queryBlockByHash returned block with blockNumber " + returnedBlock.getBlockNumber());
        assertEquals(channelInfo.getHeight() - 2, returnedBlock.getBlockNumber());
        // Query block by TxID. Since it's the last TxID, should be block 2
        returnedBlock = channel.queryBlockByTransactionID(testTxID);
        out("queryBlockByTxID returned block with blockNumber " + returnedBlock.getBlockNumber());
        assertEquals(channelInfo.getHeight() - 1, returnedBlock.getBlockNumber());
        // query transaction by ID
        TransactionInfo txInfo = channel.queryTransactionByID(testTxID);
        out("QueryTransactionByID returned TransactionInfo: txID " + txInfo.getTransactionID() + "\n     validation code " + txInfo.getValidationCode().getNumber());
        if (chaincodeEventListenerHandle != null) {
            channel.unregisterChaincodeEventListener(chaincodeEventListenerHandle);
            // Should be two. One event in chaincode and two notification for each of the two event hubs
            final int numberEventsExpected = channel.getEventHubs().size() + channel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).size();
            // just make sure we get the notifications.
            for (int i = 15; i > 0; --i) {
                if (chaincodeEvents.size() == numberEventsExpected) {
                    break;
                } else {
                    // wait for the events.
                    Thread.sleep(90);
                }
            }
            assertEquals(numberEventsExpected, chaincodeEvents.size());
            for (ChaincodeEventCapture chaincodeEventCapture : chaincodeEvents) {
                assertEquals(chaincodeEventListenerHandle, chaincodeEventCapture.handle);
                assertEquals(testTxID, chaincodeEventCapture.chaincodeEvent.getTxId());
                assertEquals(EXPECTED_EVENT_NAME, chaincodeEventCapture.chaincodeEvent.getEventName());
                assertTrue(Arrays.equals(EXPECTED_EVENT_DATA, chaincodeEventCapture.chaincodeEvent.getPayload()));
                assertEquals(CHAIN_CODE_NAME, chaincodeEventCapture.chaincodeEvent.getChaincodeId());
                BlockEvent blockEvent = chaincodeEventCapture.blockEvent;
                assertEquals(channelName, blockEvent.getChannelId());
            // assertTrue(channel.getEventHubs().contains(blockEvent.getEventHub()));
            }
        } else {
            assertTrue(chaincodeEvents.isEmpty());
        }
        out("Running for Channel %s done", channelName);
    } catch (Exception e) {
        out("Caught an exception running channel %s", channel.getName());
        e.printStackTrace();
        fail("Test failed with error : " + e.getMessage());
    }
}
Also used : Arrays(java.util.Arrays) InvalidProtocolBufferRuntimeException(org.hyperledger.fabric.sdk.exception.InvalidProtocolBufferRuntimeException) InstantiateProposalRequest(org.hyperledger.fabric.sdk.InstantiateProposalRequest) TxReadWriteSetInfo(org.hyperledger.fabric.sdk.TxReadWriteSetInfo) Vector(java.util.Vector) BlockInfo(org.hyperledger.fabric.sdk.BlockInfo) Type(org.hyperledger.fabric.sdk.TransactionRequest.Type) Map(java.util.Map) TestConfigHelper(org.hyperledger.fabric.sdk.TestConfigHelper) Assert.fail(org.junit.Assert.fail) EnumSet(java.util.EnumSet) ChannelConfiguration(org.hyperledger.fabric.sdk.ChannelConfiguration) Orderer(org.hyperledger.fabric.sdk.Orderer) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) TestConfig(org.hyperledger.fabric.sdk.testutils.TestConfig) Collection(java.util.Collection) ProposalException(org.hyperledger.fabric.sdk.exception.ProposalException) Channel(org.hyperledger.fabric.sdk.Channel) Set(java.util.Set) String.format(java.lang.String.format) EnrollmentRequest(org.hyperledger.fabric_ca.sdk.EnrollmentRequest) PrivateKey(java.security.PrivateKey) Enrollment(org.hyperledger.fabric.sdk.Enrollment) Peer(org.hyperledger.fabric.sdk.Peer) Assert.assertFalse(org.junit.Assert.assertFalse) Pattern(java.util.regex.Pattern) ChaincodeEvent(org.hyperledger.fabric.sdk.ChaincodeEvent) ChaincodeID(org.hyperledger.fabric.sdk.ChaincodeID) EventHub(org.hyperledger.fabric.sdk.EventHub) HFClient(org.hyperledger.fabric.sdk.HFClient) PeerRole(org.hyperledger.fabric.sdk.Peer.PeerRole) NOfEvents.createNofEvents(org.hyperledger.fabric.sdk.Channel.NOfEvents.createNofEvents) HashMap(java.util.HashMap) Hex(org.apache.commons.codec.binary.Hex) QueryByChaincodeRequest(org.hyperledger.fabric.sdk.QueryByChaincodeRequest) TransactionOptions.createTransactionOptions(org.hyperledger.fabric.sdk.Channel.TransactionOptions.createTransactionOptions) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) BlockchainInfo(org.hyperledger.fabric.sdk.BlockchainInfo) BlockEvent(org.hyperledger.fabric.sdk.BlockEvent) LinkedList(java.util.LinkedList) SDKUtils(org.hyperledger.fabric.sdk.SDKUtils) HFCAClient(org.hyperledger.fabric_ca.sdk.HFCAClient) Before(org.junit.Before) InstallProposalRequest(org.hyperledger.fabric.sdk.InstallProposalRequest) HFCAInfo(org.hyperledger.fabric_ca.sdk.HFCAInfo) Properties(java.util.Properties) ChaincodeEndorsementPolicy(org.hyperledger.fabric.sdk.ChaincodeEndorsementPolicy) ProposalResponse(org.hyperledger.fabric.sdk.ProposalResponse) MalformedURLException(java.net.MalformedURLException) UTF_8(java.nio.charset.StandardCharsets.UTF_8) Assert.assertNotNull(org.junit.Assert.assertNotNull) StringWriter(java.io.StringWriter) TransactionInfo(org.hyperledger.fabric.sdk.TransactionInfo) RegistrationRequest(org.hyperledger.fabric_ca.sdk.RegistrationRequest) Assert.assertTrue(org.junit.Assert.assertTrue) IOException(java.io.IOException) Test(org.junit.Test) PeerOptions.createPeerOptions(org.hyperledger.fabric.sdk.Channel.PeerOptions.createPeerOptions) File(java.io.File) KvRwset(org.hyperledger.fabric.protos.ledger.rwset.kvrwset.KvRwset) TimeUnit(java.util.concurrent.TimeUnit) CryptoSuite(org.hyperledger.fabric.sdk.security.CryptoSuite) Assert.assertNull(org.junit.Assert.assertNull) PEMWriter(org.bouncycastle.openssl.PEMWriter) Paths(java.nio.file.Paths) TestUtils.resetConfig(org.hyperledger.fabric.sdk.testutils.TestUtils.resetConfig) TRANSACTION_ENVELOPE(org.hyperledger.fabric.sdk.BlockInfo.EnvelopeType.TRANSACTION_ENVELOPE) Assert.assertEquals(org.junit.Assert.assertEquals) TransactionProposalRequest(org.hyperledger.fabric.sdk.TransactionProposalRequest) HashMap(java.util.HashMap) ChaincodeID(org.hyperledger.fabric.sdk.ChaincodeID) InstantiateProposalRequest(org.hyperledger.fabric.sdk.InstantiateProposalRequest) BlockInfo(org.hyperledger.fabric.sdk.BlockInfo) TransactionInfo(org.hyperledger.fabric.sdk.TransactionInfo) Vector(java.util.Vector) Orderer(org.hyperledger.fabric.sdk.Orderer) ChaincodeEndorsementPolicy(org.hyperledger.fabric.sdk.ChaincodeEndorsementPolicy) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) Peer(org.hyperledger.fabric.sdk.Peer) Channel(org.hyperledger.fabric.sdk.Channel) BlockchainInfo(org.hyperledger.fabric.sdk.BlockchainInfo) LinkedList(java.util.LinkedList) InvalidProtocolBufferRuntimeException(org.hyperledger.fabric.sdk.exception.InvalidProtocolBufferRuntimeException) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) ProposalException(org.hyperledger.fabric.sdk.exception.ProposalException) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) TransactionProposalRequest(org.hyperledger.fabric.sdk.TransactionProposalRequest) InstallProposalRequest(org.hyperledger.fabric.sdk.InstallProposalRequest) QueryByChaincodeRequest(org.hyperledger.fabric.sdk.QueryByChaincodeRequest) TxReadWriteSetInfo(org.hyperledger.fabric.sdk.TxReadWriteSetInfo) Collection(java.util.Collection) ChaincodeEvent(org.hyperledger.fabric.sdk.ChaincodeEvent) ProposalResponse(org.hyperledger.fabric.sdk.ProposalResponse) File(java.io.File) Map(java.util.Map) HashMap(java.util.HashMap) BlockEvent(org.hyperledger.fabric.sdk.BlockEvent)

Example 2 with EventHub

use of org.hyperledger.fabric.sdk.EventHub in project fabric-sdk-java by hyperledger.

the class End2endIT method constructChannel.

Channel constructChannel(String name, HFClient client, SampleOrg sampleOrg) throws Exception {
    // //////////////////////////
    // Construct the channel
    // 
    out("Constructing channel %s", name);
    // boolean doPeerEventing = false;
    boolean doPeerEventing = !testConfig.isRunningAgainstFabric10() && BAR_CHANNEL_NAME.equals(name);
    // boolean doPeerEventing = !testConfig.isRunningAgainstFabric10() && FOO_CHANNEL_NAME.equals(name);
    // Only peer Admin org
    client.setUserContext(sampleOrg.getPeerAdmin());
    Collection<Orderer> orderers = new LinkedList<>();
    for (String orderName : sampleOrg.getOrdererNames()) {
        Properties ordererProperties = testConfig.getOrdererProperties(orderName);
        // example of setting keepAlive to avoid timeouts on inactive http2 connections.
        // Under 5 minutes would require changes to server side to accept faster ping rates.
        ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTime", new Object[] { 5L, TimeUnit.MINUTES });
        ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTimeout", new Object[] { 8L, TimeUnit.SECONDS });
        ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveWithoutCalls", new Object[] { true });
        if (!clientTLSProperties.isEmpty()) {
            ordererProperties.putAll(clientTLSProperties.get(sampleOrg.getName()));
        }
        orderers.add(client.newOrderer(orderName, sampleOrg.getOrdererLocation(orderName), ordererProperties));
    }
    // Just pick the first orderer in the list to create the channel.
    Orderer anOrderer = orderers.iterator().next();
    orderers.remove(anOrderer);
    ChannelConfiguration channelConfiguration = new ChannelConfiguration(new File(TEST_FIXTURES_PATH + "/sdkintegration/e2e-2Orgs/" + TestConfig.FAB_CONFIG_GEN_VERS + "/" + name + ".tx"));
    // Create channel that has only one signer that is this orgs peer admin. If channel creation policy needed more signature they would need to be added too.
    Channel newChannel = client.newChannel(name, anOrderer, channelConfiguration, client.getChannelConfigurationSignature(channelConfiguration, sampleOrg.getPeerAdmin()));
    out("Created channel %s", name);
    // test with both cases when doing peer eventing.
    boolean everyother = true;
    for (String peerName : sampleOrg.getPeerNames()) {
        String peerLocation = sampleOrg.getPeerLocation(peerName);
        // test properties for peer.. if any.
        Properties peerProperties = testConfig.getPeerProperties(peerName);
        if (peerProperties == null) {
            peerProperties = new Properties();
        }
        if (!clientTLSProperties.isEmpty()) {
            peerProperties.putAll(clientTLSProperties.get(sampleOrg.getName()));
        }
        // Example of setting specific options on grpc's NettyChannelBuilder
        peerProperties.put("grpc.NettyChannelBuilderOption.maxInboundMessageSize", 9000000);
        Peer peer = client.newPeer(peerName, peerLocation, peerProperties);
        if (doPeerEventing && everyother) {
            // Default is all roles.
            newChannel.joinPeer(peer, createPeerOptions());
        } else {
            // Set peer to not be all roles but eventing.
            newChannel.joinPeer(peer, createPeerOptions().setPeerRoles(PeerRole.NO_EVENT_SOURCE));
        }
        out("Peer %s joined channel %s", peerName, name);
        everyother = !everyother;
    }
    // just for testing ...
    if (doPeerEventing) {
        // Make sure there is one of each type peer at the very least.
        assertFalse(newChannel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).isEmpty());
        assertFalse(newChannel.getPeers(PeerRole.NO_EVENT_SOURCE).isEmpty());
    }
    for (Orderer orderer : orderers) {
        // add remaining orderers if any.
        newChannel.addOrderer(orderer);
    }
    for (String eventHubName : sampleOrg.getEventHubNames()) {
        final Properties eventHubProperties = testConfig.getEventHubProperties(eventHubName);
        eventHubProperties.put("grpc.NettyChannelBuilderOption.keepAliveTime", new Object[] { 5L, TimeUnit.MINUTES });
        eventHubProperties.put("grpc.NettyChannelBuilderOption.keepAliveTimeout", new Object[] { 8L, TimeUnit.SECONDS });
        if (!clientTLSProperties.isEmpty()) {
            eventHubProperties.putAll(clientTLSProperties.get(sampleOrg.getName()));
        }
        EventHub eventHub = client.newEventHub(eventHubName, sampleOrg.getEventHubLocation(eventHubName), eventHubProperties);
        newChannel.addEventHub(eventHub);
    }
    newChannel.initialize();
    out("Finished initialization channel %s", name);
    // Just checks if channel can be serialized and deserialized .. otherwise this is just a waste :)
    byte[] serializedChannelBytes = newChannel.serializeChannel();
    newChannel.shutdown(true);
    return client.deSerializeChannel(serializedChannelBytes).initialize();
}
Also used : EventHub(org.hyperledger.fabric.sdk.EventHub) Channel(org.hyperledger.fabric.sdk.Channel) Peer(org.hyperledger.fabric.sdk.Peer) ChannelConfiguration(org.hyperledger.fabric.sdk.ChannelConfiguration) Properties(java.util.Properties) File(java.io.File) Orderer(org.hyperledger.fabric.sdk.Orderer) LinkedList(java.util.LinkedList)

Example 3 with EventHub

use of org.hyperledger.fabric.sdk.EventHub in project fabric-sdk-java by hyperledger.

the class UpdateChannelIT method reconstructChannel.

private Channel reconstructChannel(String name, HFClient client, SampleOrg sampleOrg) throws Exception {
    client.setUserContext(sampleOrg.getPeerAdmin());
    Channel newChannel = client.newChannel(name);
    for (String orderName : sampleOrg.getOrdererNames()) {
        newChannel.addOrderer(client.newOrderer(orderName, sampleOrg.getOrdererLocation(orderName), testConfig.getOrdererProperties(orderName)));
    }
    for (String peerName : sampleOrg.getPeerNames()) {
        String peerLocation = sampleOrg.getPeerLocation(peerName);
        Peer peer = client.newPeer(peerName, peerLocation, testConfig.getPeerProperties(peerName));
        // Query the actual peer for which channels it belongs to and check it belongs to this channel
        Set<String> channels = client.queryChannels(peer);
        if (!channels.contains(name)) {
            throw new AssertionError(format("Peer %s does not appear to belong to channel %s", peerName, name));
        }
        newChannel.addPeer(peer, createPeerOptions().setPeerRoles(EnumSet.of(Peer.PeerRole.CHAINCODE_QUERY, Peer.PeerRole.ENDORSING_PEER, Peer.PeerRole.LEDGER_QUERY)));
    }
    for (String eventHubName : sampleOrg.getEventHubNames()) {
        EventHub eventHub = client.newEventHub(eventHubName, sampleOrg.getEventHubLocation(eventHubName), testConfig.getEventHubProperties(eventHubName));
        newChannel.addEventHub(eventHub);
    }
    newChannel.initialize();
    return newChannel;
}
Also used : EventHub(org.hyperledger.fabric.sdk.EventHub) Channel(org.hyperledger.fabric.sdk.Channel) Peer(org.hyperledger.fabric.sdk.Peer)

Example 4 with EventHub

use of org.hyperledger.fabric.sdk.EventHub in project fabric-sdk-java by hyperledger.

the class End2endAndBackAgainIT method reconstructChannel.

private Channel reconstructChannel(String name, HFClient client, SampleOrg sampleOrg) throws Exception {
    out("Reconstructing %s channel", name);
    client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
    Channel newChannel;
    if (BAR_CHANNEL_NAME.equals(name)) {
        // bar channel was stored in samplestore in End2endIT testcase.
        /**
         *  sampleStore.getChannel uses {@link HFClient#deSerializeChannel(byte[])}
         */
        newChannel = sampleStore.getChannel(client, name);
        if (!IS_FABRIC_V10) {
            // Make sure there is one of each type peer at the very least. see End2end for how peers were constructed.
            assertFalse(newChannel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).isEmpty());
            assertFalse(newChannel.getPeers(PeerRole.NO_EVENT_SOURCE).isEmpty());
        }
        assertEquals(2, newChannel.getEventHubs().size());
        out("Retrieved channel %s from sample store.", name);
    } else {
        // foo channel do manual reconstruction.
        Properties clientTLSProperties = new Properties();
        final String clientPEMTLSCertificate = sampleStore.getClientPEMTLSCertificate(sampleOrg);
        if (clientPEMTLSCertificate != null) {
            clientTLSProperties.put("clientCertBytes", clientPEMTLSCertificate.getBytes(UTF_8));
        }
        final String clientPEMTLSKey = sampleStore.getClientPEMTLSKey(sampleOrg);
        if (clientPEMTLSKey != null) {
            clientTLSProperties.put("clientKeyBytes", clientPEMTLSKey.getBytes(UTF_8));
        }
        newChannel = client.newChannel(name);
        for (String ordererName : sampleOrg.getOrdererNames()) {
            Properties ordererProperties = (Properties) clientTLSProperties.clone();
            ordererProperties.putAll(testConfig.getOrdererProperties(ordererName));
            newChannel.addOrderer(client.newOrderer(ordererName, sampleOrg.getOrdererLocation(ordererName), ordererProperties));
        }
        boolean everyOther = false;
        for (String peerName : sampleOrg.getPeerNames()) {
            String peerLocation = sampleOrg.getPeerLocation(peerName);
            Properties peerProperties = testConfig.getPeerProperties(peerName);
            peerProperties.putAll(clientTLSProperties);
            Peer peer = client.newPeer(peerName, peerLocation, peerProperties);
            final // we have two peers on one use block on other use filtered
            PeerOptions peerEventingOptions = everyOther ? createPeerOptions().registerEventsForBlocks() : createPeerOptions().registerEventsForFilteredBlocks();
            newChannel.addPeer(peer, IS_FABRIC_V10 ? createPeerOptions().setPeerRoles(PeerRole.NO_EVENT_SOURCE) : peerEventingOptions);
            everyOther = !everyOther;
        }
        // For testing mix it up. For v1.1 use just peer eventing service for foo channel.
        if (IS_FABRIC_V10) {
            // Should have no peers with event sources.
            assertTrue(newChannel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).isEmpty());
            // Should have two peers with all roles but event source.
            assertEquals(2, newChannel.getPeers(PeerRole.NO_EVENT_SOURCE).size());
            for (String eventHubName : sampleOrg.getEventHubNames()) {
                Properties eventhubProperties = (Properties) clientTLSProperties.clone();
                eventhubProperties.putAll(testConfig.getEventHubProperties(eventHubName));
                EventHub eventHub = client.newEventHub(eventHubName, sampleOrg.getEventHubLocation(eventHubName), eventhubProperties);
                newChannel.addEventHub(eventHub);
            }
        } else {
            // Peers should have all roles. Do some sanity checks that they do.
            // Should have two peers with event sources.
            assertEquals(2, newChannel.getPeers(EnumSet.of(PeerRole.EVENT_SOURCE)).size());
            // Check some other roles too..
            assertEquals(2, newChannel.getPeers(EnumSet.of(PeerRole.CHAINCODE_QUERY, PeerRole.LEDGER_QUERY)).size());
            // really same as newChannel.getPeers()
            assertEquals(2, newChannel.getPeers(PeerRole.ALL).size());
        }
        assertEquals(IS_FABRIC_V10 ? sampleOrg.getEventHubNames().size() : 0, newChannel.getEventHubs().size());
    }
    // Just some sanity check tests
    assertTrue(newChannel == client.getChannel(name));
    assertTrue(client == TestUtils.getField(newChannel, "client"));
    assertEquals(name, newChannel.getName());
    assertEquals(2, newChannel.getPeers().size());
    assertEquals(1, newChannel.getOrderers().size());
    assertFalse(newChannel.isShutdown());
    assertFalse(newChannel.isInitialized());
    byte[] serializedChannelBytes = newChannel.serializeChannel();
    // Just checks if channel can be serialized and deserialized .. otherwise this is just a waste :)
    // Get channel back.
    newChannel.shutdown(true);
    newChannel = client.deSerializeChannel(serializedChannelBytes);
    assertEquals(2, newChannel.getPeers().size());
    assertEquals(1, newChannel.getOrderers().size());
    assertNotNull(client.getChannel(name));
    assertEquals(newChannel, client.getChannel(name));
    assertFalse(newChannel.isInitialized());
    assertFalse(newChannel.isShutdown());
    assertEquals(TESTUSER_1_NAME, client.getUserContext().getName());
    newChannel.initialize();
    assertTrue(newChannel.isInitialized());
    assertFalse(newChannel.isShutdown());
    // Query the actual peer for which channels it belongs to and check it belongs to this channel
    for (Peer peer : newChannel.getPeers()) {
        Set<String> channels = client.queryChannels(peer);
        if (!channels.contains(name)) {
            throw new AssertionError(format("Peer %s does not appear to belong to channel %s", peer.getName(), name));
        }
    }
    // Just see if we can get channelConfiguration. Not required for the rest of scenario but should work.
    final byte[] channelConfigurationBytes = newChannel.getChannelConfigurationBytes();
    Configtx.Config channelConfig = Configtx.Config.parseFrom(channelConfigurationBytes);
    assertNotNull(channelConfig);
    Configtx.ConfigGroup channelGroup = channelConfig.getChannelGroup();
    assertNotNull(channelGroup);
    Map<String, Configtx.ConfigGroup> groupsMap = channelGroup.getGroupsMap();
    assertNotNull(groupsMap.get("Orderer"));
    assertNotNull(groupsMap.get("Application"));
    // Before return lets see if we have the chaincode on the peers that we expect from End2endIT
    // And if they were instantiated too. this requires peer admin user
    client.setUserContext(sampleOrg.getPeerAdmin());
    for (Peer peer : newChannel.getPeers()) {
        if (!checkInstalledChaincode(client, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION)) {
            throw new AssertionError(format("Peer %s is missing chaincode name: %s, path:%s, version: %s", peer.getName(), CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_PATH));
        }
        if (!checkInstantiatedChaincode(newChannel, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION)) {
            throw new AssertionError(format("Peer %s is missing instantiated chaincode name: %s, path:%s, version: %s", peer.getName(), CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_PATH));
        }
    }
    client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
    assertTrue(newChannel.isInitialized());
    assertFalse(newChannel.isShutdown());
    out("Finished reconstructing channel %s.", name);
    return newChannel;
}
Also used : Configtx(org.hyperledger.fabric.protos.common.Configtx) Channel(org.hyperledger.fabric.sdk.Channel) Peer(org.hyperledger.fabric.sdk.Peer) Properties(java.util.Properties) EventHub(org.hyperledger.fabric.sdk.EventHub)

Aggregations

Channel (org.hyperledger.fabric.sdk.Channel)4 EventHub (org.hyperledger.fabric.sdk.EventHub)4 Peer (org.hyperledger.fabric.sdk.Peer)4 Properties (java.util.Properties)3 File (java.io.File)2 LinkedList (java.util.LinkedList)2 ChannelConfiguration (org.hyperledger.fabric.sdk.ChannelConfiguration)2 Orderer (org.hyperledger.fabric.sdk.Orderer)2 IOException (java.io.IOException)1 StringWriter (java.io.StringWriter)1 String.format (java.lang.String.format)1 MalformedURLException (java.net.MalformedURLException)1 UTF_8 (java.nio.charset.StandardCharsets.UTF_8)1 Paths (java.nio.file.Paths)1 PrivateKey (java.security.PrivateKey)1 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1 EnumSet (java.util.EnumSet)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1