Commit 0c0a24c1 authored by Konstantin Munichev's avatar Konstantin Munichev Committed by Lluis Gifre Renom
Browse files

DLT: Add support for updating and deleting records

parent 0b1c4f93
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
-----BEGIN CERTIFICATE-----
MIICJzCCAc2gAwIBAgIUGgC/inWY+75+oERoZUbGo0YGtV4wCgYIKoZIzj0EAwIw
MIICJjCCAc2gAwIBAgIUVSFCRQNScNJyIwJz89vi6tazYJ4wCgYIKoZIzj0EAwIw
cDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH
EwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEyMDg0MTAwWhcNMzcwNzA4MDg0MTAw
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEzMTQ1MjAwWhcNMzcwNzA5MTQ1MjAw
WjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV
BAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT
Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9u
lEZaQqSTzwsf5zhWmPPytwiBrhma5wshEEDMeN2D49RgVJjtmSpImrZoucpgAzSU
4ZvZkGQ4CznTp5kLUfSjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG
AQH/AgEBMB0GA1UdDgQWBBSRPP23/S9Hs3Fgddh4NIEhbQ9ExzAKBggqhkjOPQQD
AgNIADBFAiEAv97c3x7fy5gfA+lmSb0XlWD+x1o7i09kGFHYDyFx8UkCIGVugTW6
H4GmqRZJsVM1TbtbS3YUrZ4eVghstBqrhmBz
Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLg8
zJvOKBR1fS+hrrMc3xEhOalkSG+5vGGpwzgHv5NNMlDZcbQVuEBHPmRowbLWx4nw
2CIUSfkhtQGC5GmUncOjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG
AQH/AgEBMB0GA1UdDgQWBBRm7lBNvvkP8iy6f0cXwz9BTeSYDzAKBggqhkjOPQQD
AgNHADBEAiB1p8QFXHszJsMqiShmyuTA6zGPfHlnan3dgYMCTNR7mwIgFx3SqSYk
FizTEfVfOcdjIYGc3pTPTyK5PVbO1k2BW80=
-----END CERTIFICATE-----
+4 −4
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
        "peer0.org1.example.com": {
            "url": "grpcs://teraflow.nlehd.de:7051",
            "tlsCACerts": {
                "pem": "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUGgC/inWY+75+oERoZUbGo0YGtV4wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEyMDg0MTAwWhcNMzcwNzA4MDg0MTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9u\nlEZaQqSTzwsf5zhWmPPytwiBrhma5wshEEDMeN2D49RgVJjtmSpImrZoucpgAzSU\n4ZvZkGQ4CznTp5kLUfSjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBSRPP23/S9Hs3Fgddh4NIEhbQ9ExzAKBggqhkjOPQQD\nAgNIADBFAiEAv97c3x7fy5gfA+lmSb0XlWD+x1o7i09kGFHYDyFx8UkCIGVugTW6\nH4GmqRZJsVM1TbtbS3YUrZ4eVghstBqrhmBz\n-----END CERTIFICATE-----\n"
                "pem": "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUVSFCRQNScNJyIwJz89vi6tazYJ4wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEzMTQ1MjAwWhcNMzcwNzA5MTQ1MjAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLg8\nzJvOKBR1fS+hrrMc3xEhOalkSG+5vGGpwzgHv5NNMlDZcbQVuEBHPmRowbLWx4nw\n2CIUSfkhtQGC5GmUncOjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBRm7lBNvvkP8iy6f0cXwz9BTeSYDzAKBggqhkjOPQQD\nAgNHADBEAiB1p8QFXHszJsMqiShmyuTA6zGPfHlnan3dgYMCTNR7mwIgFx3SqSYk\nFizTEfVfOcdjIYGc3pTPTyK5PVbO1k2BW80=\n-----END CERTIFICATE-----\n"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org1.example.com",
@@ -36,7 +36,7 @@
        "peer0.org2.example.com": {
            "url": "grpcs://teraflow.nlehd.de:9051",
            "tlsCACerts": {
                "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUMyzCixoqXQBzqrCTv301KO5Ub3wwCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMjA3MTIwODQxMDBaFw0zNzA3MDgwODQxMDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATpsE9qr9oDDxEZ\nLNDGZduPAslCFl3AY8wC2dURdTJQmn3V/AMeFGiC+a9xEXF5+C/UR/GHE8Cca8/j\nK8GtiM06o0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUE4+hU1/yQ/NCcqrhtAOcSj3O/3EwCgYIKoZIzj0EAwIDRwAwRAIg\nVDsbCz7hPyZ2tULxWiTUnG0aPg7TBh6lD5mRMObX1vUCIA1kcgFnfMPWA1lJJMRQ\nqGw7ydxYTyZ4X4M1b1PPAa3f\n-----END CERTIFICATE-----\n"
                "pem": "-----BEGIN CERTIFICATE-----\nMIICHzCCAcWgAwIBAgIUOsbw943VjFitBzBEXAcxLlOLow8wCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMjA3MTMxNDUyMDBaFw0zNzA3MDkxNDUyMDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARKov9QrWe9dklr\nqYJxOOoqoO3EI18LtPizVCKYrG3IMqkaatM6DLc/2SBTSIqIDeTR6N8WZAPVgLKA\nboRt87Heo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUYe4sT8J0Y2iN/9Q14FcpmxK5dYcwCgYIKoZIzj0EAwIDSAAwRQIh\nAJh2+1QXc5/ZlPaN2qnh3TXbzPFeCDXjoMAoBsOYtRcMAiAF+tcoFY0NcLDfTZBm\nNuuiQDIasoTB9Wuu4PBv8T7I5w==\n-----END CERTIFICATE-----\n"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org2.example.com",
@@ -50,7 +50,7 @@
            "caName": "ca-org1",
            "tlsCACerts": {
                "pem": [
                    "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUGgC/inWY+75+oERoZUbGo0YGtV4wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEyMDg0MTAwWhcNMzcwNzA4MDg0MTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9u\nlEZaQqSTzwsf5zhWmPPytwiBrhma5wshEEDMeN2D49RgVJjtmSpImrZoucpgAzSU\n4ZvZkGQ4CznTp5kLUfSjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBSRPP23/S9Hs3Fgddh4NIEhbQ9ExzAKBggqhkjOPQQD\nAgNIADBFAiEAv97c3x7fy5gfA+lmSb0XlWD+x1o7i09kGFHYDyFx8UkCIGVugTW6\nH4GmqRZJsVM1TbtbS3YUrZ4eVghstBqrhmBz\n-----END CERTIFICATE-----\n"
                    "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUVSFCRQNScNJyIwJz89vi6tazYJ4wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwNzEzMTQ1MjAwWhcNMzcwNzA5MTQ1MjAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLg8\nzJvOKBR1fS+hrrMc3xEhOalkSG+5vGGpwzgHv5NNMlDZcbQVuEBHPmRowbLWx4nw\n2CIUSfkhtQGC5GmUncOjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBRm7lBNvvkP8iy6f0cXwz9BTeSYDzAKBggqhkjOPQQD\nAgNHADBEAiB1p8QFXHszJsMqiShmyuTA6zGPfHlnan3dgYMCTNR7mwIgFx3SqSYk\nFizTEfVfOcdjIYGc3pTPTyK5PVbO1k2BW80=\n-----END CERTIFICATE-----\n"
                ]
            },
            "httpOptions": {
@@ -62,7 +62,7 @@
        "orderer0.example.com": {
            "url": "grpcs://teraflow.nlehd.de:7050",
            "tlsCACerts": {
                "pem": "-----BEGIN CERTIFICATE-----\nMIICCjCCAbGgAwIBAgIULAsUlO5yAbjj/6xnDbyiWeoj6rkwCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIyMDcxMjA4NDAwMFoXDTM3MDcwODA4NDAwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEjwa9/lOenYmcYL+Kqns6lV+UFt8+3tKZHlcwogZf\ngYnBEbsdL9oTZXSFgIvpCpQee65KKFUl7SqMDXrO3Mg0hqNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFPuDBFVg+lhySQO0\nICEnNQ/TzRXeMAoGCCqGSM49BAMCA0cAMEQCIEadLxytDs79F5qTrTuI6SdaFoLB\n6AoQ5VGUNm2mF8tGAiAlWrLs8g3Ni2c7cjFeHZfiFy/2pqJLtor1ieGlFslq1w==\n-----END CERTIFICATE-----\n"
                "pem": "-----BEGIN CERTIFICATE-----\nMIICCjCCAbGgAwIBAgIUA6RVRhhZD8pvcNAQJ6HWPUkbNNIwCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIyMDcxMzE0NTIwMFoXDTM3MDcwOTE0NTIwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEs7mmo5MY0oO9zCYcraUN/MXWxHiQ04xG6tWLaeWX\nqfSmFnfO8UBFq4OF5Li861UWGe+s9QxNXIELchBG8M7qLqNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFBGG7kbCLEXzlQUF\nQfx845Qf2WKCMAoGCCqGSM49BAMCA0cAMEQCIAwABAqRopU+Qt3myyt4YiKQFpyO\nWTZifesVFe3fM/Q3AiA7oZ9XdQ5EuPhqFxSz7ASF45iyL3k078ilusjpc6IZ/g==\n-----END CERTIFICATE-----\n"
            },
            "grpcOptions": {
                "ssl-target-name-override": "orderer0.example.com",
+31 −0
Original line number Diff line number Diff line
@@ -86,6 +86,8 @@ fun main() = runBlocking {

    val domainUuid = UUID.randomUUID().toString()
    val recordUuid = UUID.randomUUID().toString()
    println("New domain uuid $domainUuid")
    println("New record uuid $recordUuid")

    val id = Dlt.DltRecordId.newBuilder()
        .setDomainUuid(
@@ -104,6 +106,7 @@ fun main() = runBlocking {
        .addType(Dlt.DltRecordTypeEnum.DLTRECORDTYPE_LINK)
        .addType(Dlt.DltRecordTypeEnum.DLTRECORDTYPE_SERVICE)
        .addOperation(Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_ADD)
        .addOperation(Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE)
        .addOperation(Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE)
        .build()

@@ -117,8 +120,36 @@ fun main() = runBlocking {
        .setDataJson("{}")
        .build()

    println("sending new record")
    client.putData(data)
    client.getData(id)

    Thread.sleep(5000)

    val updateData = Dlt.DltRecord.newBuilder()
        .setRecordId(id)
        .setOperation(Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE)
        .setDataJson("{\"name\": \"test\"}")
        .build()

    println("updating record")
    client.putData(updateData)
    client.getData(id)

    Thread.sleep(5000)

    val removeData = Dlt.DltRecord.newBuilder()
        .setRecordId(id)
        .setOperation(Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE)
        .setDataJson("{\"name\": \"test\"}")
        .build()

    println("removing record")
    client.putData(removeData)
    try {
        client.getData(id)
    } catch (e: Exception) {
        println(e.toString())
    }
    Thread.sleep(5000)
}
+10 −2
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ class FabricConnector(val config: Config.DltConfig) {
        return String(
            contract.submitTransaction(
                "UpdateRecord",
                record.recordId.domainUuid.uuid,
                record.recordId.recordUuid.uuid,
                record.recordId.type.number.toString(),
                record.dataJson
@@ -125,8 +126,15 @@ class FabricConnector(val config: Config.DltConfig) {
        )
    }

    fun deleteData(uuid: String): String {
        return String(contract.submitTransaction("DeactivateRecord", uuid))
    fun deleteData(record: Dlt.DltRecord): String {
        return String(
            contract.submitTransaction(
                "DeleteRecord",
                record.recordId.domainUuid.uuid,
                record.recordId.recordUuid.uuid,
                record.recordId.type.number.toString()
            )
        )
    }

    fun subscribeForEvents(): Channel<Dlt.DltRecordEvent> {
+20 −16
Original line number Diff line number Diff line
@@ -40,20 +40,34 @@ package grpc
import proto.Dlt
import fabric.FabricConnector
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.consumeAsFlow
import proto.ContextOuterClass
import proto.DltServiceGrpcKt

class DLTService(private val connector: FabricConnector) : DltServiceGrpcKt.DltServiceCoroutineImplBase() {
    override suspend fun recordToDlt(request: Dlt.DltRecord): Dlt.DltRecordStatus {
        println("Incoming request ${request.recordId.recordUuid}")
        val error = connector.putData(request)
        val error = when (request.operation) {
            Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_ADD -> {
                println("Adding new record")
                connector.putData(request)
            }
            Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE -> {
                println("Updating record")
                connector.updateData(request)
            }
            Dlt.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE -> {
                println("Deleting record")
                connector.deleteData(request)
            }
            else -> "Undefined or unknown operation"
        }

        val dltStatusEnum: Dlt.DltRecordStatusEnum = if (error == "") {
            Dlt.DltRecordStatusEnum.DLTRECORDSTATUS_SUCCEEDED
        } else {
            Dlt.DltRecordStatusEnum.DLTRECORDSTATUS_FAILED
        }
        println("Put data status: $error")
        return Dlt.DltRecordStatus.newBuilder()
            .setRecordId(request.recordId)
            .setStatus(dltStatusEnum)
@@ -65,19 +79,9 @@ class DLTService(private val connector: FabricConnector): DltServiceGrpcKt.DltSe
        return connector.getData(request.recordUuid.uuid)
    }

    override fun subscribeToDlt(request: Dlt.DltRecordSubscription): Flow<Dlt.DltRecordEvent> = flow {
    override fun subscribeToDlt(request: Dlt.DltRecordSubscription): Flow<Dlt.DltRecordEvent> {
        println("Subscription request: $request")
        val c = connector.subscribeForEvents()
        println("Got channel")
        val event = c.receive()
        println("Received event from channel")

        // TODO: mistype, proto scheme fix required
        if (request.operationValueList.contains(event.event.eventType.number)) {
            if (request.typeList.contains(event.recordId.type)) {
                emit(event)
            }
        }
        return connector.subscribeForEvents().consumeAsFlow()
    }

    override suspend fun getDltStatus(request: ContextOuterClass.TeraFlowController): Dlt.DltPeerStatus {