Repository: didx-xyz/acapy-cloud
Pull request #1400: 🔨  Add deep connect-cloud liveness probes
Author: login: henrymsiska
Created: 2025-03-20T09:11:33Z | Merged: 2025-03-20T10:17:35Z

Adds probe processor to facilitate deep liveness checks:

- probes.yml: provides the http endpoint at /probes/livez
  - aggregates the various probes to give a global result: e.g.
    - 200 response:
      ```json
      {
        "is_live": true,
        "nats": {
          "read": {
            "cached_timestamp": "2025-03-19T12:44:00Z",
            "is_cached": true,
            "is_live": true
          },
          "write": {
            "cached_timestamp": "2025-03-19T12:44:00Z",
            "is_cached": true,
            "is_live": true
          }
        }
      }
      ```
    - 503 response:
      ```json
      {
        "is_live": false,
        "nats": {
          "read": {
            "cached_timestamp": "2025-03-19T12:44:00Z",
            "is_cached": true,
            "is_live": false
          },
          "write": {
            "cached_timestamp": "2025-03-19T12:44:00Z",
            "is_cached": true,
            "is_live": true
          }
        }
      }
      ```
- probe-nats-write.yml: provides the probe for the nats write endpoint
  - uses an in memory cache to facilitate the live probe check
  - publishes a timestamp to a probe subject at a configurable interval
  - updates write cache with the timestamp if nats publish succeeds
- probe-nats-read.yml: provides the probe for the nats read endpoint
  - uses an in memory cache to facilitate the live probe check
  - subscribes to the probe subject
  - updates the read cache with the timestamp of if a message is received
- probe-resources.yml: provides the resources for the probes
  - a cache for storing the timestamps of the heartbeats
  - a rate limit for the number of heartbeats that can be emitted in a given time


Diff:
diff --git a/.github/actions/deploy-eks/action.yml b/.github/actions/deploy-eks/action.yml
index 4691698f99..ff4dc9d100 100644
--- a/.github/actions/deploy-eks/action.yml
+++ b/.github/actions/deploy-eks/action.yml
@@ -41,10 +41,10 @@ inputs:
   namespace:
     description: The Kubernetes namespace to deploy to
     required: true
-  pipelines-dir:
-    description: The directory containing the Redpanda Connect pipelines
+  connect-configs-dir:
+    description: The directory containing the Redpanda Connect configurations
     required: true
-    default: ./resources/connect-processors/cloud/pipelines
+    default: ./resources/connect-processors/cloud
 
 runs:
   using: composite
@@ -84,15 +84,19 @@ runs:
       # https://docs.redpanda.com/redpanda-connect/get-started/quickstarts/helm-chart/#run-multiple-pipelines-in-streams-mode
       run: |
         kubectl create configmap connect-cloud-pipelines \
-          --from-file=$PIPELINES_DIR \
+          --from-file=${CONFIGS_DIR}/pipelines \
+          --dry-run=client \
+          -o yaml \
+          -n $NAMESPACE | kubectl apply -f -
+        kubectl create configmap connect-cloud-resources \
+          --from-file=${CONFIGS_DIR}/resources \
           --dry-run=client \
           -o yaml \
           -n $NAMESPACE | kubectl apply -f -
         kubectl -n $NAMESPACE rollout restart deploy/connect-cloud || true
       env:
         NAMESPACE: ${{ inputs.namespace }}
-        PIPELINES_DIR: ${{ inputs.pipelines-dir }}
-
+        CONFIGS_DIR: ${{ inputs.connect-configs-dir }}
     - name: Helmfile Apply
       # https://github.com/helmfile/helmfile-action
       uses: helmfile/helmfile-action@v2
