use of org.hyperledger.fabric.sdk.HFClient 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());
}
}
use of org.hyperledger.fabric.sdk.HFClient in project fabric-sdk-java by hyperledger.
the class End2endAndBackAgainIT method runFabricTest.
public void runFabricTest(final SampleStore sampleStore) throws Exception {
// //////////////////////////
// Setup client
// Create instance of client.
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
// //////////////////////////
// Reconstruct and run the channels
SampleOrg sampleOrg = testConfig.getIntegrationTestsSampleOrg("peerOrg1");
Channel fooChannel = reconstructChannel(FOO_CHANNEL_NAME, client, sampleOrg);
runChannel(client, fooChannel, sampleOrg, 0);
assertFalse(fooChannel.isShutdown());
assertTrue(fooChannel.isInitialized());
// clean up resources no longer needed.
fooChannel.shutdown(true);
assertTrue(fooChannel.isShutdown());
out("\n");
sampleOrg = testConfig.getIntegrationTestsSampleOrg("peerOrg2");
Channel barChannel = reconstructChannel(BAR_CHANNEL_NAME, client, sampleOrg);
// run a newly constructed foo channel with different b value!
runChannel(client, barChannel, sampleOrg, 100);
assertFalse(barChannel.isShutdown());
assertTrue(barChannel.isInitialized());
if (!testConfig.isRunningAgainstFabric10()) {
// Peer eventing service support started with v1.1
// Now test replay feature of V1.1 peer eventing services.
byte[] replayChannelBytes = barChannel.serializeChannel();
barChannel.shutdown(true);
Channel replayChannel = client.deSerializeChannel(replayChannelBytes);
out("doing testPeerServiceEventingReplay,0,-1,false");
testPeerServiceEventingReplay(client, replayChannel, 0L, -1L, false);
replayChannel = client.deSerializeChannel(replayChannelBytes);
// block 0 is import to test
out("doing testPeerServiceEventingReplay,0,-1,true");
testPeerServiceEventingReplay(client, replayChannel, 0L, -1L, true);
// Now do it again starting at block 1
replayChannel = client.deSerializeChannel(replayChannelBytes);
out("doing testPeerServiceEventingReplay,1,-1,false");
testPeerServiceEventingReplay(client, replayChannel, 1L, -1L, false);
// Now do it again starting at block 2 to 3
replayChannel = client.deSerializeChannel(replayChannelBytes);
out("doing testPeerServiceEventingReplay,2,3,false");
testPeerServiceEventingReplay(client, replayChannel, 2L, 3L, false);
}
out("That's all folks!");
}
use of org.hyperledger.fabric.sdk.HFClient in project fabric-sdk-java by hyperledger.
the class UpdateChannelIT method setup.
@Test
public void setup() {
try {
// //////////////////////////
// Setup client
// Create instance of client.
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
// //////////////////////////
// Set up USERS
// Persistence is not part of SDK. Sample file store is for demonstration purposes only!
// MUST be replaced with more robust application implementation (Database, LDAP)
File sampleStoreFile = new File(System.getProperty("java.io.tmpdir") + "/HFCSampletest.properties");
sampleStoreFile.deleteOnExit();
final SampleStore sampleStore = new SampleStore(sampleStoreFile);
for (SampleOrg sampleOrg : testSampleOrgs) {
final String orgName = sampleOrg.getName();
sampleOrg.setPeerAdmin(sampleStore.getMember(orgName + "Admin", orgName));
}
// //////////////////////////
// Reconstruct and run the channels
SampleOrg sampleOrg = testConfig.getIntegrationTestsSampleOrg("peerOrg1");
Channel fooChannel = reconstructChannel(FOO_CHANNEL_NAME, client, sampleOrg);
// Getting foo channels current configuration bytes.
final byte[] channelConfigurationBytes = fooChannel.getChannelConfigurationBytes();
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(CONFIGTXLATOR_LOCATION + "/protolator/decode/common.Config");
httppost.setEntity(new ByteArrayEntity(channelConfigurationBytes));
HttpResponse response = httpclient.execute(httppost);
int statuscode = response.getStatusLine().getStatusCode();
out("Got %s status for decoding current channel config bytes", statuscode);
assertEquals(200, statuscode);
String responseAsString = EntityUtils.toString(response.getEntity());
if (!responseAsString.contains(ORIGINAL_BATCH_TIMEOUT)) {
fail(format("Did not find expected batch timeout '%s', in:%s", ORIGINAL_BATCH_TIMEOUT, responseAsString));
}
// Now modify the batch timeout
String updateString = responseAsString.replace(ORIGINAL_BATCH_TIMEOUT, UPDATED_BATCH_TIMEOUT);
httppost = new HttpPost(CONFIGTXLATOR_LOCATION + "/protolator/encode/common.Config");
httppost.setEntity(new StringEntity(updateString));
response = httpclient.execute(httppost);
statuscode = response.getStatusLine().getStatusCode();
out("Got %s status for encoding the new desired channel config bytes", statuscode);
assertEquals(200, statuscode);
byte[] newConfigBytes = EntityUtils.toByteArray(response.getEntity());
// Now send to configtxlator multipart form post with original config bytes, updated config bytes and channel name.
httppost = new HttpPost(CONFIGTXLATOR_LOCATION + "/configtxlator/compute/update-from-configs");
HttpEntity multipartEntity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addBinaryBody("original", channelConfigurationBytes, ContentType.APPLICATION_OCTET_STREAM, "originalFakeFilename").addBinaryBody("updated", newConfigBytes, ContentType.APPLICATION_OCTET_STREAM, "updatedFakeFilename").addBinaryBody("channel", fooChannel.getName().getBytes()).build();
httppost.setEntity(multipartEntity);
response = httpclient.execute(httppost);
statuscode = response.getStatusLine().getStatusCode();
out("Got %s status for updated config bytes needed for updateChannelConfiguration ", statuscode);
assertEquals(200, statuscode);
byte[] updateBytes = EntityUtils.toByteArray(response.getEntity());
UpdateChannelConfiguration updateChannelConfiguration = new UpdateChannelConfiguration(updateBytes);
// To change the channel we need to sign with orderer admin certs which crypto gen stores:
// private key: src/test/fixture/sdkintegration/e2e-2Orgs/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/f1a9a940f57419a18a83a852884790d59b378281347dd3d4a88c2b820a0f70c9_sk
// certificate: src/test/fixture/sdkintegration/e2e-2Orgs/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem
final String sampleOrgName = sampleOrg.getName();
final SampleUser ordererAdmin = sampleStore.getMember(sampleOrgName + "OrderAdmin", sampleOrgName, "OrdererMSP", Util.findFileSk(Paths.get("src/test/fixture/sdkintegration/e2e-2Orgs/" + TestConfig.FAB_CONFIG_GEN_VERS + "/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/").toFile()), Paths.get("src/test/fixture/sdkintegration/e2e-2Orgs/" + TestConfig.FAB_CONFIG_GEN_VERS + "/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem").toFile());
client.setUserContext(ordererAdmin);
// Ok now do actual channel update.
fooChannel.updateChannelConfiguration(updateChannelConfiguration, client.getUpdateChannelConfigurationSignature(updateChannelConfiguration, ordererAdmin));
// Let's add some additional verification...
client.setUserContext(sampleOrg.getPeerAdmin());
final byte[] modChannelBytes = fooChannel.getChannelConfigurationBytes();
// Now decode the new channel config bytes to json...
httppost = new HttpPost(CONFIGTXLATOR_LOCATION + "/protolator/decode/common.Config");
httppost.setEntity(new ByteArrayEntity(modChannelBytes));
response = httpclient.execute(httppost);
statuscode = response.getStatusLine().getStatusCode();
assertEquals(200, statuscode);
responseAsString = EntityUtils.toString(response.getEntity());
if (!responseAsString.contains(UPDATED_BATCH_TIMEOUT)) {
// If it doesn't have the updated time out it failed.
fail(format("Did not find updated expected batch timeout '%s', in:%s", UPDATED_BATCH_TIMEOUT, responseAsString));
}
if (responseAsString.contains(ORIGINAL_BATCH_TIMEOUT)) {
// Should not have been there anymore!
fail(format("Found original batch timeout '%s', when it was not expected in:%s", ORIGINAL_BATCH_TIMEOUT, responseAsString));
}
out("\n");
out("That's all folks!");
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
use of org.hyperledger.fabric.sdk.HFClient in project fabric-sdk-java by hyperledger.
the class End2endAndBackAgainIT method runChannel.
// Disable MethodLength as this method is for instructional purposes and hence
// we don't want to split it into smaller pieces
// CHECKSTYLE:OFF: MethodLength
void runChannel(HFClient client, Channel channel, SampleOrg sampleOrg, final int delta) {
final String channelName = channel.getName();
try {
client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
// final boolean changeContext = false; // BAR_CHANNEL_NAME.equals(channel.getName()) ? true : false;
final boolean changeContext = BAR_CHANNEL_NAME.equals(channel.getName());
out("Running Channel %s with a delta %d", channelName, delta);
out("ChaincodeID: ", chaincodeID);
// //////////////////////////
// Send Query Proposal to all peers see if it's what we expect from end of End2endIT
//
queryChaincodeForExpectedValue(client, channel, "" + (300 + delta), chaincodeID);
// Set user context on client but use explicit user contest on each call.
if (changeContext) {
client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
}
// exercise v1 of chaincode
moveAmount(client, channel, chaincodeID, "25", changeContext ? sampleOrg.getPeerAdmin() : null).thenApply((BlockEvent.TransactionEvent transactionEvent) -> {
try {
waitOnFabric();
client.setUserContext(sampleOrg.getUser(TESTUSER_1_NAME));
queryChaincodeForExpectedValue(client, channel, "" + (325 + delta), chaincodeID);
// ////////////////
// Start of upgrade first must install it.
client.setUserContext(sampleOrg.getPeerAdmin());
// /////////////
// //
InstallProposalRequest installProposalRequest = client.newInstallProposalRequest();
installProposalRequest.setChaincodeID(chaincodeID);
// //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());
installProposalRequest.setChaincodeVersion(CHAIN_CODE_VERSION_11);
installProposalRequest.setProposalWaitTime(testConfig.getProposalWaitTime());
installProposalRequest.setChaincodeLanguage(CHAIN_CODE_LANG);
if (changeContext) {
installProposalRequest.setUserContext(sampleOrg.getPeerAdmin());
}
out("Sending install proposal for channel: %s", channel.getName());
// //////////////////////////
// only a client from the same org as the peer can issue an install request
int numInstallProposal = 0;
Collection<ProposalResponse> responses;
final Collection<ProposalResponse> successful = new LinkedList<>();
final Collection<ProposalResponse> failed = new LinkedList<>();
Collection<Peer> peersFromOrg = channel.getPeers();
numInstallProposal = numInstallProposal + peersFromOrg.size();
responses = client.sendInstallProposal(installProposalRequest, peersFromOrg);
for (ProposalResponse response : responses) {
if (response.getStatus() == 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());
}
if (changeContext) {
installProposalRequest.setUserContext(sampleOrg.getPeerAdmin());
}
UpgradeProposalRequest upgradeProposalRequest = client.newUpgradeProposalRequest();
upgradeProposalRequest.setChaincodeID(chaincodeID_11);
upgradeProposalRequest.setProposalWaitTime(testConfig.getProposalWaitTime());
upgradeProposalRequest.setFcn("init");
// no arguments don't change the ledger see chaincode.
upgradeProposalRequest.setArgs(new String[] {});
ChaincodeEndorsementPolicy chaincodeEndorsementPolicy;
chaincodeEndorsementPolicy = new ChaincodeEndorsementPolicy();
chaincodeEndorsementPolicy.fromYamlFile(new File(TEST_FIXTURES_PATH + "/sdkintegration/chaincodeendorsementpolicy.yaml"));
upgradeProposalRequest.setChaincodeEndorsementPolicy(chaincodeEndorsementPolicy);
Map<String, byte[]> tmap = new HashMap<>();
tmap.put("test", "data".getBytes());
upgradeProposalRequest.setTransientMap(tmap);
if (changeContext) {
upgradeProposalRequest.setUserContext(sampleOrg.getPeerAdmin());
}
out("Sending upgrade proposal");
Collection<ProposalResponse> responses2;
responses2 = channel.sendUpgradeProposal(upgradeProposalRequest);
successful.clear();
failed.clear();
for (ProposalResponse response : responses2) {
if (response.getStatus() == Status.SUCCESS) {
out("Successful upgrade proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName());
successful.add(response);
} else {
failed.add(response);
}
}
out("Received %d upgrade proposal responses. Successful+verified: %d . Failed: %d", channel.getPeers().size(), successful.size(), failed.size());
if (failed.size() > 0) {
ProposalResponse first = failed.iterator().next();
throw new AssertionError("Not enough endorsers for upgrade :" + successful.size() + ". " + first.getMessage());
}
if (changeContext) {
return channel.sendTransaction(successful, sampleOrg.getPeerAdmin()).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS);
} else {
return channel.sendTransaction(successful).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS);
}
} catch (CompletionException e) {
throw e;
} catch (Exception e) {
throw new CompletionException(e);
}
}).thenApply(transactionEvent -> {
try {
waitOnFabric(10000);
out("Chaincode has been upgraded to version %s", CHAIN_CODE_VERSION_11);
// Check to see if peers have new chaincode and old chaincode is gone.
client.setUserContext(sampleOrg.getPeerAdmin());
for (Peer peer : channel.getPeers()) {
if (!checkInstalledChaincode(client, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION_11)) {
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));
}
// should be instantiated too..
if (!checkInstantiatedChaincode(channel, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION_11)) {
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));
}
if (checkInstantiatedChaincode(channel, peer, CHAIN_CODE_NAME, CHAIN_CODE_PATH, CHAIN_CODE_VERSION)) {
throw new AssertionError(format("Peer %s still has old 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));
// /Check if we still get the same value on the ledger
out("delta is %s", delta);
queryChaincodeForExpectedValue(client, channel, "" + (325 + delta), chaincodeID);
// Now lets run the new chaincode which should *double* the results we asked to move.
return moveAmount(client, channel, chaincodeID_11, "50", changeContext ? sampleOrg.getPeerAdmin() : null).get(testConfig.getTransactionWaitTime(), // really move 100
TimeUnit.SECONDS);
} catch (CompletionException e) {
throw e;
} catch (Exception e) {
throw new CompletionException(e);
}
}).thenApply(transactionEvent -> {
waitOnFabric(10000);
queryChaincodeForExpectedValue(client, channel, "" + (425 + delta), chaincodeID_11);
return null;
}).exceptionally(e -> {
if (e instanceof CompletionException && e.getCause() != null) {
e = e.getCause();
}
if (e instanceof TransactionEventException) {
BlockEvent.TransactionEvent te = ((TransactionEventException) e).getTransactionEvent();
if (te != null) {
e.printStackTrace(System.err);
fail(format("Transaction with txid %s failed. %s", te.getTransactionID(), e.getMessage()));
}
}
e.printStackTrace(System.err);
fail(format("Test failed with %s exception %s", e.getClass().getName(), e.getMessage()));
return null;
}).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS);
} catch (Exception e) {
throw new RuntimeException(e);
}
out("Running for Channel %s done", channelName);
}
use of org.hyperledger.fabric.sdk.HFClient in project fabric-sdk-java by hyperledger.
the class End2endIT method runFabricTest.
public void runFabricTest(final SampleStore sampleStore) throws Exception {
// //////////////////////////
// Setup client
// Create instance of client.
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
// //////////////////////////
// Construct and run the channels
SampleOrg sampleOrg = testConfig.getIntegrationTestsSampleOrg("peerOrg1");
Channel fooChannel = constructChannel(FOO_CHANNEL_NAME, client, sampleOrg);
sampleStore.saveChannel(fooChannel);
runChannel(client, fooChannel, true, sampleOrg, 0);
assertFalse(fooChannel.isShutdown());
// Force foo channel to shutdown clean up resources.
fooChannel.shutdown(true);
assertTrue(fooChannel.isShutdown());
assertNull(client.getChannel(FOO_CHANNEL_NAME));
out("\n");
sampleOrg = testConfig.getIntegrationTestsSampleOrg("peerOrg2");
Channel barChannel = constructChannel(BAR_CHANNEL_NAME, client, sampleOrg);
assertTrue(barChannel.isInitialized());
/**
* sampleStore.saveChannel uses {@link Channel#serializeChannel()}
*/
sampleStore.saveChannel(barChannel);
assertFalse(barChannel.isShutdown());
// run a newly constructed bar channel with different b value!
runChannel(client, barChannel, true, sampleOrg, 100);
// let bar channel just shutdown so we have both scenarios.
out("\nTraverse the blocks for chain %s ", barChannel.getName());
blockWalker(client, barChannel);
assertFalse(barChannel.isShutdown());
assertTrue(barChannel.isInitialized());
out("That's all folks!");
}
Aggregations