use of org.hyperledger.fabric.sdk.UpgradeProposalRequest 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);
}
Aggregations