Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
40a273b
chore: add /dev_docs to .gitignore
kelvinprabhu Oct 7, 2026
aaca204
feat(quick-start): add unified network layer mode alongside the multi…
kelvinprabhu Oct 9, 2026
bb5fea5
refactor(quick-start): unified network layer uses loopback HTTP and p…
kelvinprabhu Oct 9, 2026
a31dcc2
fix(quick-start): address review findings on the unified network layer
kelvinprabhu Oct 9, 2026
7f73f0e
feat(adapter-service): add network-layer role (single network adapter…
kelvinprabhu Oct 9, 2026
204446c
feat(adapter-service): enable OpenTelemetry by default and update rel…
kelvinprabhu Oct 9, 2026
f2d4a31
feat(adapter-service): implement single network layer adapter with un…
kelvinprabhu Oct 9, 2026
a977c4f
feat(adapter-service): add network-layer role with configuration and …
kelvinprabhu Oct 9, 2026
1611729
Refactor adapter service to use single-network-layer role
kelvinprabhu Oct 9, 2026
b42f82d
Refactor code structure for improved readability and maintainability
kelvinprabhu Oct 9, 2026
9b51eb9
feat(adapter-service): update single network layer configuration and …
kelvinprabhu Oct 10, 2026
05a016a
feat(adapter-service): update values.yaml with default VISTAAR_TOKEN_…
kelvinprabhu Oct 10, 2026
2a9a966
feat(adapter-service): remove default VISTAAR_TOKEN_URL substitution …
kelvinprabhu Oct 10, 2026
82c0ae4
Add OpenAgriNet local environment configuration for single network layer
kelvinprabhu Oct 12, 2026
96b1648
feat(adapter-service): add single network layer adapter configuration…
kelvinprabhu Oct 12, 2026
762c4a3
Refactor adapter service from single-network-layer to network-adapter…
kelvinprabhu Oct 12, 2026
74d2b4a
feat(adapter-service): update documentation for network-adapter-layer…
kelvinprabhu Oct 12, 2026
ee5b6c3
feat(adapter-service): update documentation and configurations for ne…
kelvinprabhu Oct 12, 2026
2f8bc5f
fix(quick-start): make smoke waits for the registry; document the sha…
kelvinprabhu Oct 12, 2026
cc03a84
docs(adapter-service, quick-start): make the single/multi topologies …
kelvinprabhu Oct 12, 2026
b3d5c7e
feat(adapter-service): update network-adapter values and README for c…
kelvinprabhu Oct 12, 2026
125dc97
fix(adapter-service): clarify routing and tier hop descriptions in do…
kelvinprabhu Oct 12, 2026
8637a73
feat(quick-start): add setup instructions and changelog for single/mu…
kelvinprabhu Oct 13, 2026
b0b6aa3
feat(adapter-service): update default replica count and disable HPA f…
kelvinprabhu Oct 14, 2026
98b6e90
fix(adapter-service): flatten public paths and address PR #75 review …
kelvinprabhu Oct 14, 2026
3dd6f6e
feat(env.example): fix - Run a single adapter through the helm charts
kelvinprabhu Oct 14, 2026
5f06859
fix(adapter-service, quick-start): align docs with flat paths after P…
kelvinprabhu Oct 14, 2026
f62d057
refactor(adapter-service, quick-start): tidy network-adapter-layer co…
kelvinprabhu Oct 14, 2026
ba54a2d
refactor(api-collection, quick-start): one Postman collection for bot…
kelvinprabhu Oct 14, 2026
b4651ab
chore: remove unused CI values file and update HPA configuration #55 #66
kelvinprabhu Oct 15, 2026
5172ff7
refactor(adapter-service): update changelog, CI values, and README fo…
kelvinprabhu Oct 15, 2026
e0673c1
refactor(adapter-service, quick-start): call single/multi a deploymen…
kelvinprabhu Oct 15, 2026
7d19cfc
feat(adapter-service): add routing network adapter provider configura…
kelvinprabhu Oct 15, 2026
edc8654
fix(adapter-service): update routing configuration for provider tier …
kelvinprabhu Oct 15, 2026
3ea6492
refactor(adapter-service): drop autoscaling and token-URL substitutio…
kelvinprabhu Oct 15, 2026
a9facae
refactor(adapter-service, quick-start): single mode listens on 9201 (…
kelvinprabhu Oct 15, 2026
c48f9c1
Merge pull request #83 from OpenAgriNet/feat/55-run-a-single-adapter-…
kelvinprabhu Oct 15, 2026
a14273b
feat(adr): add initial architecture decision records and templates Re…
kelvinprabhu Oct 15, 2026
3295088
fix(adapter-service, quick-start): address PR #75 re-review (#55, #66)
kelvinprabhu Oct 15, 2026
aeb41fa
refactor(quick-start): reuse NETWORK_ADAPTER_PORT for the single adap…
kelvinprabhu Oct 15, 2026
372abe2
refactor(adapter-service): update changelog and configuration for sin…
kelvinprabhu Oct 22, 2026
54c1a12
refactor(adapter-service, quick-start): select single/multi with netw…
kelvinprabhu Oct 22, 2026
8399f29
refactor(deployment): enhance log message for single network adapter …
kelvinprabhu Oct 22, 2026
04dd0da
fix(quick-start): one network-adapter service; the deployment mode pi…
kelvinprabhu Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions api-collection/OpenAgriNet.network-adapter.local-environment.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
{
"id": "oan-local-environment-single",
"name": "OpenAgriNet local (single mode)",
"values": [
{
"key": "consumer-adapter-host",
"value": "http://127.0.0.1:9201",
"enabled": true,
"type": "default",
"description": "Where discover and select enter. Single mode: the one adapter, so all three adapter hosts are the same URL. NETWORK_ADAPTER_PORT in .env."
},
{
"key": "provider-adapter-host",
"value": "http://127.0.0.1:9201",
"enabled": true,
"type": "default",
"description": "Where publish enters. Single mode: the same adapter as consumer-adapter-host. NETWORK_ADAPTER_PORT in .env."
},
{
"key": "network-adapter-host",
"value": "http://127.0.0.1:9201",
"enabled": true,
"type": "default",
"description": "Used only by the health check. Single mode: the same adapter; its network tier sits under /_internal/ and is not called from Postman. NETWORK_ADAPTER_PORT in .env."
},
{
"key": "discovery-host",
"value": "http://127.0.0.1:8090",
"enabled": true,
"type": "default",
"description": "The catalogue index. Reached through an adapter, not directly, so only its health check is here. DISCOVERY_PORT in .env."
},
{
"key": "registry-host",
"value": "http://127.0.0.1:8081",
"enabled": true,
"type": "default",
"description": "Participants and capability bindings, seeded by bin/setup.py. HOST ONLY: the API base is /api/v1, so a request spells it out. REGISTRY_PORT in .env."
},
{
"key": "keycloak-host",
"value": "http://127.0.0.1:8080",
"enabled": true,
"type": "default",
"description": "Issues the registry write token, and authenticates nothing else -- it is Sunbird RC's, not the network's. KEYCLOAK_PORT in .env."
},
{
"key": "keycloak-realm",
"value": "sunbird-rc",
"enabled": true,
"type": "default",
"description": "KEYCLOAK_REALM in .env."
},
{
"key": "keycloak-client-id",
"value": "registry-frontend",
"enabled": true,
"type": "default",
"description": "The client that logs a user in. admin-api is the one that mints tokens and is not used from here. KEYCLOAK_CLIENT_ID in .env."
},
{
"key": "registry-user",
"value": "no-user",
"enabled": true,
"type": "default",
"description": "REGISTRY_ADMIN_USER in .env. A shipped default, so it is public until changed."
},
{
"key": "registry-password",
"value": "no-user-password",
"enabled": true,
"type": "default",
"description": "REGISTRY_ADMIN_PASSWORD in .env. A shipped default, so it is public until changed."
},
{
"key": "consumer-participant-id",
"value": "consumer.oan.dev",
"enabled": true,
"type": "default",
"description": "The consumer adapter's network identity, and what its signatures verify against. CONSUMER_SUBSCRIBER_ID in .env."
},
{
"key": "consumer-base-url",
"value": "https://consumer.oan.dev",
"enabled": true,
"type": "default",
"description": "The address PEERS are told to POST to, published in the registry row. Nothing in this stack resolves it, so a wrong value costs nothing locally and everything on a shared network -- and the registry cannot correct it. CONSUMER_BASE_URL in .env."
},
{
"key": "consumer-participant-key",
"value": "",
"enabled": true,
"type": "default",
"description": "EMPTY ON PURPOSE. The public half lives in quick-start/keys/keys.json, which bin/setup.py generates; paste it in before registering. setup.py has already registered this participant, so it is normally not needed."
},
{
"key": "mausamgram-participant-id",
"value": "mausamgram",
"enabled": true,
"type": "default",
"description": "IMD Mausamgram, the weather upstream. Half of its binding key. MAUSAMGRAM_PARTICIPANT_ID in .env."
},
{
"key": "mausamgram-capability",
"value": "openagrinet:WeatherObservation",
"enabled": true,
"type": "default",
"description": "MAUSAMGRAM_CAPABILITY in .env."
},
{
"key": "mausamgram-binding-key",
"value": "mausamgram|openagrinet:WeatherObservation",
"enabled": true,
"type": "default",
"description": "<participant-id>|<capability>. Used to look up the binding's osid. The provider adapter builds this from the incoming payload, so it must match the registry row exactly -- a mismatch is a 404."
},
{
"key": "mausamgram-base-url",
"value": "https://mausamgram.imd.gov.in",
"enabled": true,
"type": "default",
"description": "MAUSAMGRAM_BASE_URL in .env."
},
{
"key": "mausamgram-path",
"value": "/nwpapi/get-daily",
"enabled": true,
"type": "default",
"description": "MAUSAMGRAM_PATH in .env."
},
{
"key": "mausamgram-mapping-url",
"value": "https://raw.githubusercontent.com/OpenAgriNet/helmcharts/0.0.1/quick-start/config/mappings/mausamgram/weather-observation.select.yaml",
"enabled": true,
"type": "default",
"description": "What the binding row publishes and the provider adapter fetches. A TAG ref, so what a running stack reads is fixed at 0.0.1 and a later push does not move it. MAUSAMGRAM_MAPPING_URL in .env."
},
{
"key": "capability-code",
"value": "openagrinet:WeatherObservation",
"enabled": true,
"type": "default",
"description": "WHICH CAPABILITY THE 4. Capability Schemas FOLDER OPERATES ON -- the one variable to change to work on another, because the schemaUrl and the display name are derived from it rather than written down. The four this deployment serves are openagrinet:WeatherObservation, openagrinet:MandiPrice, openagrinet:KnowledgeAdvisory and openagrinet:AgricultureFacility; network-specs carries four more packs no capability uses yet."
},
{
"key": "schema-pack-ref",
"value": "main",
"enabled": true,
"type": "default",
"description": "The ref in OpenAgriNet/network-specs that a derived schemaUrl points at. SCHEMA_PACK_REF in .env, which is what bin/setup.py seeds the rows from -- keep the two the same or a create here disagrees with a seeded row. MAIN IS A 404 FOR THESE PATHS TODAY; only schema-packs-v0.1 serves them. The registry checks the URL's shape and never fetches it, so a row stores either way, and main is the ref that becomes correct once the packs merge."
},
{
"key": "schema-pack-version",
"value": "v0.1",
"enabled": true,
"type": "default",
"description": "The pack version, and the row's version field. All eight packs are v0.1 today. Per capability in setup.py rather than one setting for all four, because a capability can move to v0.2 while the others stay -- so if you point capability-code at one that has, change this too."
}
],
"_postman_variable_scope": "environment",
"_postman_exported_using": "hand-written, tracked in this repo"
}
77 changes: 77 additions & 0 deletions charts/adapter-service/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,83 @@ All notable changes to this chart are documented here.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this chart adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.6.0] - 2026-10-09

### Added
- **Two deployment modes, with single as the default.**
`networkAdapterDeploymentMode: single | multi` (default `single`), read by
role `network` only. In single, role `network` is the Network Adapter Layer: the consumer, network and provider tiers as four
modules of one process (`/` for the consumer, `/publish`,
`/_internal/network/`, `/_internal/provider/`), one release called `network-adapter`. In multi,
`provider`, `network` and `consumer` run one release per tier, unchanged.
- `config/network-adapter-config.yaml`: the layer's adapter config, mounted
like any role's file (an outbound connection pool and log level info on
every module). Each module is its tier's module, so a change to
a tier file that should apply to both deployment modes is made in both. Its routing
is generated at render time from `config/routing-*.yaml`
(`routing-network-adapter-{consumer,provider}.yaml`), with tier hosts rewritten
to `http://localhost:<targetPort>/_internal/<tier>`, so tier hops stay inside the pod. The render fails if `http.port` differs from `service.targetPort`.
- Three identities: each module signs as its own tier from
`networkAdapterLayer.keys.{consumer,network,provider}.existingSecret`
(`networkAdapterLayer.extraSubstitutions` for extra placeholders). A literal
private key in the config, including a `config:` override, fails the render.
- Flat paths: `/discover`, `/publish`, `/<action>` and `/health`, the
same URLs as the multi deployment mode. The network and provider tiers are mounted
under `/_internal/`, which only the process itself calls.
- Ingress for the layer may expose only single-segment `/<action>`, as literal
paths with `pathType` Prefix or Exact and no `use-regex` / `rewrite-target`
annotation; `/`, `/publish` and `/_internal*` are refused. `routing.config` fails the render for this
role.
- `examples/network-adapter.yaml` and `ci/network-adapter-values.yaml`
(3 replicas, PDB, spread, graceful shutdown).
- `topologySpreadConstraints`,
`terminationGracePeriodSeconds`, `preStopSleepSeconds`, `goMemLimit`; all off
by default.