diff --git a/helm/acapy-cloud/README.md b/helm/acapy-cloud/README.md
index 96988e5d87..73e67fc14f 100644
--- a/helm/acapy-cloud/README.md
+++ b/helm/acapy-cloud/README.md
@@ -49,12 +49,21 @@ Replace `<component>` with one of the available components (e.g., `endorser`, `g
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
 
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+-  Config Map with the processor pipelines:
+
+  ```bash
+  kubectl create configmap connect-cloud-pipelines \
+    --from-file=resources/connect-processors/cloud/pipelines
+  ```
+
+-  Config Map with the processor resources:
+
+  ```bash
+  kubectl create configmap connect-cloud-resources \
+    --from-file=resources/connect-processors/cloud/resources
+  ```
 
 Refer to [`acapy-cloud.yaml.gotmpl`](../acapy-cloud.yaml.gotmpl) and
 [`connect-cloud.yaml`](./conf/local/connect-cloud.yaml) for an example on installing/configuring Redpanda Connect.
diff --git a/helm/acapy-cloud/conf/dev/connect-cloud.yaml b/helm/acapy-cloud/conf/dev/connect-cloud.yaml
index b33458eaed..a2681bd627 100644
--- a/helm/acapy-cloud/conf/dev/connect-cloud.yaml
+++ b/helm/acapy-cloud/conf/dev/connect-cloud.yaml
@@ -21,6 +21,23 @@ streams:
 deployment:
   podLabels:
     sidecar.istio.io/inject: "false"
+  livenessProbe:
+    failureThreshold: 3
+    #NOTE: The periodSeconds is the default value for the liveness probe. If this is overridden, a corresponding value should be set in the env for PROBE_INTERVAL.
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 5
+    httpGet:
+      path: /probes/livez
+      port: http
+
+args:
+  - -r
+  - /resources/*.yaml
+  - "-c"
+  - "/redpanda-connect.yaml"
+  - "streams"
+  - /streams/*.yaml
 
 env:
   - name: GOVERNANCE_ACAPY_LABEL
@@ -44,7 +61,20 @@ initContainers:
           echo waiting for nats cloudapi_aries_events stream;
           sleep 2;
         done
+        until nats --server nats://nats:4222 str info cloudapi_aries_events_probes >/dev/null 2>&1; do
+          echo waiting for nats cloudapi_aries_events_probes stream;
+          sleep 2;
+        done
         until nats --server nats://nats:4222 str info cloudapi_aries_state_monitoring >/dev/null 2>&1; do
           echo waiting for nats cloudapi_aries_state_monitoring stream;
           sleep 2;
         done
+
+extraVolumes:
+  - name: resources
+    configMap:
+      name: connect-cloud-resources
+extraVolumeMounts:
+  - name: resources
+    mountPath: /resources
+    readOnly: true
diff --git a/helm/acapy-cloud/conf/local/connect-cloud.yaml b/helm/acapy-cloud/conf/local/connect-cloud.yaml
index b3b84c9378..e176aad8ca 100644
--- a/helm/acapy-cloud/conf/local/connect-cloud.yaml
+++ b/helm/acapy-cloud/conf/local/connect-cloud.yaml
@@ -21,6 +21,23 @@ streams:
 deployment:
   podLabels:
     sidecar.istio.io/inject: "false"
+  livenessProbe:
+    failureThreshold: 3
+    #NOTE: The periodSeconds is the default value for the liveness probe. If this is overridden, a corresponding value should be set in the env for PROBE_INTERVAL.
+    periodSeconds: 10
+    successThreshold: 1
+    timeoutSeconds: 5
+    httpGet:
+      path: /probes/livez
+      port: http
+
+args:
+  - -r
+  - /resources/*.yaml
+  - "-c"
+  - "/redpanda-connect.yaml"
+  - "streams"
+  - /streams/*.yaml
 
 env:
   - name: GOVERNANCE_ACAPY_LABEL
@@ -44,7 +61,20 @@ initContainers:
           echo waiting for nats cloudapi_aries_events stream;
           sleep 2;
         done
+        until nats --server nats://nats:4222 str info cloudapi_aries_events_probes >/dev/null 2>&1; do
+          echo waiting for nats cloudapi_aries_events_probes stream;
+          sleep 2;
+        done
         until nats --server nats://nats:4222 str info cloudapi_aries_state_monitoring >/dev/null 2>&1; do
           echo waiting for nats cloudapi_aries_state_monitoring stream;
           sleep 2;
         done
+
+extraVolumes:
+  - name: resources
+    configMap:
+      name: connect-cloud-resources
+extraVolumeMounts:
+  - name: resources
+    mountPath: /resources
+    readOnly: true
diff --git a/helm/nats/values.yaml b/helm/nats/values.yaml
index c68259ff56..76a637b980 100644
--- a/helm/nats/values.yaml
+++ b/helm/nats/values.yaml
@@ -14,6 +14,15 @@ postInstall:
         - cloudapi.aries.events.*.*
       defaults: true
       storage: file
+    cloudapi_aries_events_probes:
+      subjects:
+        - cloudapi.aries.events.probe
+      defaults: true
+      storage: file
+      retention: limits
+      discard: old
+      maxAge: 10m
+      maxMsgsPerSubject: 100
     cloudapi_aries_state_monitoring:
       subjects:
         - cloudapi.aries.state_monitoring.*.*.>
diff --git a/resources/connect-processors/cloud/pipelines/probe-nats-read.yaml b/resources/connect-processors/cloud/pipelines/probe-nats-read.yaml
new file mode 100644
index 0000000000..e43fe5f7b8
--- /dev/null
+++ b/resources/connect-processors/cloud/pipelines/probe-nats-read.yaml
@@ -0,0 +1,35 @@
+input:
+  label: "nats_input"
+  nats_jetstream:
+    urls:
+      - ${NATS_URL:nats://nats:4222}
+    subject: ${PROBE_NATS_INPUT_SUBJECT:cloudapi.aries.events.probe}
+    stream: ${PROBE_NATS_INPUT_STREAM:"cloudapi_aries_events_probes"}
+    durable: ${PROBE_NATS_INPUT_CONSUMER_NAME:probe-read-cloud-events}
+    queue: ${PROBE_NATS_INPUT_QUEUE_GROUP:""}
+    bind: ${PROBE_NATS_INPUT_BIND:false}
+    deliver: ${PROBE_NATS_INPUT_DELIVER:"last"}
+    auth:
+      user_credentials_file: ${NATS_AUTH_CREDENTIALS_FILE:""}
+    max_ack_pending: ${PROBE_NATS_INPUT_MAX_ACK_PENDING:1}
+
+output:
+  fallback:
+    - reject_errored:
+        label: "update_read_cache"
+        cache:
+          target: probe_read_cache
+          key: ${PROBE_NATS_OUTPUT_SUBJECT:cloudapi.aries.events.probe.read}
+    - label: "dead_letter_queue"
+      processors:
+      - label: "dead_letter_queue_mapping"
+        mapping: |
+          #!blobl
+          root.message = this
+          root.metadata = metadata()
+          root.error = error()
+      - label: "dead_letter_queue_log"
+        log:
+          level: ERROR
+          message: "Processing failed due to: ${!error()}"
+      stdout: {}
diff --git a/resources/connect-processors/cloud/pipelines/probe-nats-write.yaml b/resources/connect-processors/cloud/pipelines/probe-nats-write.yaml
new file mode 100644
index 0000000000..0f741b45e2
--- /dev/null
+++ b/resources/connect-processors/cloud/pipelines/probe-nats-write.yaml
@@ -0,0 +1,40 @@
+input:
+  label: generate_heartbeat
+  generate:
+    interval: ${PROBE_INTERVAL:10s}
+    mapping: |
+      #!blobl
+      root = timestamp_unix()
+
+output:
+  fallback:
+    - reject_errored:
+        label: "publish_heartbeat"
+        broker:
+          pattern: fan_out_sequential
+          outputs:
+            - label: "publish_heartbeat_nats"
+              nats_jetstream:
+                urls:
+                  - ${NATS_URL:nats://nats:4222}
+                subject: ${PROBE_NATS_OUTPUT_SUBJECT:cloudapi.aries.events.probe}
+                auth:
+                  user_credentials_file: ${NATS_AUTH_CREDENTIALS_FILE:""}
+                max_in_flight: ${PROBE_NATS_OUTPUT_MAX_IN_FLIGHT:1}
+            - label: "update_cache"
+              cache:
+                target: probe_write_cache
+                key: ${PROBE_NATS_OUTPUT_SUBJECT:cloudapi.aries.events.probe.write}
+    - label: "dead_letter_queue"
+      processors:
+      - label: "dead_letter_queue_mapping"
+        mapping: |
+          #!blob
+          root.message = this
+          root.metadata = metadata()
+          root.error = error()
+      - label: "dead_letter_queue_log"
+        log:
+          level: ERROR
+          message: "Processing failed due to: ${!error()}"
+      stdout: {}
diff --git a/resources/connect-processors/cloud/pipelines/probes.yaml b/resources/connect-processors/cloud/pipelines/probes.yaml
new file mode 100644
index 0000000000..a643438915
--- /dev/null
+++ b/resources/connect-processors/cloud/pipelines/probes.yaml
@@ -0,0 +1,124 @@
+input:
+  label: "probe_liveness"
+  http_server:
+    address: ""
+    path: /livez
+    allowed_verbs:
+      - GET
+    timeout: ${PROBE_TIMEOUT:5s}
+    rate_limit: probe_rate_limit
+    sync_response:
+      status: ${! @status }
+      headers:
+        Content-Type: application/json
+
+pipeline:
+  processors:
+    - label: query_time
+      mapping: |
+        #!blobl
+        meta query_time = timestamp_unix()
+        meta probe_interval = env("PROBE_INTERVAL").or("10s").parse_duration() / 1000000000
+    - label: "log_request"
+      log:
+        level: DEBUG
+        message: 'Request received'
+        fields_mapping: |
+          #!blobl
+          if (content() != null) {
+            root.connect.message = content()
+          }
+          root.connect.metadata = metadata()
+    - label: "process_write_probe"
+      branch:
+        processors:
+          - label: "check_write_cache"
+            cache:
+              resource: probe_write_cache
+              operator: get
+              key: ${PROBE_NATS_OUTPUT_SUBJECT:cloudapi.aries.events.probe.write}
+          - label: "log_write_cache"
+            log:
+              level: DEBUG
+              message: 'Write cache:'
+              fields_mapping: |
+                #!blobl
+                root.connect.message = this
+          - label: "map_write_cache"
+            mapping: |
+              #!blobl
+              let ts = this
+              if (this != null) {
+                root.cached_timestamp = $ts.ts_format()
+                root.is_cached = true
+                root.is_live = (metadata("query_time").number() - $ts) <= metadata("probe_interval").number()
+              } else {
+                root.cached_timestamp = null
+                root.is_cached = false
+                root.is_live = false
+              }
+          - label: "log_probe_write_cache"
+            log:
+              level: DEBUG
+              message: 'Probe write cache:'
+              fields_mapping: |
+                #!blobl
+                root.connect.message = this
+        result_map: |
+          #!blobl
+          root.nats.write = this
+          meta = metadata()
+    - label: "process_read_probe"
+      branch:
+        processors:
+          - label: "check_read_cache"
+            cache:
+              resource: probe_read_cache
+              operator: get
+              key: ${PROBE_NATS_OUTPUT_SUBJECT:cloudapi.aries.events.probe.read}
+          - label: "map_read_cache"
+            mapping: |
+              #!blobl
+              let ts = this
+              if (this != null) {
+                root.cached_timestamp = $ts.ts_format()
+                root.is_cached = true
+                root.is_live = (metadata("query_time").number() - $ts) <= metadata("probe_interval").number()
+              } else {
+                root.cached_timestamp = null
+                root.is_cached = false
+                root.is_live = false
+              }
+          - label: "log_probe_read_cache"
+            log:
+              level: DEBUG
+              message: 'Probe read cache:'
+              fields_mapping: |
+                #!blobl
+                root.connect.message = this
+        result_map: |
+          #!blobl
+          root.nats.read = this
+          meta = metadata()
+    - label: probe_result
+      mapping: |
+        #!blobl
+        root = this
+        meta status = 200
+        root.is_live = true
+        if (this.nats.write.is_live == false || this.nats.read.is_live == false) {
+          meta status = 503
+          root.is_live = false
+        }
+    - label: "log_probe_result"
+      log:
+        level: DEBUG
+        message: 'Probe result:'
+        fields_mapping: |
+          #!blobl
+          root.connect.message = this
+          root.connect.metadata = metadata()
+
+output:
+  label: "probe_endpoints_output"
+  sync_response: {}
diff --git a/resources/connect-processors/cloud/resources/probe-resources.yaml b/resources/connect-processors/cloud/resources/probe-resources.yaml
new file mode 100644
index 0000000000..3d18b0c337
--- /dev/null
+++ b/resources/connect-processors/cloud/resources/probe-resources.yaml
@@ -0,0 +1,14 @@
+cache_resources:
+  - label: probe_write_cache
+    memory:
+      default_ttl: ${PROBE_CACHE_TTL:60s}
+
+  - label: probe_read_cache
+    memory:
+      default_ttl: ${PROBE_CACHE_TTL:60s}
+
+rate_limit_resources:
+  - label: probe_rate_limit
+    local:
+      count: ${PROBE_RATE_LIMIT_COUNT:5}
+      interval: ${PROBE_RATE_LIMIT_INTERVAL:1s}
diff --git a/tilt/acapy-cloud/Tiltfile b/tilt/acapy-cloud/Tiltfile
index 53a10807b4..6f392f7a77 100644
--- a/tilt/acapy-cloud/Tiltfile
+++ b/tilt/acapy-cloud/Tiltfile
@@ -138,37 +138,18 @@ def setup_nats(namespace):
     )
 
 
-def setup_redpanda_connect_cloud(namespace):
-    print(color.green("Installing Redpanda Connect Cloud Processor..."))
-
-    resource_name = "connect-cloud"
-    project_root = os.getcwd()
-    current_dir = os.path.abspath(os.path.dirname(__file__))
-    values_file = project_root + "/helm/acapy-cloud/conf/local/connect-cloud.yaml"
-
-    helm_repo(
-        name="redpanda",
-        url="https://charts.redpanda.com",
-        resource_name="redpanda-repo-cloud",
-        labels=["10-helm-repos"],
-    )
-
-    pipeline_config_dir = project_root + "/resources/connect-processors/cloud/pipelines"
-    pipeline_config_files = str(
-        local("find " + pipeline_config_dir + ' -type f -name "*.yaml"', quiet=True)
-    ).splitlines()
-    print(color.green("Pipeline config files: " + str(pipeline_config_files)))
-    from_file_args = " ".join(["--from-file=" + f for f in pipeline_config_files])
-
-    # Create ConfigMap using kubectl but output only the YAML
+def apply_connect_config_map(
+    namespace, resource_name, config_dir, from_file_args, deps=[]
+):
+    print(color.green("Applying Redpanda Connect Config Map..."))
     k8s_context = os.environ.get("KIND_K8S_CONTEXT")
+
     local_resource(
-        name=resource_name + "-pipelines",
+        name=resource_name,
         cmd="kubectl --context="
         + k8s_context
         + " create configmap "
         + resource_name
-        + "-pipelines"
         + " "
         + from_file_args
         + " --dry-run=client -o yaml"
@@ -184,12 +165,68 @@ def setup_redpanda_connect_cloud(namespace):
         + " -l 'app.kubernetes.io/instance="
         + resource_name
         + "' --ignore-not-found=true",
-        deps=pipeline_config_files,
+        deps=deps,
         labels=["03-streaming"],
         allow_parallel=True,
         resource_deps=["cloudapi-ns"],
     )
 
+
+def setup_redpanda_connect_cloud(namespace):
+    print(color.green("Installing Redpanda Connect Cloud Processor..."))
+
+    resource_name = "connect-cloud"
+    project_root = os.getcwd()
+    current_dir = os.path.abspath(os.path.dirname(__file__))
+    values_file = project_root + "/helm/acapy-cloud/conf/local/connect-cloud.yaml"
+
+    helm_repo(
+        name="redpanda",
+        url="https://charts.redpanda.com",
+        resource_name="redpanda-repo-cloud",
+        labels=["10-helm-repos"],
+    )
+
+    connect_config_dir = project_root + "/resources/connect-processors/cloud"
+    pipeline_config_files = str(
+        local(
+            "find " + connect_config_dir + '/pipelines -type f -name "*.yaml"',
+            quiet=True,
+        )
+    ).splitlines()
+    print(color.green("Pipeline config files: " + str(pipeline_config_files)))
+    pipeline_from_file_args = " ".join(
+        ["--from-file=" + f for f in pipeline_config_files]
+    )
+
+    # Create ConfigMap using kubectl but output only the YAML
+    apply_connect_config_map(
+        namespace,
+        resource_name + "-pipelines",
+        connect_config_dir + "/pipelines",
+        pipeline_from_file_args,
+        pipeline_config_files,
+    )
+
+    resource_config_files = str(
+        local(
+            "find " + connect_config_dir + '/resources -type f -name "*.yaml"',
+            quiet=True,
+        )
+    ).splitlines()
+    print(color.green("Resource config files: " + str(resource_config_files)))
+    resource_from_file_args = " ".join(
+        ["--from-file=" + f for f in resource_config_files]
+    )
+
+    apply_connect_config_map(
+        namespace,
+        resource_name + "-resources",
+        connect_config_dir + "/resources",
+        resource_from_file_args,
+        resource_config_files,
+    )
+
     ## Create helm release
     # https://github.com/redpanda-data/helm-charts/tree/main/charts/connect
     helm_resource(


Reviews:
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-20T09:16:28Z
user: login: rblaine95
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-20T09:25:21Z
user: login: rblaine95
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-20T09:58:51Z
user: login: ff137
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-20T10:13:39Z

Review comments:
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Lists should be surrounded by blank lines

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7835)
created_at: 2025-03-20T09:16:27Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Expected: 1; Actual: 2

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7838)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
+  ```bash
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Fenced code blocks should be surrounded by blank lines

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7832)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
+  ```bash
+  kubectl create configmap connect-cloud-pipelines \
+    --from-file=resources/connect-processors/cloud/pipelines
+  ```
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Fenced code blocks should be surrounded by blank lines

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7833)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
+  ```bash
+  kubectl create configmap connect-cloud-pipelines \
+    --from-file=resources/connect-processors/cloud/pipelines
+  ```
+-  Config Map with the processor resources:
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Expected: 1; Actual: 2

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7836)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
+  ```bash
+  kubectl create configmap connect-cloud-pipelines \
+    --from-file=resources/connect-processors/cloud/pipelines
+  ```
+-  Config Map with the processor resources:
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Lists should be surrounded by blank lines

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7837)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,17 @@
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
-
-```bash
-kubectl create configmap connect-cloud-pipelines \
-  --from-file=resources/connect-processors/cloud/pipelines
-```
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
+-  Config Map with the processor pipelines:
+  ```bash
+  kubectl create configmap connect-cloud-pipelines \
+    --from-file=resources/connect-processors/cloud/pipelines
+  ```
+-  Config Map with the processor resources:
+  ```bash
path: helm/acapy-cloud/README.md
user: login: github-advanced-security[bot]
body: Fenced code blocks should be surrounded by blank lines

[Show more details](https://github.com/didx-xyz/acapy-cloud/security/code-scanning/7834)
created_at: 2025-03-20T09:16:28Z
author_association: NONE
diff_hunk: @@ -49,12 +49,21 @@ Replace `<component>` with one of the available components (e.g., `endorser`, `g
 acapy-cloud uses Redpanda Connect for event processing. The pipelines are defined in the
 [connect-processors](../../resources/connect-processors) directory.
 
