Skip to content

Setup a RedisClientCloudEndpoint with TLS Authentication, wire graph and a redis-server.

In this tutorial we will set up a RedisClientCloudEndpoint that connects to a running Redis server secured with TLS and requires a client key pair for authentication. We will set up a RedisClientPublisher that publishes data in json format on a test topic and a RedisClientSubscriber that receives data on the same topic. In order to watch the data flow we will use a Wire Graph.

Generate Redis Server Certificates and client keypair

To generate the required Redis Server TLS certificate and the client keypair we will use an example script provided by the Redis Team. Run this script requires openssl to be installed on the system. Download the gen-test-certs.sh and run the script following the instructions on the terminal console.

Warning

Check the script has the execution privilege, ontherwise add the execute flag with the command sudo chmod +x gen-test-certs.sh

Several certificates will be generated in the folder tests/tls. In this tutorial we will use the following certificate files:

  • tests/tls/ca.crt Certificate Authority certificate used for TLS connection.
  • tests/tls/redis.crt Client Public key certificate.
  • tests/tls/redis.key Client private key.

Add the client certificate to the SSLKeystore

We will use the default SSLKeystore as store for our certificates, however a custom keystore can be created and used as certicicates provider within RedisClientDataTransport component configuration.

Go to the Security section and select the Certificate List tab, then click on the Add button. In the subsequent view select Certificate and then select SSLKeystore as keystore. Put a storage alias and copy/paste the CA certificate from the file tests/tls/ca.crt. Repeat the same procedure for the Private/Public Key Pair paying attention to put as storage alias redis-client-key and copy/paste the content of the file tests/tls/redis.key as Private Key and the content of the file tests/tls/redis.crt as Certificate.

Install the com.eurotech.framework.redis.client.feature

Install the com.eurotech.framework.redis.client.feature package from the Eclipse Marketplace using the Packages section in the ESF Web UI. For the purpose of this tutorial we will also install the package com.eurotech.wire.script.filter to leverage on the Javascript Filter for data generation.

Create a RedisClientCloudEndpoint

Create a RedisClientCloudEndpoint from the Cloud Connections section in the ESF Web UI changing the following properties as described:

  • In RedisClientCloudEndpoint-PREFIX change the Payload Encoding to Simple JSON
  • In RedisClientDataService-PREFIX change the Connect Auto-on-startup to true and Connect Retry-interval to 10
  • In RedisClientDataTransport-PREFIX change the Server URIs to rediss://: where redis-server-ip need to be the host where Redis is running and redis-server-port the port where the server is listening for connection (e.g. redis://localhost 6379). Change the Authentication Method to TLS: TLS-based authentication. Set the Enable hostname verification on false and then elect the the SSLKeystore as KeystoreService Target Filter.

After selecting the new created RedisClientCloudEndpoint, create a new RedisClientPublisher using the New Pub/Sub button on top menu. Configure the publisher with the following properties:

  • Producer topic: test
  • Publish metrics: true

Create a new RedisClientSubscriber using test as Subscriber topic.