### Changed
- **Breaking:** `role: network` now defaults to the single deployment mode.
An existing network-tier release must set `networkAdapterDeploymentMode:
multi` (as `examples/network.yaml` does), or the upgrade turns it into the
Network Adapter Layer, which needs the three `networkAdapterLayer.keys`
Secrets.
- Docs, `values.yaml` and the example headers say single is the default
deployment mode and multi is optional.
- Naming: in single mode the release, Service, app name and namespace are
`network-adapter`, the same as the multi network tier's (telemetry service
`oan-network-adapter`, set in `config/network-adapter-config.yaml`).
Switching modes upgrades that release in place.

### Fixed
- Liveness and readiness probes now render. Values used `probes.liveness` /
`probes.readiness`, which `common.probes` never read, so no adapter pod had a
readiness probe. Upgrading rolls every adapter pod once.
- The startup probe bounds first boot at 180s (`periodSeconds: 5` x
`failureThreshold: 36`) and holds off liveness until `/health` answers.
Pods that had no probe before now get a liveness probe, and the adapter
fetches `beckn.yaml` at boot, so without this a slow or proxied egress
would get a cold start killed after about 70s.
- NOTES.txt in single mode no longer prints `registry.url` and
`otel.*`: that role mounts `config/network-adapter-config.yaml` as is, so those
values never reached the pod and NOTES reported the opposite of what it ran.
The example and CI values no longer set them.
- The Ingress annotations merge tolerates `ingress.annotations: null`.
`ci/network-adapter-values.yaml` turns the Ingress on, so CI renders the path guard.