-Before installing Redpanda Connect, you will need to manually create a Config Map with the processor pipelines:
+Before installing Redpanda Connect, you will need to manually create therequired config maps:
path: helm/acapy-cloud/README.md
user: login: rblaine95
body: ```suggestion
Before installing Redpanda Connect, you will need to manually create the required config maps:
```
created_at: 2025-03-20T09:25:21Z
author_association: COLLABORATOR

PR comments:
user: login: ff137
created_at: 2025-03-20T09:20:58Z
body: Just briefly marking as draft, because EKS runs will fail while regression changes are in progress
author_association: COLLABORATOR
user: login: ff137
created_at: 2025-03-20T09:39:25Z
body: Regression changes merged - can now be rebased and marked ready 👍 
author_association: COLLABORATOR
user: login: sonarqubecloud[bot]
created_at: 2025-03-20T09:44:47Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=didx-xyz_acapy-cloud&pullRequest=1400) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=didx-xyz_acapy-cloud&pullRequest=1400&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=didx-xyz_acapy-cloud&pullRequest=1400&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=didx-xyz_acapy-cloud&pullRequest=1400&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=didx-xyz_acapy-cloud&pullRequest=1400&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=didx-xyz_acapy-cloud&pullRequest=1400&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=didx-xyz_acapy-cloud&pullRequest=1400)


