Search in sources :

Example 1 with NodeOfflineException

use of com.quorum.tessera.transaction.publish.NodeOfflineException in project tessera by ConsenSys.

the class RestPayloadPublisher method publishPayload.

@Override
public void publishPayload(EncodedPayload payload, PublicKey recipientKey) {
    final NodeInfo remoteNodeInfo = discovery.getRemoteNodeInfo(recipientKey);
    final Set<String> supportedApiVersions = remoteNodeInfo.supportedApiVersions();
    final EncodedPayloadCodec preferredCodec = EncodedPayloadCodec.getPreferredCodec(supportedApiVersions);
    final PayloadEncoder payloadEncoder = PayloadEncoder.create(preferredCodec);
    if (PrivacyMode.STANDARD_PRIVATE != payload.getPrivacyMode() && !supportedApiVersions.contains(EnhancedPrivacyVersion.API_VERSION_2)) {
        throw new EnhancedPrivacyNotSupportedException("Transactions with enhanced privacy is not currently supported on recipient " + recipientKey.encodeToBase64());
    }
    if (PrivacyMode.MANDATORY_RECIPIENTS == payload.getPrivacyMode() && !supportedApiVersions.contains(MandatoryRecipientsVersion.API_VERSION_4)) {
        throw new MandatoryRecipientsNotSupportedException("Transactions with mandatory recipients are not currently supported on recipient " + recipientKey.encodeToBase64());
    }
    final String targetUrl = remoteNodeInfo.getUrl();
    LOGGER.info("Publishing message to {}", targetUrl);
    final byte[] encoded = payloadEncoder.encode(payload);
    try (Response response = client.target(targetUrl).path("/push").request().post(Entity.entity(encoded, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
        if (Response.Status.OK.getStatusCode() != response.getStatus() && Response.Status.CREATED.getStatusCode() != response.getStatus()) {
            throw new PublishPayloadException("Unable to push payload to recipient url " + targetUrl);
        }
        LOGGER.info("Published to {}", targetUrl);
    } catch (ProcessingException ex) {
        LOGGER.debug("", ex);
        throw new NodeOfflineException(URI.create(targetUrl));
    }
}
Also used : Response(jakarta.ws.rs.core.Response) PayloadEncoder(com.quorum.tessera.enclave.PayloadEncoder) PublishPayloadException(com.quorum.tessera.transaction.publish.PublishPayloadException) NodeInfo(com.quorum.tessera.partyinfo.node.NodeInfo) MandatoryRecipientsNotSupportedException(com.quorum.tessera.transaction.exception.MandatoryRecipientsNotSupportedException) NodeOfflineException(com.quorum.tessera.transaction.publish.NodeOfflineException) EncodedPayloadCodec(com.quorum.tessera.enclave.EncodedPayloadCodec) EnhancedPrivacyNotSupportedException(com.quorum.tessera.transaction.exception.EnhancedPrivacyNotSupportedException) ProcessingException(jakarta.ws.rs.ProcessingException)

Example 2 with NodeOfflineException

use of com.quorum.tessera.transaction.publish.NodeOfflineException in project tessera by ConsenSys.

the class RestPrivacyGroupPublisher method publishPrivacyGroup.

@Override
public void publishPrivacyGroup(byte[] data, PublicKey recipientKey) {
    final NodeInfo remoteNodeInfo = discovery.getRemoteNodeInfo(recipientKey);
    if (!remoteNodeInfo.supportedApiVersions().contains(PrivacyGroupVersion.API_VERSION_3)) {
        throw new PrivacyGroupNotSupportedException("Transactions with privacy group is not currently supported on recipient " + recipientKey.encodeToBase64());
    }
    final String targetUrl = remoteNodeInfo.getUrl();
    LOGGER.info("Publishing privacy group to {}", targetUrl);
    try (Response response = restClient.target(targetUrl).path("/pushPrivacyGroup").request().post(Entity.entity(data, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
        if (Response.Status.OK.getStatusCode() != response.getStatus()) {
            throw new PrivacyGroupPublishException("Unable to push privacy group to recipient url " + targetUrl);
        }
        LOGGER.info("Published privacy group to {}", targetUrl);
    } catch (ProcessingException ex) {
        LOGGER.debug("", ex);
        throw new NodeOfflineException(URI.create(targetUrl));
    }
}
Also used : Response(jakarta.ws.rs.core.Response) PrivacyGroupNotSupportedException(com.quorum.tessera.privacygroup.exception.PrivacyGroupNotSupportedException) PrivacyGroupPublishException(com.quorum.tessera.privacygroup.exception.PrivacyGroupPublishException) NodeInfo(com.quorum.tessera.partyinfo.node.NodeInfo) NodeOfflineException(com.quorum.tessera.transaction.publish.NodeOfflineException) ProcessingException(jakarta.ws.rs.ProcessingException)

Example 3 with NodeOfflineException

use of com.quorum.tessera.transaction.publish.NodeOfflineException in project tessera by ConsenSys.

the class RestPayloadPublisherTest method handleConnectionError.

@Test
public void handleConnectionError() {
    final String targetUri = "http://jimmywhite.com";
    final PublicKey recipientKey = mock(PublicKey.class);
    Recipient recipient = mock(Recipient.class);
    when(recipient.getKey()).thenReturn(recipientKey);
    when(recipient.getUrl()).thenReturn(targetUri);
    NodeInfo nodeInfo = mock(NodeInfo.class);
    when(nodeInfo.getRecipients()).thenReturn(Set.of(recipient));
    when(nodeInfo.getUrl()).thenReturn(targetUri);
    when(discovery.getRemoteNodeInfo(recipientKey)).thenReturn(nodeInfo);
    Client client = mock(Client.class);
    when(client.target(targetUri)).thenThrow(ProcessingException.class);
    final EncodedPayload payload = mock(EncodedPayload.class);
    when(payload.getPrivacyMode()).thenReturn(PrivacyMode.STANDARD_PRIVATE);
    when(payloadEncoder.encode(payload)).thenReturn("SomeData".getBytes());
    RestPayloadPublisher restPayloadPublisher = new RestPayloadPublisher(client, discovery);
    try {
        restPayloadPublisher.publishPayload(payload, recipientKey);
        failBecauseExceptionWasNotThrown(NodeOfflineException.class);
    } catch (NodeOfflineException ex) {
        assertThat(ex).hasMessageContaining(targetUri);
        verify(client).target(targetUri);
        verify(discovery).getRemoteNodeInfo(eq(recipientKey));
        verify(payloadEncoder).encode(payload);
        verify(discovery).getRemoteNodeInfo(eq(recipientKey));
        payloadEncoderFactoryFunction.verify(() -> PayloadEncoder.create(any(EncodedPayloadCodec.class)));
    }
}
Also used : PublicKey(com.quorum.tessera.encryption.PublicKey) NodeInfo(com.quorum.tessera.partyinfo.node.NodeInfo) Recipient(com.quorum.tessera.partyinfo.node.Recipient) EncodedPayload(com.quorum.tessera.enclave.EncodedPayload) Client(jakarta.ws.rs.client.Client) NodeOfflineException(com.quorum.tessera.transaction.publish.NodeOfflineException) EncodedPayloadCodec(com.quorum.tessera.enclave.EncodedPayloadCodec) Test(org.junit.Test)

Example 4 with NodeOfflineException

use of com.quorum.tessera.transaction.publish.NodeOfflineException in project tessera by ConsenSys.

the class RestPrivacyGroupPublisherTest method testPublishSingleNodeOffline.

@Test
public void testPublishSingleNodeOffline() {
    String targetUrl = "https://sometargeturl.com";
    PublicKey recipient = PublicKey.from("PUBLIC_KEY".getBytes());
    NodeInfo nodeInfo = mock(NodeInfo.class);
    when(nodeInfo.supportedApiVersions()).thenReturn(Set.of(PrivacyGroupVersion.API_VERSION_3));
    when(nodeInfo.getUrl()).thenReturn(targetUrl);
    when(discovery.getRemoteNodeInfo(recipient)).thenReturn(nodeInfo);
    Invocation.Builder invocationBuilder = mock(Invocation.Builder.class);
    when(invocationBuilder.post(any(Entity.class))).thenThrow(ProcessingException.class);
    WebTarget webTarget = mock(WebTarget.class);
    when(client.target(targetUrl)).thenReturn(webTarget);
    when(webTarget.path(anyString())).thenReturn(webTarget);
    when(webTarget.request()).thenReturn(invocationBuilder);
    final byte[] data = new byte[5];
    try {
        publisher.publishPrivacyGroup(data, PublicKey.from("PUBLIC_KEY".getBytes()));
        failBecauseExceptionWasNotThrown(NodeOfflineException.class);
    } catch (NodeOfflineException ex) {
        verify(discovery).getRemoteNodeInfo(recipient);
        verify(client).target(targetUrl);
    }
}
Also used : Entity(jakarta.ws.rs.client.Entity) Invocation(jakarta.ws.rs.client.Invocation) PublicKey(com.quorum.tessera.encryption.PublicKey) NodeInfo(com.quorum.tessera.partyinfo.node.NodeInfo) WebTarget(jakarta.ws.rs.client.WebTarget) NodeOfflineException(com.quorum.tessera.transaction.publish.NodeOfflineException) Test(org.junit.Test)

Example 5 with NodeOfflineException

use of com.quorum.tessera.transaction.publish.NodeOfflineException in project tessera by ConsenSys.

the class NodeOfflineExceptionMapperTest method toResponse.

@Test
public void toResponse() {
    URI uri = URI.create("http://ouchthatsgottasmart.com");
    final NodeOfflineException exception = new NodeOfflineException(uri);
    final Response result = exceptionMapper.toResponse(exception);
    verify(discovery).onDisconnect(uri);
    assertThat(result.getStatus()).isEqualTo(Response.Status.GONE.getStatusCode());
    assertThat(result.getStatusInfo().getReasonPhrase()).isEqualTo("Connection error while communicating with http://ouchthatsgottasmart.com");
}
Also used : Response(jakarta.ws.rs.core.Response) NodeOfflineException(com.quorum.tessera.transaction.publish.NodeOfflineException) URI(java.net.URI) Test(org.junit.Test)

Aggregations

NodeOfflineException (com.quorum.tessera.transaction.publish.NodeOfflineException)5 NodeInfo (com.quorum.tessera.partyinfo.node.NodeInfo)4 Response (jakarta.ws.rs.core.Response)3 Test (org.junit.Test)3 EncodedPayloadCodec (com.quorum.tessera.enclave.EncodedPayloadCodec)2 PublicKey (com.quorum.tessera.encryption.PublicKey)2 ProcessingException (jakarta.ws.rs.ProcessingException)2 EncodedPayload (com.quorum.tessera.enclave.EncodedPayload)1 PayloadEncoder (com.quorum.tessera.enclave.PayloadEncoder)1 Recipient (com.quorum.tessera.partyinfo.node.Recipient)1 PrivacyGroupNotSupportedException (com.quorum.tessera.privacygroup.exception.PrivacyGroupNotSupportedException)1 PrivacyGroupPublishException (com.quorum.tessera.privacygroup.exception.PrivacyGroupPublishException)1 EnhancedPrivacyNotSupportedException (com.quorum.tessera.transaction.exception.EnhancedPrivacyNotSupportedException)1 MandatoryRecipientsNotSupportedException (com.quorum.tessera.transaction.exception.MandatoryRecipientsNotSupportedException)1 PublishPayloadException (com.quorum.tessera.transaction.publish.PublishPayloadException)1 Client (jakarta.ws.rs.client.Client)1 Entity (jakarta.ws.rs.client.Entity)1 Invocation (jakarta.ws.rs.client.Invocation)1 WebTarget (jakarta.ws.rs.client.WebTarget)1 URI (java.net.URI)1