public void Setup() { try { //////////////////////////// // Setup client //Create instance of client. HFClient client = HFClient.Create(); client.CryptoSuite = Factory.Instance.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) string sampleStoreFile = Path.Combine(Path.GetTempPath(), "HFCSampletest.properties"); SampleStore sampleStore = new SampleStore(sampleStoreFile); //SampleUser can be any implementation that implements org.hyperledger.fabric.sdk.User Interface //////////////////////////// // get users for all orgs foreach (SampleOrg sampleOrgs in testSampleOrgs) { string orgName = sampleOrgs.Name; sampleOrgs.PeerAdmin = 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. byte[] channelConfigurationBytes = fooChannel.GetChannelConfigurationBytes(); string responseAsString = ConfigTxlatorDecode(channelConfigurationBytes); //responseAsString is JSON but use just string operations for this test. if (!responseAsString.Contains(ORIGINAL_BATCH_TIMEOUT)) { Assert.Fail($"Did not find expected batch timeout '{ORIGINAL_BATCH_TIMEOUT}', in:{responseAsString}"); } //Now modify the batch timeout string updateString = responseAsString.Replace(ORIGINAL_BATCH_TIMEOUT, UPDATED_BATCH_TIMEOUT); (int statuscode, byte[] data) = HttpPost(CONFIGTXLATOR_LOCATION + "/protolator/encode/common.Config", updateString.ToBytes()); Util.COut("Got {0} status for encoding the new desired channel config bytes", statuscode); Assert.AreEqual(200, statuscode); byte[] newConfigBytes = data; // Now send to configtxlator multipart form post with original config bytes, updated config bytes and channel name. List <(string Name, byte[] Body, string Mime, string FName)> parts = new List <(string Name, byte[] Body, string Mime, string FName)>(); parts.Add(("original", channelConfigurationBytes, "application/octet-stream", "originalFakeFilename")); parts.Add(("updated", newConfigBytes, "application/octet-stream", "updatedFakeFilename")); parts.Add(("channel", fooChannel.Name.ToBytes(), null, null)); (statuscode, data) = HttpPostMultiPart(CONFIGTXLATOR_LOCATION + "/configtxlator/compute/update-from-configs", parts); Util.COut("Got {0} status for updated config bytes needed for updateChannelConfiguration ", statuscode); Assert.AreEqual(200, statuscode); byte[] updateBytes = data; 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/[email protected]/msp/keystore/f1a9a940f57419a18a83a852884790d59b378281347dd3d4a88c2b820a0f70c9_sk //certificate: src/test/fixture/sdkintegration/e2e-2Orgs/channel/crypto-config/ordererOrganizations/example.com/users/[email protected]/msp/signcerts/[email protected] string sampleOrgName = sampleOrg.Name; SampleUser ordererAdmin = sampleStore.GetMember(sampleOrgName + "OrderAdmin", sampleOrgName, "OrdererMSP", Util.FindFileSk("fixture/sdkintegration/e2e-2Orgs/" + TestConfig.Instance.FAB_CONFIG_GEN_VERS + "/crypto-config/ordererOrganizations/example.com/users/[email protected]/msp/keystore/"), ("fixture/sdkintegration/e2e-2Orgs/" + TestConfig.Instance.FAB_CONFIG_GEN_VERS + "/crypto-config/ordererOrganizations/example.com/users/[email protected]/msp/signcerts/[email protected]").Locate()); client.UserContext = ordererAdmin; //Ok now do actual channel update. fooChannel.UpdateChannelConfiguration(updateChannelConfiguration, client.GetUpdateChannelConfigurationSignature(updateChannelConfiguration, ordererAdmin)); Thread.Sleep(3000); // give time for events to happen //Let's add some additional verification... client.UserContext = sampleOrg.PeerAdmin; byte[] modChannelBytes = fooChannel.GetChannelConfigurationBytes(); //Now decode the new channel config bytes to json... responseAsString = ConfigTxlatorDecode(modChannelBytes); if (!responseAsString.Contains(UPDATED_BATCH_TIMEOUT)) { //If it doesn't have the updated time out it failed. Assert.Fail($"Did not find updated expected batch timeout '{UPDATED_BATCH_TIMEOUT}', in:{responseAsString}"); } if (responseAsString.Contains(ORIGINAL_BATCH_TIMEOUT)) { //Should not have been there anymore! Assert.Fail($"Found original batch timeout '{ORIGINAL_BATCH_TIMEOUT}', when it was not expected in:{responseAsString}"); } Assert.IsTrue(eventCountFilteredBlock > 0); // make sure we got blockevent that were tested. Assert.IsTrue(eventCountBlock > 0); // make sure we got blockevent that were tested. //Should be no anchor peers defined. Assert.IsFalse(new Regex(REGX_S_HOST_PEER_0_ORG_1_EXAMPLE_COM).Match(responseAsString).Success); Assert.IsFalse(new Regex(REGX_S_ANCHOR_PEERS).Match(responseAsString).Success); // Get config update for adding an anchor peer. Channel.AnchorPeersConfigUpdateResult configUpdateAnchorPeers = fooChannel.GetConfigUpdateAnchorPeers(fooChannel.Peers.First(), sampleOrg.PeerAdmin, new List <string> { PEER_0_ORG_1_EXAMPLE_COM_7051 }, null); Assert.IsNotNull(configUpdateAnchorPeers.UpdateChannelConfiguration); Assert.IsTrue(configUpdateAnchorPeers.PeersAdded.Contains(PEER_0_ORG_1_EXAMPLE_COM_7051)); //Now add anchor peer to channel configuration. fooChannel.UpdateChannelConfiguration(configUpdateAnchorPeers.UpdateChannelConfiguration, client.GetUpdateChannelConfigurationSignature(configUpdateAnchorPeers.UpdateChannelConfiguration, sampleOrg.PeerAdmin)); Thread.Sleep(3000); // give time for events to happen // Getting foo channels current configuration bytes to check with configtxlator channelConfigurationBytes = fooChannel.GetChannelConfigurationBytes(); responseAsString = ConfigTxlatorDecode(channelConfigurationBytes); // Check is anchor peer in config block? Assert.IsTrue(new Regex(REGX_S_HOST_PEER_0_ORG_1_EXAMPLE_COM).Match(responseAsString).Success); Assert.IsTrue(new Regex(REGX_S_ANCHOR_PEERS).Match(responseAsString).Success); //Should see what's there. configUpdateAnchorPeers = fooChannel.GetConfigUpdateAnchorPeers(fooChannel.Peers.First(), sampleOrg.PeerAdmin, null, null); Assert.IsNull(configUpdateAnchorPeers.UpdateChannelConfiguration); // not updating anything. Assert.IsTrue(configUpdateAnchorPeers.CurrentPeers.Contains(PEER_0_ORG_1_EXAMPLE_COM_7051)); // peer should be there. Assert.IsTrue(configUpdateAnchorPeers.PeersRemoved.Count == 0); // not removing any Assert.IsTrue(configUpdateAnchorPeers.PeersAdded.Count == 0); // not adding anything. Assert.IsTrue(configUpdateAnchorPeers.UpdatedPeers.Count == 0); // not updating anyting. //Now remove the anchor peer -- get the config update block. configUpdateAnchorPeers = fooChannel.GetConfigUpdateAnchorPeers(fooChannel.Peers.First(), sampleOrg.PeerAdmin, null, new List <string> { PEER_0_ORG_1_EXAMPLE_COM_7051 }); Assert.IsNotNull(configUpdateAnchorPeers.UpdateChannelConfiguration); Assert.IsTrue(configUpdateAnchorPeers.CurrentPeers.Contains(PEER_0_ORG_1_EXAMPLE_COM_7051)); // peer should still be there. Assert.IsTrue(configUpdateAnchorPeers.PeersRemoved.Contains(PEER_0_ORG_1_EXAMPLE_COM_7051)); // peer to remove. Assert.IsTrue(configUpdateAnchorPeers.PeersAdded.Count == 0); // not adding anything. Assert.IsTrue(configUpdateAnchorPeers.UpdatedPeers.Count == 0); // no peers should be left. // Now do the actual update. fooChannel.UpdateChannelConfiguration(configUpdateAnchorPeers.UpdateChannelConfiguration, client.GetUpdateChannelConfigurationSignature(configUpdateAnchorPeers.UpdateChannelConfiguration, sampleOrg.PeerAdmin)); Thread.Sleep(3000); // give time for events to happen // Getting foo channels current configuration bytes to check with configtxlator. channelConfigurationBytes = fooChannel.GetChannelConfigurationBytes(); responseAsString = ConfigTxlatorDecode(channelConfigurationBytes); Assert.IsFalse(new Regex(REGX_S_HOST_PEER_0_ORG_1_EXAMPLE_COM).Match(responseAsString).Success); // should be gone! Assert.IsTrue(new Regex(REGX_S_ANCHOR_PEERS).Match(responseAsString).Success); //ODDLY we still want this even if it's empty! //Should see what's there. configUpdateAnchorPeers = fooChannel.GetConfigUpdateAnchorPeers(fooChannel.Peers.First(), sampleOrg.PeerAdmin, null, null); Assert.IsNull(configUpdateAnchorPeers.UpdateChannelConfiguration); // not updating anything. Assert.IsTrue(configUpdateAnchorPeers.CurrentPeers.Count == 0); // peer should be now gone. Assert.IsTrue(configUpdateAnchorPeers.PeersRemoved.Count == 0); // not removing any Assert.IsTrue(configUpdateAnchorPeers.PeersAdded.Count == 0); // not adding anything. Assert.IsTrue(configUpdateAnchorPeers.UpdatedPeers.Count == 0); // no peers should be left Util.COut("That's all folks!"); } catch (System.Exception e) { Assert.Fail(e.Message); } }