author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-20T10:02:55Z
body: <!-- Pytest Coverage Comment: deploy-test-eks -->
<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-93%25-brightgreen.svg" /></a><details><summary>K8s Test Coverage </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>app</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/main.py">main.py</a></td><td>80</td><td>2</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/main.py#L121-L122">121&ndash;122</a></td></tr><tr><td colspan="5"><b>app/models</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/models/wallet.py">wallet.py</a></td><td>36</td><td>4</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/models/wallet.py#L100-L105">100&ndash;105</a></td></tr><tr><td colspan="5"><b>app/routes</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py">issuer.py</a></td><td>119</td><td>2</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py#L99">99</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py#L194">194</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py">jsonld.py</a></td><td>60</td><td>47</td><td>22%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py#L23-L93">23&ndash;93</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py#L104-L137">104&ndash;137</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py">messaging.py</a></td><td>24</td><td>11</td><td>54%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py#L43-L52">43&ndash;52</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py#L85-L95">85&ndash;95</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/trust_registry.py">trust_registry.py</a></td><td>62</td><td>2</td><td>97%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/trust_registry.py#L52-L53">52&ndash;53</a></td></tr><tr><td colspan="5"><b>app/routes/wallet</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py">credentials.py</a></td><td>80</td><td>53</td><td>34%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L57-L70">57&ndash;70</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L96-L108">96&ndash;108</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L129-L140">129&ndash;140</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L166-L180">166&ndash;180</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L216-L232">216&ndash;232</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L266-L283">266&ndash;283</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L309-L321">309&ndash;321</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L342-L353">342&ndash;353</a></td></tr><tr><td colspan="5"><b>app/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py">acapy_wallet.py</a></td><td>40</td><td>4</td><td>90%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py#L60-L61">60&ndash;61</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py#L98-L99">98&ndash;99</a></td></tr><tr><td colspan="5"><b>app/services/onboarding</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py">tenants.py</a></td><td>63</td><td>49</td><td>22%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py#L30-L103">30&ndash;103</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py#L113-L143">113&ndash;143</a></td></tr><tr><td colspan="5"><b>app/services/onboarding/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py">set_endorser_metadata.py</a></td><td>72</td><td>40</td><td>44%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L32-L34">32&ndash;34</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L58-L60">58&ndash;60</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L85-L87">85&ndash;87</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L118-L137">118&ndash;137</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L149-L160">149&ndash;160</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L172-L185">172&ndash;185</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L198-L212">198&ndash;212</a></td></tr><tr><td colspan="5"><b>app/services/trust_registry</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py">actors.py</a></td><td>107</td><td>9</td><td>92%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L95-L100">95&ndash;100</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L110">110</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L209-L210">209&ndash;210</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L212-L217">212&ndash;217</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L282-L285">282&ndash;285</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py">schemas.py</a></td><td>54</td><td>9</td><td>83%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py#L57-L63">57&ndash;63</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py#L89-L99">89&ndash;99</a></td></tr><tr><td colspan="5"><b>app/services/trust_registry/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/util/actor.py">actor.py</a></td><td>31</td><td>2</td><td>94%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/util/actor.py#L26-L27">26&ndash;27</a></td></tr><tr><td colspan="5"><b>app/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/assert_public_did.py">assert_public_did.py</a></td><td>18</td><td>8</td><td>56%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/assert_public_did.py#L17-L33">17&ndash;33</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py">credentials.py</a></td><td>14</td><td>2</td><td>86%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py#L13">13</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py#L18">18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py">retry_method.py</a></td><td>36</td><td>15</td><td>58%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L20-L35">20&ndash;35</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L76-L77">76&ndash;77</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L91-L103">91&ndash;103</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/save_exchange_record.py">save_exchange_record.py</a></td><td>13</td><td>1</td><td>92%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/save_exchange_record.py#L29">29</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py">tenants.py</a></td><td>45</td><td>17</td><td>62%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L24-L29">24&ndash;29</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L44-L45">44&ndash;45</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L52-L59">52&ndash;59</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L90-L91">90&ndash;91</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L97">97</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L124">124</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/transaction_acked.py">transaction_acked.py</a></td><td>14</td><td>2</td><td>86%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/transaction_acked.py#L34-L35">34&ndash;35</a></td></tr><tr><td colspan="5"><b>shared</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py">log_config.py</a></td><td>53</td><td>20</td><td>62%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L41-L94">41&ndash;94</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L103-L110">103&ndash;110</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L152">152</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L161-L173">161&ndash;173</a></td></tr><tr><td colspan="5"><b>shared/models</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/connection_record.py">connection_record.py</a></td><td>24</td><td>1</td><td>96%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/connection_record.py#L47">47</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py">endorsement.py</a></td><td>87</td><td>69</td><td>21%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L36-L70">36&ndash;70</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L94-L124">94&ndash;124</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L134-L183">134&ndash;183</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/protocol.py">protocol.py</a></td><td>10</td><td>1</td><td>90%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/protocol.py#L18">18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py">trustregistry.py</a></td><td>63</td><td>7</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L22">22</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L44">44</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L75-L83">75&ndash;83</a></td></tr><tr><td colspan="5"><b>shared/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py">nats_jetstream.py</a></td><td>36</td><td>4</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L56">56</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L60">60</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L64">64</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L68">68</a></td></tr><tr><td colspan="5"><b>shared/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/api_router.py">api_router.py</a></td><td>14</td><td>1</td><td>93%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/api_router.py#L17">17</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py">mock_agent_controller.py</a></td><td>64</td><td>6</td><td>91%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py#L25">25</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py#L78-L82">78&ndash;82</a></td></tr><tr><td colspan="5"><b>trustregistry</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py">main.py</a></td><td>84</td><td>4</td><td>95%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py#L49-L51">49&ndash;51</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py#L113">113</a></td></tr><tr><td colspan="5"><b>waypoint</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/main.py">main.py</a></td><td>50</td><td>1</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/main.py#L67">67</a></td></tr><tr><td colspan="5"><b>waypoint/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/services/nats_service.py">nats_service.py</a></td><td>137</td><td>2</td><td>99%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/services/nats_service.py#L212-L213">212&ndash;213</a></td></tr><tr><td><b>TOTAL</b></td><td><b>5338</b></td><td><b>395</b></td><td><b>93%</b></td><td>&nbsp;</td></tr></tbody></table></details>