You can use the following partial snapshot to re-create the above configuration paying attention to replaceing the Server URIs in the RedisClientDataTransport-1 with the right one:

    <esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="encode.gzip" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="DataService.target" type="String">
                <esf:value>(kura.service.pid=com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="payload.encoding" type="String">
                <esf:value>simple-json</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="cloud.connection.factory.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudConnectionFactory</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1671006773951-0</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="pub">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="publish.metrics" type="Boolean">
                <esf:value>true</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="topic" type="String">
                <esf:value>test</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="priority" type="Integer">
                <esf:value>7</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="publish.position" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.publisher.RedisClientPublisher</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>pub</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.publisher.RedisClientPublisher-1671008631675-22</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="store.purge-age" type="Integer">
                <esf:value>60</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="in-flight-messages.congestion-timeout" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="enable.rate.limit" type="Boolean">
                <esf:value>true</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="in-flight-messages.max-number" type="Integer">
                <esf:value>9</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.data.DataService</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="connection.recovery.max.failures" type="Integer">
                <esf:value>10</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="disconnect.quiesce-timeout" type="Integer">
                <esf:value>10</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientDataService-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.data.DataService-1671006774160-18</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="store.housekeeper-interval" type="Integer">
                <esf:value>900</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="connect.auto-on-startup" type="Boolean">
                <esf:value>true</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="rate.limit.time.unit" type="String">
                <esf:value>SECONDS</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="rate.limit.average" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="store.db.service.pid" type="String">
                <esf:value>org.eclipse.kura.db.H2DbService</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="DataTransportService.target" type="String">
                <esf:value>(kura.service.pid=com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="connect.retry-interval" type="Integer">
                <esf:value>10</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="enable.recovery.on.connection.failure" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="rate.limit.burst.size" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="in-flight-messages.republish-on-new-session" type="Boolean">
                <esf:value>true</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="store.capacity" type="Integer">
                <esf:value>10000</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="authentication.method" type="String">
                <esf:value>TLS</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="enable.hostname.verification" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="servers" type="String">
                <esf:value>rediss://localhost:6379 </esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="authentication.username" type="String">
                <esf:value/>
            </esf:property>
            <esf:property array="false" encrypted="false" name="database-number" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="connection-mode" type="String">
                <esf:value>SIMPLE</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="KeystoreService.target" type="String">
                <esf:value>(kura.service.pid=SSLKeystore)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="client.id" type="String">
                <esf:value/>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.transport.RedisClientDataTransport-1671006774172-19</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>    
    <esf:configuration pid="sub">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="topic" type="String">
                <esf:value>test</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.subscriber.RedisClientSubscriber</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="cloud.endpoint.service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.RedisClientCloudEndpoint-1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>sub</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>com.eurotech.framework.redis.client.cloudconnection.subscriber.RedisClientSubscriber-1671008950439-31</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>

Setup a simple Redis server with TLS support

Install the redis-server package following the instructions here

Disable the default service on Linux system

On Linux system redis package is shipped with a default running service. Stop and disable it with the following commands:

sudo systemctl stop redis-server
sudo systemctl disable redis-server

Create a file named redis-tls-auth.conf with the following line content:

tls-port 6379
port 0
tls-cert-file ./tests/tls/redis.crt
tls-key-file ./tests/tls/redis.key
tls-ca-cert-file ./tests/tls/ca.crt
protected-mode no

and start the server with the following command:

redis-server ./redis-tls-auth.conf

Now the Redis server is running in foreground.

Create a simple wire graph

Now we will create a simple wire graph that push some data every second, generated through the Javascript Filter wire component, to the Redis server using the RedisClientPublisher. The wire graph will also retrieve the data using a RedisClientSubscriber and display them to the log console.

You can use the following snapshot to load a the graph

<?xml version="1.0" encoding="UTF-8"?><esf:configurations xmlns:esf="http://eurotech.com/esf/2.0" xmlns:ocd="http://www.osgi.org/xmlns/metatype/v1.2.0">
    <esf:configuration pid="t1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.Timer</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentId" type="String">
                <esf:value>t1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="simple.first.tick.policy" type="String">
                <esf:value>DEFAULT</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentDescription" type="String">
                <esf:value>A wire component that fires a ticking event on every configured interval</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="simple.interval" type="Integer">
                <esf:value>5</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="simple.time.unit" type="String">
                <esf:value>SECONDS</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="type" type="String">
                <esf:value>SIMPLE</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.Timer</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="cron.interval" type="String">
                <esf:value>0/10 * * * * ?</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>t1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.Timer-1671008653729-23</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentName" type="String">
                <esf:value>Timer</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="simple.custom.first.tick.interval" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="p1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudPublisher</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentId" type="String">
                <esf:value>p1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentDescription" type="String">
                <esf:value>A wire component which publishes data to the cloud platform</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="CloudPublisher.target" type="String">
                <esf:value>(kura.service.pid=pub)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudPublisher</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>p1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudPublisher-1671008683216-24</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="set.body.from.property" type="String">
                <esf:value/>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentName" type="String">
                <esf:value>Publisher</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="publish.position" type="String">
                <esf:value>none</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="j1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.ScriptFilter</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentId" type="String">
                <esf:value>j1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentDescription" type="String">
                <esf:value>A wire component that provides scripting functionalities in JavaScript.</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.ScriptFilter</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="script" type="String">
                <esf:value>var record= newWireRecord()

record.a= newIntegerValue(1)
record.b= newIntegerValue(2)
record.c= newIntegerValue(3)
record.d= newIntegerValue(4)
record.e= newIntegerValue(5)
record.f= newIntegerValue(6)

output.add(record)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>j1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.ScriptFilter-1671008840387-26</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentName" type="String">
                <esf:value>Javascript Filter</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="script.context.drop" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="s1">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudSubscriber</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="CloudSubscriber.target" type="String">
                <esf:value>(kura.service.pid=sub)</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentId" type="String">
                <esf:value>s1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentDescription" type="String">
                <esf:value>A wire component which subscribes data from the cloud platform</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudSubscriber</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>s1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.CloudSubscriber-1671009016399-32</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="body.property.type" type="String">
                <esf:value>BYTE_ARRAY</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="set.property.from.body" type="String">
                <esf:value/>
            </esf:property>
            <esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentName" type="String">
                <esf:value>Subscriber</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="l2">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="emitter.port.count" type="Integer">
                <esf:value>0</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.Logger</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentId" type="String">
                <esf:value>l2</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="receiver.port.count" type="Integer">
                <esf:value>1</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="factoryComponent" type="Boolean">
                <esf:value>false</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentDescription" type="String">
                <esf:value>A wire component which logs data as received from upstream connected Wire Components</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="log.verbosity" type="String">
                <esf:value>VERBOSE</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="componentName" type="String">
                <esf:value>Logger</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.factoryPid" type="String">
                <esf:value>org.eclipse.kura.wire.Logger</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>l2</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.Logger-1671009016412-33</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
    <esf:configuration pid="org.eclipse.kura.wire.graph.WireGraphService">
        <esf:properties>
            <esf:property array="false" encrypted="false" name="WireGraph" type="String">
                <esf:value>{"components":[{"pid":"t1","inputPortCount":0,"outputPortCount":1,"renderingProperties":{"position":{"x":-1220,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"p1","inputPortCount":1,"outputPortCount":0,"renderingProperties":{"position":{"x":-760,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"j1","inputPortCount":1,"outputPortCount":1,"renderingProperties":{"position":{"x":-960,"y":-100},"inputPortNames":{},"outputPortNames":{}}},{"pid":"s1","inputPortCount":0,"outputPortCount":1,"renderingProperties":{"position":{"x":-1220,"y":0},"inputPortNames":{},"outputPortNames":{}}},{"pid":"l2","inputPortCount":1,"outputPortCount":0,"renderingProperties":{"position":{"x":-960,"y":0},"inputPortNames":{},"outputPortNames":{}}}],"wires":[{"emitter":"t1","emitterPort":0,"receiver":"j1","receiverPort":0},{"emitter":"j1","emitterPort":0,"receiver":"p1","receiverPort":0},{"emitter":"s1","emitterPort":0,"receiver":"l2","receiverPort":0}]}</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="kura.service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.graph.WireGraphService</esf:value>
            </esf:property>
            <esf:property array="false" encrypted="false" name="service.pid" type="String">
                <esf:value>org.eclipse.kura.wire.graph.WireGraphService</esf:value>
            </esf:property>
        </esf:properties>
    </esf:configuration>
</esf:configurations>

After performed the graph import, if the RedisCloudConnector is configured in the proper way, you should be able to see the data flow in the ESF log console.

2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger - Received WireEnvelope from org.eclipse.kura.wire.CloudSubscriber-1671009016399-32
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger - Record List content: 
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -   Record content: 
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     a : 1
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     b : 2
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     c : 3
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     d : 4
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     e : 5
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -     f : 6
2022-12-15 09:58:25 2022-12-15T08:58:25,666 [lettuce-nioEventLoop-27-12] INFO  o.e.k.i.w.l.Logger -