### Removed
- Unused helpers `adapter-service.name`, `.appName`, `.otelServiceName`,
`.registryUrl` and `.otlpEndpoint` (nothing included them).
- **Breaking:** the `probes.liveness` and `probes.readiness` values keys, renamed to
`livenessProbe` / `readinessProbe`, plus a new `startupProbe`, on by
default. The liveness and readiness timings are unchanged. An environment
that overrides `probes.*` must rename those keys; the old keys never took
effect and are now silently ignored, which is why this is a minor bump
rather than a patch.

### Unchanged
- Roles `provider`, `network`, `consumer`: same config, routing and manifests
apart from the probes (the chart version label and the config checksum
annotation also change with the version).

## [0.5.2] - 2026-09-29

### Changed
Expand Down
12 changes: 8 additions & 4 deletions charts/adapter-service/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
apiVersion: v2
name: adapter-service
description: >-
One chart for the OAN Beckn adapters. provider, network and consumer are the same
image and config format, so `role` selects the handler role, the step list
and the routing target; install once per role. Stateless: an adapter's
One chart for the OAN Beckn adapters, in two deployment modes. single (the
default): the Network Adapter Layer (role network, networkAdapterDeploymentMode single) runs the
consumer, network and provider tiers as four modules of one process;
tier-to-tier calls stay inside the pod and each module keeps its own tier
identity. multi (optional): provider, network and consumer, one release per
tier. Same image and config format; role selects the handler role, the step
list and the routing target. Stateless: an adapter's
identity is a keypair held in a Secret, and everything else it reads from
the registry.
type: application
version: 0.5.2
version: 0.6.0
# The adapter binary, not this chart. `/health` reports the build it is
# actually running, which is the number to trust over this one.
appVersion: "v1.9.0"
Expand Down
Loading
Loading