Skip to content

Fix #1060: add an SMPP source Kamelet - #2989

Merged
oscerd merged 2 commits into
apache:mainfrom
oscerd:ci-issue-1060
Sep 1, 2026
Merged

Fix #1060: add an SMPP source Kamelet#2989
oscerd merged 2 commits into
apache:mainfrom
oscerd:ci-issue-1060

Conversation

@oscerd

@oscerd oscerd commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Fixes #1060. Companion to #2988 (smpp-sink, #1059) — same component, same connection surface, reviewable independently.

Adds smpp-source, which receives SMS messages and delivery receipts from a SMSC using camel-smpp. The short message text becomes the body; the received PDU details stay in the CamelSmpp* headers the component already sets (CamelSmppMessageType, CamelSmppStatus, CamelSmppDelivered, CamelSmppSubmitDate, CamelSmppOptionalParameters, …), so nothing is remapped or hidden.

from:
  uri: "smpp:{{host}}:{{port}}"
  parameters:
    systemId: "{{systemId}}"
    password: "{{?password}}"
    systemType: "{{?systemType}}"
    addressRange: "{{?addressRange}}"
    encoding: "{{encoding}}"
    usingSSL: "{{usingSSL}}"
  steps:
  - to: "kamelet:sink"

Properties

Only host is required.

property default notes
host required
port 2775
systemId smppclient credentials descriptor
password format: password + credentials descriptor
systemType ESME type, max 13 chars
addressRange consumer-side; tells the SMSC which messages to route to this ESME (SMPP 3.4 §5.2.7)
encoding ISO-8859-1
usingSSL false

addressRange is the one option that differs from the sink — it is the consumer-labelled option in the component and has no meaning on the producer side. Conversely the sink's sourceAddr / destAddr / splittingPolicy are producer-only and are deliberately absent here.

Verification

script/validator reports no errors, script/generator adds the nav.adoc entry, mvn clean install passes from the repository root.

Parameter binding checked against the real component with camel run rather than by eye — the consumer endpoint is constructed and startup fails only on the missing SMSC:

Error starting CamelContext (smpp-src-probe) due to exception thrown:
  java.io.IOException: Connection refused
Caused by: java.net.ConnectException: Connection refused

A mistyped option would have failed earlier with unknown option instead.

Same two caveats as the sink

No Citrus testcamel-smpp needs a live SMSC and the project's Citrus/Testcontainers toolchain has no SMSC simulator. Marked Preview, no kamelet.verified=true. Happy to add the test in a follow-up if there is an SMSC image the project will depend on.

usingSSL defaults to false, matching the component default and the plain smpp scheme. Worth a reviewer's eye given the catalog's secure-by-default direction (#2954, #2955, #2956), but SMPP-over-TLS is not widely supported by SMSCs, so defaulting it on would make the Kamelet unusable against most of them.

This is a source Kamelet, so the usual operator note applies: it binds outward to the SMSC you configure, and the SMSC decides what to deliver to it via addressRange.


Claude Code on behalf of Andrea Cosentino

Receives SMS messages and delivery receipts from a SMSC using the SMPP
protocol (camel-smpp). The short message text becomes the body; the
received PDU details stay in the CamelSmpp* headers the component sets.

Exposes the connection options an operator needs -- host, port, systemId,
password, systemType, encoding and usingSSL -- plus addressRange, which is
the consumer-side option that tells the SMSC which messages to route to
this ESME. systemId and password carry the credentials descriptor;
password is format: password.

Marked Preview for the same reason as the sink (apache#1059): there is no SMSC
simulator in the project's test toolchain, so this ships without a Citrus
test and without kamelet.verified.

Parameter binding verified against the real camel-smpp component with
`camel run`: the consumer endpoint is created and startup fails only with
ConnectException (no SMSC on localhost), not with an unknown-option error.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@oscerd
oscerd merged commit e5d38ae into apache:main Sep 1, 2026
6 checks passed
oscerd added a commit to oscerd/camel-kamelets-validator that referenced this pull request Sep 1, 2026
KameletsCatalogTest.testGetKameletsByNamespace asserts an exact count for
the AWS namespace, so adding aws-bedrock-agent-sink takes it from 31 to
32 and the catalog module's tests fail.

Verified against the tree rather than just following the CI delta: 31
kamelets carry kamelet.namespace "AWS" on main, 32 with this branch.

Only the AWS namespace is count-asserted, which is why the SMPP and SNMP
Kamelets added in apache#2988, apache#2989 and apache#2990 did not trip it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
oscerd added a commit that referenced this pull request Sep 3, 2026
* Fix #1938: add an AWS Bedrock Agent sink Kamelet

The catalog already covers aws-bedrock (aws-bedrock-text-sink) and
aws-bedrock-agent-runtime (aws-bedrock-agent-runtime-sink). The
aws-bedrock-agent component had no Kamelet, which is the gap this closes:
managing the data source ingestion jobs of a knowledge base via
startIngestionJob, listIngestionJobs and getIngestionJob.

BedrockAgentProducer.determineOperation reads CamelAwsBedrockAgentOperation
from the message before falling back to the endpoint, and knowledgeBaseId
and dataSourceId are header-overridable the same way. A sink that pins
those three as properties therefore has to strip the family, or an inbound
header could redirect the call to a different knowledge base or a different
operation. Same shape as the aws-ec2-sink strip.

CamelAwsBedrockAgentIngestionJobId is excluded from the strip: it is the
one input the Kamelet deliberately takes from the message, since
getIngestionJob has to name a job.

Marked Preview, no Citrus test: exercising this needs a real Bedrock
knowledge base and there is no emulator for it in the project's toolchain.

Verified with `camel run` against the real component -- the route starts
with every parameter bound -- and the strip verified with the terminal
endpoint swapped for a log:

  in:  Operation=listIngestionJobs, KnowledgeBaseId=attacker-kb,
       DataSourceId=attacker-ds, IngestionJobId=job-42, keepMe=yes
  out: CamelAwsBedrockAgentIngestionJobId=job-42, keepMe=yes

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Fix #1938: update the AWS namespace count in KameletsCatalogTest

KameletsCatalogTest.testGetKameletsByNamespace asserts an exact count for
the AWS namespace, so adding aws-bedrock-agent-sink takes it from 31 to
32 and the catalog module's tests fail.

Verified against the tree rather than just following the CI delta: 31
kamelets carry kamelet.namespace "AWS" on main, 32 with this branch.

Only the AWS namespace is count-asserted, which is why the SMPP and SNMP
Kamelets added in #2988, #2989 and #2990 did not trip it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Create a Kamelet SMPP Source

1 participant