use of com.quorum.tessera.partyinfo.model.PartyInfo in project tessera by ConsenSys.
the class SyncPoller method run.
/**
* Retrieves all of the outstanding parties and makes an attempt to make the resend request
* asynchronously. If the request fails then the party is submitted back to the store for a later
* attempt.
*/
@Override
public void run() {
NodeInfo currentNodeInfo = discovery.getCurrent();
final PartyInfo partyInfo = PartyInfoBuilder.create().withUri(currentNodeInfo.getUrl()).withRecipients(currentNodeInfo.getRecipientsAsMap()).build();
final Set<Party> unseenParties = partyInfo.getParties().stream().filter(p -> !p.getUrl().equals(partyInfo.getUrl())).collect(Collectors.toSet());
LOGGER.debug("Unseen parties {}", unseenParties);
this.resendPartyStore.addUnseenParties(unseenParties);
Optional<SyncableParty> nextPartyToSend = this.resendPartyStore.getNextParty();
while (nextPartyToSend.isPresent()) {
final SyncableParty requestDetails = nextPartyToSend.get();
final String url = requestDetails.getParty().getUrl();
final Runnable action = () -> {
// perform a sendPartyInfo in order to ensure that the target tessera has the current
// tessera as
// a recipient
boolean allSucceeded = updatePartyInfo(url);
if (allSucceeded) {
allSucceeded = this.transactionRequester.requestAllTransactionsFromNode(url);
}
if (!allSucceeded) {
this.resendPartyStore.incrementFailedAttempt(requestDetails);
}
};
this.executorService.submit(action);
nextPartyToSend = this.resendPartyStore.getNextParty();
}
}
use of com.quorum.tessera.partyinfo.model.PartyInfo in project tessera by ConsenSys.
the class PeerToPeerIT method validatePartyInfoContentsOnNodeA.
/*
Assume that not of the tests should have managed to change the initial party info
*/
private void validatePartyInfoContentsOnNodeA() {
Party someParty = partyHelper.getParties().filter(p -> !p.getAlias().equals("A")).findAny().get();
ServerConfig serverContext = someParty.getConfig().getP2PServerConfig();
Client client = clientFactory.buildFrom(serverContext);
Response response = client.target(partyA.getP2PUri()).path("partyinfo").request().get();
assertThat(response.getStatus()).isEqualTo(200);
JsonObject result = response.readEntity(JsonObject.class);
Map<String, String> actual = result.getJsonArray("keys").stream().map(o -> o.asJsonObject()).collect(Collectors.toMap(o -> o.getString("key"), o -> removeTrailingSlash(o.getString("url"))));
EncryptorConfig encryptorConfig = partyHelper.getParties().findFirst().map(Party::getConfig).map(Config::getEncryptor).get();
KeyEncryptor keyEncryptor = KeyEncryptorFactory.newFactory().create(encryptorConfig);
List<String> keyz = partyHelper.getParties().map(Party::getConfig).map(Config::getKeys).flatMap(k -> k.getKeyData().stream()).map(kd -> KeyDataUtil.unmarshal(kd, keyEncryptor)).map(ConfigKeyPair::getPublicKey).collect(Collectors.toList());
List<String> urls = partyHelper.getParties().map(Party::getConfig).map(Config::getP2PServerConfig).map(ServerConfig::getServerAddress).map(s -> removeTrailingSlash(s)).collect(Collectors.toList());
assertThat(actual).containsKeys(keyz.toArray(new String[0]));
assertThat(actual).containsValues(urls.toArray(new String[0]));
}
use of com.quorum.tessera.partyinfo.model.PartyInfo in project tessera by ConsenSys.
the class PeerToPeerIT method happyCase.
/*
* Send a valid party info from B to A
*/
@Test
public void happyCase() {
Party partyB = partyHelper.findByAlias(NodeAlias.B);
ServerConfig serverContext = Optional.of(partyB.getConfig()).map(Config::getP2PServerConfig).get();
Client client = clientFactory.buildFrom(serverContext);
PublicKey partyBKey = Optional.of(partyB).map(Party::getPublicKey).map(Base64.getDecoder()::decode).map(PublicKey::from).get();
String partyBServerAddress = partyB.getConfig().getP2PServerConfig().getServerAddress();
Recipient recipient = Recipient.of(partyBKey, partyBServerAddress);
PartyInfo partyInfo = new PartyInfo(partyBServerAddress, Collections.singleton(recipient), Collections.emptySet());
PartyInfoParser partyInfoParser = PartyInfoParser.create();
byte[] data = partyInfoParser.to(partyInfo);
StreamingOutput output = out -> out.write(data);
Response response = client.target(partyA.getP2PUri()).path("partyinfo").request().post(Entity.entity(output, MediaType.APPLICATION_OCTET_STREAM));
assertThat(response.getStatus()).isEqualTo(200);
}
use of com.quorum.tessera.partyinfo.model.PartyInfo in project tessera by ConsenSys.
the class PeerToPeerIT method benevolentNodeBecomesPossessedAndTriesToSendInvalidUrlAndKeyCombo.
@Test
public void benevolentNodeBecomesPossessedAndTriesToSendInvalidUrlAndKeyCombo() throws Exception {
Party partyB = partyHelper.findByAlias(NodeAlias.B);
ServerConfig serverConfig = partyB.getConfig().getP2PServerConfig();
PublicKey publicKey = Optional.of(partyB).map(Party::getPublicKey).map(Base64.getDecoder()::decode).map(PublicKey::from).get();
Recipient itself = Recipient.of(publicKey, serverConfig.getServerUri().toString());
String validKeyFromOtherNode = partyHelper.findByAlias(NodeAlias.C).getPublicKey();
PublicKey validButIncorrectKey = Optional.of(validKeyFromOtherNode).map(Base64.getDecoder()::decode).map(PublicKey::from).get();
String workingUrlFromSomeOtherNode = partyHelper.findByAlias(NodeAlias.D).getConfig().getP2PServerConfig().getServerAddress();
Recipient badRecipient = Recipient.of(validButIncorrectKey, workingUrlFromSomeOtherNode);
Set<Recipient> recipients = Stream.of(itself, badRecipient).collect(Collectors.toSet());
assertThat(recipients).containsExactlyInAnyOrder(itself, badRecipient);
PartyInfo partyInfo = new PartyInfo(serverConfig.getServerUri().toString(), recipients, Collections.emptySet());
Client client = new ClientFactory().buildFrom(serverConfig);
PartyInfoParser partyInfoParser = PartyInfoParser.create();
byte[] data = partyInfoParser.to(partyInfo);
StreamingOutput output = out -> out.write(data);
Response response = client.target(partyA.getP2PUri()).path("partyinfo").request().post(Entity.entity(output, MediaType.APPLICATION_OCTET_STREAM));
assertThat(response.getStatus()).isEqualTo(200);
}
Aggregations