-
-
Notifications
You must be signed in to change notification settings - Fork 80
feat: create Anypoint MQ bindings #63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
derberg
merged 41 commits into
asyncapi:master
from
integrational:anypointmq-bindings-minimalistic
Sep 15, 2021
Merged
Changes from all commits
Commits
Show all changes
41 commits
Select commit
Hold shift + click to select a range
7477345
added Anypoint MQ skeleton
GeraldLoeffler 9fbdb65
refined wording
GeraldLoeffler 5057fca
draft of server binding object
GeraldLoeffler 78ab493
tentatively complete server binding object
GeraldLoeffler f5d0dc6
fleshed-out skeleton of remaining sections
GeraldLoeffler 3c713f3
added remaining empty JSON schema docs
GeraldLoeffler 5df74b0
added backwards compatiblity
GeraldLoeffler d0e0309
better description of backwards compatibility
GeraldLoeffler c031611
first take on channel binding object: probably need to eliminate this
GeraldLoeffler 271567d
empty channel binding object
GeraldLoeffler 1e7e6a2
elaborated on code generation
GeraldLoeffler 20ebdd4
elaborated on code generation
GeraldLoeffler 620a780
ci: update global workflows (#57)
asyncapi-bot 18cbb5c
ci: update global workflows (#58)
asyncapi-bot 8146e1d
ci: update global workflows (#59)
asyncapi-bot c3c2825
Merge pull request #2 from asyncapi/master
GeraldLoeffler 312d58e
progressing...
GeraldLoeffler 778d43a
switching to new schema naming convention
GeraldLoeffler 14dfc58
added bindingVersion
GeraldLoeffler 5e8aed9
fine-tuning
GeraldLoeffler d7f3495
Merge branch 'asyncapi:master' into master
GeraldLoeffler b179ca9
moving towards minimalistic bindings spec
GeraldLoeffler 290395d
simplified up to server object
GeraldLoeffler 33405de
working on channel
GeraldLoeffler 14c9864
up to message binding
GeraldLoeffler bc95058
refining
GeraldLoeffler d55f6f2
refining
GeraldLoeffler 548f92d
add complete example
GeraldLoeffler 9fc597a
refining
GeraldLoeffler 210d17b
refining
GeraldLoeffler 08eff62
refining
GeraldLoeffler 6c12809
schemata
GeraldLoeffler fcba4c3
Merge branch 'asyncapi:master' into anypointmq-bindings-minimalistic
GeraldLoeffler c327d2e
corrected message binding object to use schema for headers; fixed som…
GeraldLoeffler a8de5da
fixed schema object link
GeraldLoeffler bba62d0
fix leftover props
GeraldLoeffler 0b7b796
removing mention of AsyncAPI version
GeraldLoeffler e1b1abf
eliminated server and operation binding objects
GeraldLoeffler b9c46ed
Delete server.json
GeraldLoeffler 03cf865
Delete operation.json
GeraldLoeffler 72c59e4
Merge branch 'asyncapi:master' into anypointmq-bindings-minimalistic
GeraldLoeffler File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,220 @@ | ||
| # Anypoint MQ Bindings | ||
|
|
||
| This document defines how to describe Anypoint MQ-specific information in AsyncAPI documents. | ||
|
|
||
| [Anypoint MQ](https://docs.mulesoft.com/mq/) is MuleSoft's multi-tenant, cloud messaging service and is fully integrated with [Anypoint Platform](https://www.mulesoft.com/platform/enterprise-integration). | ||
|
|
||
| <a name="version"></a> | ||
| ## Versions | ||
|
|
||
| The version of this bindings specification is `0.0.1`. | ||
| This is also the `bindingVersion` for all binding objects defined by this specification. | ||
| In any given binding object, `latest` MAY alternatively be used to refer to the currently latest published version of this bindings specification. | ||
|
|
||
| ## Terminology | ||
|
|
||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this bindings specification are to be interpreted as described in IETF [RFC2119](https://www.ietf.org/rfc/rfc2119.txt). | ||
|
|
||
| ## Protocol | ||
|
|
||
| These bindings use the `anypointmq` [protocol](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#definitionsProtocol) in AsyncAPI documents to denote connections to and interactions with Anypoint MQ message brokers. | ||
|
|
||
| The Anypoint MQ protocol is based on invocations of the [Anypoint MQ Broker REST API](https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/f1e97bc6-315a-4490-82a7-23abe036327a.anypoint-platform/anypoint-mq-broker/). | ||
|
|
||
| ## Server Object | ||
|
|
||
| The fields of the standard [Server Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#serverObject) are constrained and interpreted as follows: | ||
|
|
||
| Server Object Field Name | Values for Anypoint MQ Protocol | Description | ||
| ---|:---|:--- | ||
| <a name="serverObjectProtocolFieldValueAnypointMQ"></a>`protocol` | `anypointmq` | **Required**. MUST be `anypointmq` for the scope of this specification. | ||
| <a name="serverObjectUrlFieldValueAnypointMQ"></a>`url` | e.g., `https://mq-us-east-1.anypoint.mulesoft.com/api` | **Required**. MUST be the endpoint URL of the Anypoint MQ Broker REST API _excluding_ the final major version indicator (e.g., `v1`). Valid examples are `https://mq-us-east-1.anypoint.mulesoft.com/api` and `https://mq-eu-central-1.eu1.anypoint.mulesoft.com/api` (and _not_ `https://.../api/v1`). | ||
| <a name="serverObjectProtocolVersionFieldValueAnypointMQ"></a>`protocolVersion` | e.g., `v1` | **Optional**, defaults to `v1`. If present MUST be the major version indicator of the Anypoint MQ Broker REST API omitted from the `url`, e.g. `v1`. | ||
| <a name="serverObjectSecurityFieldValueAnypointMQ"></a>`security` | suitably configured OAuth 2.0 client credentials grant type | **Required**. Authentication against the MuleSoft-hosted Anypoint MQ message brokers uses the OAuth 2.0 client credentials grant type. At runtime, the client ID and client secret values of an Anypoint MQ client app must be supplied. Also, the OAuth 2.0 scopes are currently not client-configurable. The `security` field of the server object MUST correctly match these constraints. | ||
|
|
||
| Note that the choice of a particular Anypoint MQ client app (via its client ID and secret) decides the Anypoint Platform organization ID and environment (ID) to be those in which this client app is defined. See the [Anypoint MQ documentation](https://docs.mulesoft.com/mq/mq-client-apps) for details on how to configure Anypoint MQ client apps. | ||
|
|
||
| <a name="server"></a> | ||
| ## Server Binding Object | ||
GeraldLoeffler marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| This object MUST NOT contain any properties. Its name is reserved for future use. | ||
|
|
||
| <a name="channel"></a> | ||
| ## Channel Binding Object | ||
|
|
||
| The Anypoint MQ [Channel Binding Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#channel-bindings-object) is defined by a [JSON Schema](json_schemas/channel.json), which defines these fields: | ||
|
|
||
| Field Name | Type | Description | ||
| ---|:---:|--- | ||
| <a name="channelBindingObjectDestination"></a>`destination` | string | **Optional**, defaults to the channel name. The destination (queue or exchange) name for this channel. SHOULD only be specified if the channel name differs from the actual destination name, such as when the channel name is not a valid destination name in Anypoint MQ. | ||
| <a name="channelBindingObjectType"></a>`destinationType` | string | **Optional**, defaults to `queue`. The type of destination, which MUST be either `exchange` or `queue` or `fifo-queue`. SHOULD be specified to document the messaging model (publish/subscribe, point-to-point, strict message ordering) supported by this channel. | ||
| <a name="channelBindingObjectBindingVersion"></a>`bindingVersion` | string | **Optional**, defaults to `latest`. The version of this binding. | ||
|
|
||
| Note that an Anypoint MQ exchange can only be sent to, not received from. To receive messages sent to an exchange, [an intermediary queue must be defined and bound to the exchange](https://docs.mulesoft.com/mq/mq-understanding#message-exchanges). In this bindings specification, these intermediary queues are not exposed in the AsyncAPI document. Instead, it is simply assumed that whenever messages must be received from an exchange, such an intermediary queue is involved yet invisible in the AsyncAPI document. | ||
|
|
||
| ### Examples | ||
|
|
||
| The following example shows a `channels` object with two channels, the second having a channel binding object for `anypointmq`: | ||
|
|
||
| ```yaml | ||
| channels: | ||
| user/signup: | ||
| description: | | ||
| This application receives command messages from this channel about users to sign up. | ||
| Minimal configuration, omitting a channel binding object. | ||
| publish: | ||
| #... | ||
| user/signedup: | ||
| description: | | ||
| This application sends events to this channel about users that have signed up. | ||
| Explicitly provides a channel binding object. | ||
| bindings: | ||
| anypointmq: | ||
| destination: user-signup-exchg | ||
| destinationType: exchange | ||
| bindingVersion: '0.0.1' | ||
| subscribe: | ||
| #... | ||
| ``` | ||
|
|
||
| <a name="operation"></a> | ||
| ## Operation Binding Object | ||
GeraldLoeffler marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| This object MUST NOT contain any properties. Its name is reserved for future use. | ||
|
|
||
| <a name="message"></a> | ||
| ## Message Binding Object | ||
|
|
||
| The Anypoint MQ [Message Binding Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#message-bindings-object) is defined by a [JSON Schema](json_schemas/message.json), which defines these fields: | ||
|
|
||
| Field Name | Type | Description | ||
| ---|:---:|--- | ||
| <a name="messageBindingObjectHeaders"></a>`headers` | [Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) | **Optional**. A Schema object containing the definitions for Anypoint MQ-specific headers (so-called protocol headers). This schema MUST be of type `object` and have a `properties` key. Examples of Anypoint MQ protocol headers are `messageId` and `messageGroupId`. | ||
| <a name="messageBindingObjectBindingVersion"></a>`bindingVersion` | string | **Optional**, defaults to `latest`. The version of this binding. | ||
|
|
||
| Note that application headers must be specified in the [`headers` field of the standard Message Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#messageObjectHeaders) and are transmitted in the [`properties` section of the Anypoint MQ message](https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/f1e97bc6-315a-4490-82a7-23abe036327a.anypoint-platform/anypoint-mq-broker/). | ||
| In contrast, protocol headers such as `messageId` must be specified in the [`headers` field of the message binding object](#messageBindingObjectHeaders) and are transmitted in the [`headers` section of the Anypoint MQ message](https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/f1e97bc6-315a-4490-82a7-23abe036327a.anypoint-platform/anypoint-mq-broker/). | ||
|
|
||
| ### Examples | ||
|
|
||
| The following example shows a `channels` object with two channels, each having one operation (`subscribe` or `publish`) with one message. Only the message of the `subscribe` operation has a message binding object for `anypointmq`: | ||
|
|
||
| ```yaml | ||
| channels: | ||
| user/signup: | ||
| publish: | ||
| message: | ||
| #... | ||
| user/signedup: | ||
| subscribe: | ||
| message: | ||
| headers: | ||
| type: object | ||
| properties: | ||
| correlationId: | ||
| description: Correlation ID set by application | ||
| type: string | ||
| payload: | ||
| type: object | ||
| properties: | ||
| #... | ||
| correlationId: | ||
| description: Correlation ID is specified as a header and transmitted in the Anypoint MQ message properties section | ||
| location: $message.header#/correlationId | ||
| bindings: | ||
| anypointmq: | ||
| headers: | ||
| type: object | ||
| properties: | ||
| messageId: | ||
| type: string | ||
| bindingVersion: '0.0.1' | ||
| ``` | ||
|
|
||
| ## Complete Example | ||
|
|
||
| The following is a complete, simple AsyncAPI document illustrating the usage of all binding objects defined in this bindings specification, with all their fields. | ||
|
|
||
| ```yaml | ||
| asyncapi: '2.0.0' | ||
| info: | ||
| title: Example with Anypoint MQ | ||
| version: '0.0.1' | ||
|
|
||
| servers: | ||
| development: | ||
| protocol: anypointmq | ||
| protocolVersion: v1 | ||
| url: https://mq-us-east-1.anypoint.mulesoft.com/api | ||
| description: | | ||
| Anypoint MQ broker for development, in the US East (N. Virginia) runtime plane | ||
| under management of the US control plane. | ||
| security: | ||
| - oauthDev: [] | ||
| production: | ||
| protocol: anypointmq | ||
| protocolVersion: v1 | ||
| url: https://mq-eu-central-1.eu1.anypoint.mulesoft.com/api | ||
| description: | | ||
| Anypoint MQ broker for production, in the EU Central (Frankfurt) runtime plane | ||
| under management of the EU control plane. | ||
| security: | ||
| - oauthProd: [] | ||
| bindings: | ||
| anypointmq: | ||
| bindingVersion: '0.0.1' | ||
|
|
||
| channels: | ||
| user/signup: | ||
| description: | | ||
| This application receives command messages from this channel about users to sign up. | ||
| bindings: | ||
| anypointmq: | ||
| destination: user-signup-queue | ||
| destinationType: fifo-queue | ||
| bindingVersion: '0.0.1' | ||
| publish: | ||
| operationId: signUpUser | ||
| description: | | ||
| This application receives command messages via this operation about users to sign up. | ||
| message: | ||
| contentType: application/json | ||
| headers: | ||
| type: object | ||
| properties: | ||
| correlationId: | ||
| description: Correlation ID set by application | ||
| type: string | ||
| payload: | ||
| type: object | ||
| properties: | ||
| username: | ||
| type: string | ||
| minLength: 3 | ||
| correlationId: | ||
| description: Correlation ID is specified as a header and transmitted in the Anypoint MQ message properties section | ||
| location: $message.header#/correlationId | ||
| bindings: | ||
| anypointmq: | ||
| headers: | ||
| type: object | ||
| properties: | ||
| messageId: | ||
| type: string | ||
| bindingVersion: '0.0.1' | ||
|
|
||
| components: | ||
| securitySchemes: | ||
| oauthDev: | ||
| type: oauth2 | ||
| flows: | ||
| clientCredentials: | ||
| tokenUrl: https://mq-us-east-1.anypoint.mulesoft.com/api/v1/authorize | ||
| scopes: {} | ||
| oauthProd: | ||
| type: oauth2 | ||
| flows: | ||
| clientCredentials: | ||
| tokenUrl: https://mq-eu-central-1.eu1.anypoint.mulesoft.com/api/v1/authorize | ||
| scopes: {} | ||
| ``` | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| { | ||
| "$schema": "http://json-schema.org/draft-07/schema#", | ||
| "$id": "http://asyncapi.com/bindings/anypointmq/channel.json", | ||
| "title": "Channel Schema", | ||
| "description": "This object contains configuration for describing an Anypoint MQ exchange, queue, or FIFO queue as an AsyncAPI channel. This objects only contains configuration that can not be provided in the AsyncAPI standard channel object.", | ||
| "type": "object", | ||
| "additionalProperties": false, | ||
| "patternProperties": { | ||
| "^x-[\\w\\d\\.\\-\\_]+$": { | ||
| "$ref": "https://raw.githubusercontent.com/asyncapi/asyncapi-node/v2.7.7/schemas/2.0.0.json#/definitions/specificationExtension" | ||
| } | ||
| }, | ||
| "properties": { | ||
| "destination": { | ||
| "type": "string", | ||
| "description": "The destination (queue or exchange) name for this channel. SHOULD only be specified if the channel name differs from the actual destination name, such as when the channel name is not a valid destination name in Anypoint MQ. Defaults to the channel name." | ||
| }, | ||
| "destinationType": { | ||
| "type": "string", | ||
| "enum": ["exchange", "queue", "fifo-queue"], | ||
| "default": "queue", | ||
| "description": "The type of destination. SHOULD be specified to document the messaging model (publish/subscribe, point-to-point, strict message ordering) supported by this channel." | ||
| }, | ||
| "bindingVersion": { | ||
| "type": "string", | ||
| "enum": [ | ||
| "0.0.1" | ||
| ], | ||
| "description": "The version of this binding. If omitted, 'latest' MUST be assumed." | ||
| } | ||
|
|
||
| }, | ||
| "examples": [ | ||
| { | ||
| "destination": "user-signup-exchg", | ||
| "destinationType": "exchange", | ||
| "bindingVersion": "0.0.1" | ||
| } | ||
| ] | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| { | ||
| "$schema": "http://json-schema.org/draft-07/schema#", | ||
| "$id": "http://asyncapi.com/bindings/anypointmq/message.json", | ||
| "title": "Message Schema", | ||
| "description": "This object contains configuration for describing an Anypoint MQ message as an AsyncAPI message. This objects only contains configuration that can not be provided in the AsyncAPI standard message object.", | ||
| "type": "object", | ||
| "additionalProperties": false, | ||
| "patternProperties": { | ||
| "^x-[\\w\\d\\.\\-\\_]+$": { | ||
| "$ref": "https://raw.githubusercontent.com/asyncapi/asyncapi-node/v2.7.7/schemas/2.0.0.json#/definitions/specificationExtension" | ||
| } | ||
| }, | ||
| "properties": { | ||
| "headers": { | ||
| "$ref": "https://raw.githubusercontent.com/asyncapi/asyncapi-node/v2.7.7/schemas/2.0.0.json#/definitions/schema", | ||
| "description": "A Schema object containing the definitions for Anypoint MQ-specific headers (protocol headers). This schema MUST be of type 'object' and have a 'properties' key. Examples of Anypoint MQ protocol headers are 'messageId' and 'messageGroupId'." | ||
| }, | ||
| "bindingVersion": { | ||
| "type": "string", | ||
| "enum": [ | ||
| "0.0.1" | ||
| ], | ||
| "description": "The version of this binding. If omitted, 'latest' MUST be assumed." | ||
| } | ||
|
|
||
| }, | ||
| "examples": [ | ||
| { | ||
| "headers": { | ||
| "type": "object", | ||
| "properties": { | ||
| "messageId": { | ||
| "type": "string" | ||
| } | ||
| } | ||
| }, | ||
| "bindingVersion": "0.0.1" | ||
| } | ||
| ] | ||
| } |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.