| Tests | Skipped | Failures | Errors | Time |
| ----- | ------- | -------- | -------- | ------------------ |
| 1032 | 6 :zzz: | 0 :x: | 0 :fire: | 9m 33s :stopwatch: |

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-20T10:02:56Z
body: <!-- Pytest Coverage Comment: deploy-test-eks -->
<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-93%25-brightgreen.svg" /></a><details><summary>K8s Regression Test Coverage </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>app</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/main.py">main.py</a></td><td>80</td><td>2</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/main.py#L121-L122">121&ndash;122</a></td></tr><tr><td colspan="5"><b>app/models</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/models/wallet.py">wallet.py</a></td><td>36</td><td>4</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/models/wallet.py#L100-L105">100&ndash;105</a></td></tr><tr><td colspan="5"><b>app/routes</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py">issuer.py</a></td><td>119</td><td>2</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py#L99">99</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/issuer.py#L194">194</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py">jsonld.py</a></td><td>60</td><td>47</td><td>22%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py#L23-L93">23&ndash;93</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/jsonld.py#L104-L137">104&ndash;137</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py">messaging.py</a></td><td>24</td><td>11</td><td>54%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py#L43-L52">43&ndash;52</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/messaging.py#L85-L95">85&ndash;95</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/trust_registry.py">trust_registry.py</a></td><td>62</td><td>2</td><td>97%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/trust_registry.py#L52-L53">52&ndash;53</a></td></tr><tr><td colspan="5"><b>app/routes/wallet</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py">credentials.py</a></td><td>80</td><td>53</td><td>34%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L57-L70">57&ndash;70</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L96-L108">96&ndash;108</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L129-L140">129&ndash;140</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L166-L180">166&ndash;180</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L216-L232">216&ndash;232</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L266-L283">266&ndash;283</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L309-L321">309&ndash;321</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/routes/wallet/credentials.py#L342-L353">342&ndash;353</a></td></tr><tr><td colspan="5"><b>app/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py">acapy_wallet.py</a></td><td>40</td><td>4</td><td>90%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py#L60-L61">60&ndash;61</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/acapy_wallet.py#L98-L99">98&ndash;99</a></td></tr><tr><td colspan="5"><b>app/services/onboarding</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py">tenants.py</a></td><td>63</td><td>49</td><td>22%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py#L30-L103">30&ndash;103</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/tenants.py#L113-L143">113&ndash;143</a></td></tr><tr><td colspan="5"><b>app/services/onboarding/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py">set_endorser_metadata.py</a></td><td>72</td><td>40</td><td>44%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L32-L34">32&ndash;34</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L58-L60">58&ndash;60</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L85-L87">85&ndash;87</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L118-L137">118&ndash;137</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L149-L160">149&ndash;160</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L172-L185">172&ndash;185</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/onboarding/util/set_endorser_metadata.py#L198-L212">198&ndash;212</a></td></tr><tr><td colspan="5"><b>app/services/trust_registry</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py">actors.py</a></td><td>107</td><td>9</td><td>92%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L95-L100">95&ndash;100</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L110">110</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L209-L210">209&ndash;210</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L212-L217">212&ndash;217</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/actors.py#L282-L285">282&ndash;285</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py">schemas.py</a></td><td>54</td><td>9</td><td>83%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py#L57-L63">57&ndash;63</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/schemas.py#L89-L99">89&ndash;99</a></td></tr><tr><td colspan="5"><b>app/services/trust_registry/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/util/actor.py">actor.py</a></td><td>31</td><td>2</td><td>94%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/services/trust_registry/util/actor.py#L26-L27">26&ndash;27</a></td></tr><tr><td colspan="5"><b>app/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/assert_public_did.py">assert_public_did.py</a></td><td>18</td><td>8</td><td>56%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/assert_public_did.py#L17-L33">17&ndash;33</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py">credentials.py</a></td><td>14</td><td>2</td><td>86%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py#L13">13</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/credentials.py#L18">18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py">retry_method.py</a></td><td>36</td><td>15</td><td>58%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L20-L35">20&ndash;35</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L76-L77">76&ndash;77</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/retry_method.py#L91-L103">91&ndash;103</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/save_exchange_record.py">save_exchange_record.py</a></td><td>13</td><td>1</td><td>92%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/save_exchange_record.py#L29">29</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/string.py">string.py</a></td><td>15</td><td>4</td><td>73%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/string.py#L15-L16">15&ndash;16</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/string.py#L20">20</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/string.py#L24">24</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py">tenants.py</a></td><td>45</td><td>17</td><td>62%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L24-L29">24&ndash;29</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L44-L45">44&ndash;45</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L52-L59">52&ndash;59</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L90-L91">90&ndash;91</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L97">97</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/tenants.py#L124">124</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/transaction_acked.py">transaction_acked.py</a></td><td>14</td><td>2</td><td>86%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/app/util/transaction_acked.py#L34-L35">34&ndash;35</a></td></tr><tr><td colspan="5"><b>shared</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py">log_config.py</a></td><td>53</td><td>20</td><td>62%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L41-L94">41&ndash;94</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L103-L110">103&ndash;110</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L152">152</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/log_config.py#L161-L173">161&ndash;173</a></td></tr><tr><td colspan="5"><b>shared/models</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/connection_record.py">connection_record.py</a></td><td>24</td><td>1</td><td>96%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/connection_record.py#L47">47</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py">endorsement.py</a></td><td>87</td><td>69</td><td>21%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L36-L70">36&ndash;70</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L94-L124">94&ndash;124</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/endorsement.py#L134-L183">134&ndash;183</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/protocol.py">protocol.py</a></td><td>10</td><td>1</td><td>90%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/protocol.py#L18">18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py">trustregistry.py</a></td><td>63</td><td>7</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L22">22</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L44">44</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/models/trustregistry.py#L75-L83">75&ndash;83</a></td></tr><tr><td colspan="5"><b>shared/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py">nats_jetstream.py</a></td><td>36</td><td>4</td><td>89%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L56">56</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L60">60</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L64">64</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/services/nats_jetstream.py#L68">68</a></td></tr><tr><td colspan="5"><b>shared/util</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/api_router.py">api_router.py</a></td><td>14</td><td>1</td><td>93%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/api_router.py#L17">17</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py">mock_agent_controller.py</a></td><td>64</td><td>6</td><td>91%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py#L25">25</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/shared/util/mock_agent_controller.py#L78-L82">78&ndash;82</a></td></tr><tr><td colspan="5"><b>trustregistry</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py">main.py</a></td><td>84</td><td>4</td><td>95%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py#L49-L51">49&ndash;51</a>, <a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/trustregistry/main.py#L113">113</a></td></tr><tr><td colspan="5"><b>waypoint</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/main.py">main.py</a></td><td>50</td><td>1</td><td>98%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/main.py#L67">67</a></td></tr><tr><td colspan="5"><b>waypoint/services</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/services/nats_service.py">nats_service.py</a></td><td>137</td><td>2</td><td>99%</td><td><a href="https://github.com/didx-xyz/acapy-cloud/blob/16a132ec8f10d19c1b0753a50f76e181dab834aa/waypoint/services/nats_service.py#L212-L213">212&ndash;213</a></td></tr><tr><td><b>TOTAL</b></td><td><b>5338</b></td><td><b>399</b></td><td><b>93%</b></td><td>&nbsp;</td></tr></tbody></table></details>

| Tests | Skipped | Failures | Errors | Time |
| ----- | ------- | -------- | -------- | ------------------ |
| 1032 | 47 :zzz: | 0 :x: | 0 :fire: | 6m 20s :stopwatch: |

author_association: NONE