From d9f56b9137f05ef44716bec4900cc27ff87cf4a9 Mon Sep 17 00:00:00 2001 From: Joao C Costa Date: Wed, 4 Jan 2023 01:13:24 +0000 Subject: [PATCH 01/39] Corrected rendering of exports (#3035) Signed-off-by: Joao C Costa Signed-off-by: Joao C Costa Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-deploy.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md index fb860a9de..267447227 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md @@ -64,9 +64,11 @@ There are some scenarios where it's necessary to install Dapr from a private Hel - having a custom Dapr deployment - pulling Helm charts from trusted registries that are managed and maintained by your organization +``` export DAPR_HELM_REPO_URL="https://helm.custom-domain.com/dapr/dapr" export DAPR_HELM_REPO_USERNAME="username_xxx" export DAPR_HELM_REPO_PASSWORD="passwd_xxx" +``` Setting the above parameters will allow `dapr init -k` to install Dapr images from the configured Helm repository. From 6357701de68029c690505b8790d0f27bf23bffef Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:09:44 -0800 Subject: [PATCH 02/39] Fixed issues with a11y on component list pages (#3031) Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../layouts/partials/components/bindings.html | 19 +++++-- .../components/configuration-stores.html | 3 +- .../partials/components/description.html | 7 ++- .../layouts/partials/components/locks.html | 3 +- .../partials/components/middleware.html | 3 +- .../partials/components/name-resolution.html | 3 +- .../layouts/partials/components/pubsub.html | 3 +- .../partials/components/secret-stores.html | 12 +++-- .../partials/components/state-stores.html | 53 +++++++++++++++---- 9 files changed, 76 insertions(+), 30 deletions(-) diff --git a/daprdocs/layouts/partials/components/bindings.html b/daprdocs/layouts/partials/components/bindings.html index 166efc797..465fb2b1f 100644 --- a/daprdocs/layouts/partials/components/bindings.html +++ b/daprdocs/layouts/partials/components/bindings.html @@ -20,11 +20,22 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} + + + {{ if .features.input }} + + {{else}} + Input binding not supported + {{ end }} + + + {{ if .features.output }} + + {{else}} + Output binding not supported + {{ end }} - {{ if .features.input }}✅{{else}}{{ end }} - {{ if .features.output }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} diff --git a/daprdocs/layouts/partials/components/configuration-stores.html b/daprdocs/layouts/partials/components/configuration-stores.html index d9d35b134..19a123a73 100644 --- a/daprdocs/layouts/partials/components/configuration-stores.html +++ b/daprdocs/layouts/partials/components/configuration-stores.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/description.html b/daprdocs/layouts/partials/components/description.html index 7cc5a1bf6..770fa975b 100644 --- a/daprdocs/layouts/partials/components/description.html +++ b/daprdocs/layouts/partials/components/description.html @@ -1,7 +1,6 @@

Table captions:

-

Status: Component - certification status

+

Status: component certification status

-

Since: defines from which Dapr Runtime version, the component is in the current status

+

Since: the version of the Dapr Runtime in which the component first moved to the current status

-

Component version: defines the version of the component

+

Component version: the version of the component

diff --git a/daprdocs/layouts/partials/components/locks.html b/daprdocs/layouts/partials/components/locks.html index 4039e5eb0..109ba9ec8 100644 --- a/daprdocs/layouts/partials/components/locks.html +++ b/daprdocs/layouts/partials/components/locks.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/middleware.html b/daprdocs/layouts/partials/components/middleware.html index c98f9e4c2..32a1486f2 100644 --- a/daprdocs/layouts/partials/components/middleware.html +++ b/daprdocs/layouts/partials/components/middleware.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .description | markdownify}} {{ .state }} diff --git a/daprdocs/layouts/partials/components/name-resolution.html b/daprdocs/layouts/partials/components/name-resolution.html index 816873583..a16dd0bc5 100644 --- a/daprdocs/layouts/partials/components/name-resolution.html +++ b/daprdocs/layouts/partials/components/name-resolution.html @@ -15,8 +15,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/pubsub.html b/daprdocs/layouts/partials/components/pubsub.html index 244a6f623..01c80e7ce 100644 --- a/daprdocs/layouts/partials/components/pubsub.html +++ b/daprdocs/layouts/partials/components/pubsub.html @@ -16,8 +16,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/secret-stores.html b/daprdocs/layouts/partials/components/secret-stores.html index 05d105bfb..2412f8b1d 100644 --- a/daprdocs/layouts/partials/components/secret-stores.html +++ b/daprdocs/layouts/partials/components/secret-stores.html @@ -27,10 +27,16 @@ {{ range sort $components "component" }} - {{ .component - }} + + {{ .component }} + + + {{ if .features.multipleKeyValuesPerSecret }} + + {{else}} + Multiple Key-Values Per Secret: Not supported + {{ end }} - {{ if .features.multipleKeyValuesPerSecret }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} diff --git a/daprdocs/layouts/partials/components/state-stores.html b/daprdocs/layouts/partials/components/state-stores.html index d42c41047..10a45fdc9 100644 --- a/daprdocs/layouts/partials/components/state-stores.html +++ b/daprdocs/layouts/partials/components/state-stores.html @@ -23,16 +23,51 @@ {{ range sort $components "component" }} - {{ .component - }} + + {{ .component }} + + + {{ if .features.crud }} + + {{else}} + CRUD: Not supported + {{ end }} + + + {{ if .features.transactions }} + + {{else}} + Transactions: Not supported + {{ end }} + + + {{ if .features.etag }} + + {{else}} + ETag: Not supported + {{ end }} + + + {{ if .features.ttl }} + + {{else}} + TTL: Not supported + {{ end }} + + + {{ if (and .features.transactions .features.etag) }} + + {{else}} + Actors: Not supported + {{ end }} + + + {{ if .features.query }} + + {{else}} + Query: Not supported + {{ end }} - {{ if .features.crud }}✅{{else}}{{ end }} - {{ if .features.transactions }}✅{{else}}{{ end }} - {{ if .features.etag }}✅{{else}}{{ end }} - {{ if .features.ttl }}✅{{else}}{{ end }} - {{ if (and .features.transactions .features.etag) }}✅{{else}}{{ end }} - {{ if .features.query }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} From a1d4b22c0010900a268d2875c50d54b87b05ac2e Mon Sep 17 00:00:00 2001 From: Syuparn Date: Wed, 4 Jan 2023 14:30:07 +0900 Subject: [PATCH 03/39] fix links in wasm middleware docs (#3029) Signed-off-by: syuparn Signed-off-by: syuparn Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../supported-middleware/middleware-wasm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md b/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md index 343b25a12..e95c6671a 100644 --- a/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md +++ b/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md @@ -14,10 +14,10 @@ extension. The Wasm [HTTP middleware]({{< ref middleware.md >}}) allows you to rewrite a request URI with custom logic compiled to a Wasm binary. In other words, you can extend Dapr using external files that are not pre-compiled into the `daprd` -binary. Dapr embeds [wazero][https://wazero.io] to accomplish this without CGO. +binary. Dapr embeds [wazero](https://wazero.io) to accomplish this without CGO. Wasm modules are loaded from a filesystem path. On Kubernetes, see [mounting -volumes to the Dapr sidecar]({{> kubernetes-volume-mounts.md >}}) to configure +volumes to the Dapr sidecar]({{< ref kubernetes-volume-mounts.md >}}) to configure a filesystem mount that can contain Wasm modules. ## Component format From d19b1d8eaa093d21ed8618e71cfaf2d9fe320ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pepe=20Garc=C3=ADa?= Date: Wed, 4 Jan 2023 09:29:26 +0000 Subject: [PATCH 04/39] fix typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pepe García --- .../building-blocks/observability/tracing-overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md b/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md index eb758b335..38ac85d25 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md @@ -18,7 +18,7 @@ There are two scenarios for how tracing is used: 1. Dapr generates the trace context and you propagate the trace context to another service. 2. You generate the trace context and Dapr propagates the trace context to a service. -### Propogating sequential service calls +### Propagating sequential service calls Dapr takes care of creating the trace headers. However, when there are more than two services, you're responsible for propagating the trace headers between them. Let's go through the scenarios with examples: @@ -45,7 +45,7 @@ There are no helper methods exposed in Dapr SDKs to propagate and retrieve trace 4. Pub/sub messages Dapr generates the trace headers in the published message topic. These trace headers are propagated to any services listening on that topic. -### Propogating multiple different service calls +### Propagating multiple different service calls In the following scenarios, Dapr does some of the work for you and you need to either create or propagate trace headers. @@ -115,4 +115,4 @@ In the gRPC API calls, trace context is passed through `grpc-trace-bin` header. - [Observability concepts]({{< ref observability-concept.md >}}) - [W3C Trace Context for distributed tracing]({{< ref w3c-tracing-overview >}}) - [W3C Trace Context specification](https://www.w3.org/TR/trace-context/) -- [Observability quickstart](https://github.com/dapr/quickstarts/tree/master/tutorials/observability) \ No newline at end of file +- [Observability quickstart](https://github.com/dapr/quickstarts/tree/master/tutorials/observability) From 36743211b034b7eb2f352235b09f217025f39e6f Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Wed, 4 Jan 2023 17:10:43 -0600 Subject: [PATCH 05/39] Configuration API quickstart docs (#3009) * new configuration api quickstart Signed-off-by: Hannah Hunter * add new file Signed-off-by: Hannah Hunter * updates per sarthak Signed-off-by: Hannah Hunter * add diagram Signed-off-by: Hannah Hunter * updates per Mark Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../configuration-api-overview.md | 33 +- .../howto-manage-configuration.md | 9 +- .../en/getting-started/quickstarts/_index.md | 1 + .../quickstarts/configuration-quickstart.md | 639 ++++++++++++++++++ .../configuration-quickstart-flow.png | Bin 0 -> 30297 bytes 5 files changed, 673 insertions(+), 9 deletions(-) create mode 100644 daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md create mode 100644 daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md index 5f2ac9096..2e95f6b49 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md @@ -6,17 +6,40 @@ weight: 1000 description: "Overview of the configuration API building block" --- -## Introduction +Consuming application configuration is a common task when writing applications. Frequently, configuration stores are used to manage this configuration data. A configuration item is often dynamic in nature and tightly coupled to the needs of the application that consumes it. -Consuming application configuration is a common task when writing applications and frequently configuration stores are used to manage this configuration data. A configuration item is often dynamic in nature and is tightly coupled to the needs of the application that consumes it. For example, common uses for application configuration include names of secrets, different identifiers, partition or consumer IDs, names of databases to connect to etc. These configuration items are typically stored as key/value items in a state store or database. Application configuration can be changed by either developers or operators at runtime and the developer needs to be notified of these changes in order to take the required action and load the new configuration. Also configuration data is typically read only from the application API perspective, with updates to the configuration store made through operator tooling. Dapr's configuration API allows developers to consume configuration items that are returned as read only key/value pairs and subscribe to changes whenever a configuration item changes. +For example, application configuration can include: +- Names of secrets +- Different identifiers +- Partition or consumer IDs +- Names of databases to connect to, etc + +Usually, configuration items are stored as key/value items in a state store or database. Developers or operators can change application configuration at runtime in the configuration store. Once changes are made, a service is notified to load the new configuration. + +Configuration data is read-only from the application API perspective, with updates to the configuration store made through operator tooling. With Dapr's configuration API, you can: +- Consume configuration items that are returned as read-only key/value pairs +- Subscribe to changes whenever a configuration item changes -It is worth noting that this configuration API should not be confused with the [Dapr sidecar and control plane configuration]({{}}) which is used to set policies and settings on instances of Dapr sidecars or the installed Dapr control plane. +{{% alert title="Note" color="primary" %}} + The Configuration API should not be confused with the [Dapr sidecar and control plane configuration]({{< ref "configuration-overview" >}}), which is used to set policies and settings on Dapr sidecar instances or the installed Dapr control plane. +{{% /alert %}} -*This API is currently in `Alpha` state* +## Try out configuration + +### Quickstart + +Want to put the Dapr configuration API to the test? Walk through the following quickstart to see the configuration API in action: + +| Quickstart | Description | +| ---------- | ----------- | +| [Configuration quickstart]({{< ref configuration-quickstart.md >}}) | Get configuration items or subscribe to configuration changes using the configuration API. | + +### Start using the configuration API directly in your app + +Want to skip the quickstarts? Not a problem. You can try out the configuration building block directly in your application to read and manage configuration data. After [Dapr is installed]({{< ref "getting-started/_index.md" >}}), you can begin using the configuration API starting with [the configuration how-to guide]({{< ref howto-manage-configuration.md >}}). -## Features ## Next steps Follow these guides on: diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md index 4de325ba6..b05722312 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md @@ -8,12 +8,13 @@ description: "Learn how to get application configuration and subscribe for chang This example uses the Redis configuration store component to demonstrate how to retrieve a configuration item. +Diagram showing get configuration of example service + {{% alert title="Note" color="primary" %}} -This API is currently in `Alpha` state and only available on gRPC. An HTTP1.1 supported version with this URL syntax `/v1.0/configuration` will be available before the API is certified into `Stable` state. + If you haven't already, [try out the configuration quickstart]({{< ref configuration-quickstart.md >}}) for a quick walk-through on how to use the configuration API. {{% /alert %}} -Diagram showing get configuration of example service ## Create a configuration item in store @@ -68,7 +69,7 @@ spec: ## Retrieve Configuration Items ### Get configuration items using Dapr SDKs -{{< tabs Dotnet Java Python>}} +{{< tabs ".NET" Java Python>}} {{% codetab %}} @@ -304,7 +305,7 @@ asyncio.run(executeConfiguration()) ``` ```bash -dapr run --app-id orderprocessing --components-path components/ -- python3 OrderProcessingService.py +dapr run --app-id orderprocessing --resources-path components/ -- python3 OrderProcessingService.py ``` {{% /codetab %}} diff --git a/daprdocs/content/en/getting-started/quickstarts/_index.md b/daprdocs/content/en/getting-started/quickstarts/_index.md index 67380fa87..727b9a17b 100644 --- a/daprdocs/content/en/getting-started/quickstarts/_index.md +++ b/daprdocs/content/en/getting-started/quickstarts/_index.md @@ -27,4 +27,5 @@ Hit the ground running with our Dapr quickstarts, complete with code samples aim | [State Management]({{< ref statemanagement-quickstart.md >}}) | Store a service's data as key/value pairs in supported state stores. | | [Bindings]({{< ref bindings-quickstart.md >}}) | Work with external systems using input bindings to respond to events and output bindings to call operations. | | [Secrets Management]({{< ref secrets-quickstart.md >}}) | Securely fetch secrets. | +| [Configuration]({{< ref configuration-quickstart.md >}}) | Get configuration items and subscribe for configuration updates. | | [Resiliency]({{< ref resiliency >}}) | Define and apply fault-tolerance policies to your Dapr API requests. | diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md new file mode 100644 index 000000000..bba89def1 --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -0,0 +1,639 @@ +--- +type: docs +title: "Quickstart: Configuration" +linkTitle: Configuration +weight: 76 +description: Get started with Dapr's Configuration building block +--- + +Let's take a look at Dapr's [Configuration building block]({{< ref configuration-api-overview.md >}}). A configuration item is often dynamic in nature and tightly coupled to the needs of the application that consumes it. Configuration items are key/value pairs containing configuration data, such as: +- App ids +- Partition keys +- Database names, etc + +In this quickstart, you'll run an `order-processor` microservice that utilizes the Configuration API. The service: +1. Gets configuration items from the configuration store. +1. Subscribes for configuration updates. + +Diagram that demonstrates the flow of the configuration API quickstart with key/value pairs used. + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/python/sdk/order-processor +``` + +Install the dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +``` + +> **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. + +The expected output: + +``` +== APP == Configuration for orderId1 : value: "101" +== APP == +== APP == Configuration for orderId2 : value: "102" +== APP == +== APP == App unsubscribed from config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +``` + +> **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1 : value: "103" +== APP == +== APP == Configuration for orderId2 : value: "104" +== APP == +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```python +# Get config items from the config store +for config_item in CONFIGURATION_ITEMS: + config = client.get_configuration(store_name=DAPR_CONFIGURATION_STORE, keys=[config_item], config_metadata={}) + print(f"Configuration for {config_item} : {config.items[config_item]}", flush=True) +``` + +Subscribe to configuration updates: + +```python +# Subscribe for configuration changes +configuration = await client.subscribe_configuration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS) +``` + +Unsubscribe from configuration updates and exit the application: + +```python +# Unsubscribe from configuration updates +unsubscribed = True +for config_item in CONFIGURATION_ITEMS: + unsub_item = client.unsubscribe_configuration(DAPR_CONFIGURATION_STORE, config_item) + #... +if unsubscribed == True: + print("App unsubscribed from config changes", flush=True) +``` + + +{{% /codetab %}} + + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/javascript/sdk/order-processor +``` + +Install the dependencies: + +```bash +npm install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"key":"orderId1","value":"101","version":"","metadata":{}} +== APP == Configuration for orderId2: {"key":"orderId2","value":"102","version":"","metadata":{}} +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"key":"orderId1","value":"103","version":"","metadata":{}} +== APP == Configuration for orderId2: {"key":"orderId2","value":"104","version":"","metadata":{}} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```javascript +// Get config items from the config store +//... + const config = await client.configuration.get(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); + Object.keys(config.items).forEach((key) => { + console.log("Configuration for " + key + ":", JSON.stringify(config.items[key])); + }); +``` + +Subscribe to configuration updates: + +```javascript +// Subscribe to config updates +try { + const stream = await client.configuration.subscribeWithKeys( + DAPR_CONFIGURATION_STORE, + CONFIGURATION_ITEMS, + (config) => { + console.log("Configuration update", JSON.stringify(config.items)); + } + ); +``` + +Unsubscribe from configuration updates and exit the application: + +```javascript +// Unsubscribe to config updates and exit app after 20 seconds +setTimeout(() => { + stream.stop(); + console.log("App unsubscribed to config changes"); + process.exit(0); +}, +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/csharp/sdk/order-processor +``` + +Recall NuGet packages: + +```bash +dotnet restore +dotnet build +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"Value":"101","Version":"","Metadata":{}} +== APP == Configuration for orderId2: {"Value":"102","Version":"","Metadata":{}} +== APP == App unsubscribed from config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"Value":"103","Version":"","Metadata":{}} +== APP == Configuration for orderId2: {"Value":"104","Version":"","Metadata":{}} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```csharp +// Get config from configuration store +GetConfigurationResponse config = await client.GetConfiguration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); +foreach (var item in config.Items) +{ + var cfg = System.Text.Json.JsonSerializer.Serialize(item.Value); + Console.WriteLine("Configuration for " + item.Key + ": " + cfg); +} +``` + +Subscribe to configuration updates: + +```csharp +// Subscribe to config updates +SubscribeConfigurationResponse subscribe = await client.SubscribeConfiguration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); +``` + +Unsubscribe from configuration updates and exit the application: + +```csharp +// Unsubscribe to config updates and exit the app +try +{ + client.UnsubscribeConfiguration(DAPR_CONFIGURATION_STORE, subscriptionId); + Console.WriteLine("App unsubscribed from config changes"); + Environment.Exit(0); +} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/java/sdk/order-processor +``` + +Install the dependencies: + +```bash +mvn clean install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {'value':'101'} +== APP == Configuration for orderId2: {'value':'102'} +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {'value':'103'} +== APP == Configuration for orderId2: {'value':'104'} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```java +// Get config items from the config store +try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) { + for (String configurationItem : CONFIGURATION_ITEMS) { + ConfigurationItem item = client.getConfiguration(DAPR_CONFIGURATON_STORE, configurationItem).block(); + System.out.println("Configuration for " + configurationItem + ": {'value':'" + item.getValue() + "'}"); + } +``` + +Subscribe to configuration updates: + +```java +// Subscribe for config changes +Flux subscription = client.subscribeConfiguration(DAPR_CONFIGURATON_STORE, + CONFIGURATION_ITEMS.toArray(String[]::new)); +``` + +Unsubscribe from configuration updates and exit the application: + +```java +// Unsubscribe from config changes +UnsubscribeConfigurationResponse unsubscribe = client + .unsubscribeConfiguration(subscriptionId, DAPR_CONFIGURATON_STORE).block(); +if (unsubscribe.getIsUnsubscribed()) { + System.out.println("App unsubscribed to config changes"); +} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/go/sdk/order-processor +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"Value":"101","Version":"","Metadata":null} +== APP == Configuration for orderId2: {"Value":"102","Version":"","Metadata":null} +== APP == dapr configuration subscribe finished. +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"Value":"103","Version":"","Metadata":null} +== APP == Configuration for orderId2: {"Value":"104","Version":"","Metadata":null} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```go +// Get config items from config store +for _, item := range CONFIGURATION_ITEMS { + config, err := client.GetConfigurationItem(ctx, DAPR_CONFIGURATION_STORE, item) + //... + c, _ := json.Marshal(config) + fmt.Println("Configuration for " + item + ": " + string(c)) +} +``` + +Subscribe to configuration updates: + +```go +// Subscribe for config changes +err = client.SubscribeConfigurationItems(ctx, DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS, func(id string, config map[string]*dapr.ConfigurationItem) { + // First invocation when app subscribes to config changes only returns subscription id + if len(config) == 0 { + fmt.Println("App subscribed to config changes with subscription id: " + id) + subscriptionId = id + return + } +}) +``` + +Unsubscribe from configuration updates and exit the application: + +```go +// Unsubscribe to config updates and exit app after 20 seconds +select { +case <-ctx.Done(): + err = client.UnsubscribeConfigurationItems(context.Background(), DAPR_CONFIGURATION_STORE, subscriptionId) + //... + { + fmt.Println("App unsubscribed to config changes") + } +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! + +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps + +- Use Dapr Configuration with HTTP instead of an SDK. + - [Python](https://github.com/dapr/quickstarts/tree/master/configuration/python/http) + - [JavaScript](https://github.com/dapr/quickstarts/tree/master/configuration/javascript/http) + - [.NET](https://github.com/dapr/quickstarts/tree/master/configuration/csharp/http) + - [Java](https://github.com/dapr/quickstarts/tree/master/configuration/java/http) + - [Go](https://github.com/dapr/quickstarts/tree/master/configuration/go/http) +- Learn more about [Configuration building block]({{< ref configuration-api-overview >}}) + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} \ No newline at end of file diff --git a/daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png b/daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..29dc6f44c9e731845cb785981822f9bdd7265870 GIT binary patch literal 30297 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 BTF?Lh literal 0 HcmV?d00001 From 9094ec86e0ba3648ec6a0e098b5c9f74b6761ff2 Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Mon, 16 Jan 2023 22:15:32 +0100 Subject: [PATCH 06/39] Change --resource-path to --components-path (#3058) Signed-off-by: Marc Duiker Signed-off-by: Marc Duiker --- .../howto-manage-configuration.md | 2 +- .../quickstarts/configuration-quickstart.md | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md index b05722312..45468c798 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md @@ -305,7 +305,7 @@ asyncio.run(executeConfiguration()) ``` ```bash -dapr run --app-id orderprocessing --resources-path components/ -- python3 OrderProcessingService.py +dapr run --app-id orderprocessing --components-path components/ -- python3 OrderProcessingService.py ``` {{% /codetab %}} diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md index bba89def1..4baee305d 100644 --- a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -64,7 +64,7 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +dapr run --app-id order-processor --components-path ../../../components/ --app-port 6001 -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -90,7 +90,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +dapr run --app-id order-processor --components-path ../../../components/ --app-port 6001 -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -187,7 +187,7 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +dapr run --app-id order-processor --components-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js ``` The expected output: @@ -209,7 +209,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +dapr run --app-id order-processor --components-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js ``` The app will return the updated configuration values: @@ -309,7 +309,7 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +dapr run --app-id order-processor-http --components-path ../../../components/ --app-port 7001 -- dotnet run --project . ``` The expected output: @@ -331,7 +331,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +dapr run --app-id order-processor-http --components-path ../../../components/ --app-port 7001 -- dotnet run --project . ``` The app will return the updated configuration values: @@ -428,7 +428,7 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` The expected output: @@ -450,7 +450,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` The app will return the updated configuration values: @@ -537,7 +537,7 @@ cd ./configuration/go/sdk/order-processor Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +dapr run --app-id order-processor --app-port 6001 --components-path ../../../components -- go run . ``` The expected output: @@ -560,7 +560,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +dapr run --app-id order-processor --app-port 6001 --components-path ../../../components -- go run . ``` The app will return the updated configuration values: From 05bf098c46ae857df62eea043a556dfb4f1f9a33 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 16 Jan 2023 18:30:01 -0600 Subject: [PATCH 07/39] docs: improve consistency on directory mvment prefix (#3061) Signed-off-by: Samantha Coyle Signed-off-by: Samantha Coyle Co-authored-by: Yaron Schneider --- .../quickstarts/bindings-quickstart.md | 30 +++++++++---------- .../quickstarts/configuration-quickstart.md | 10 +++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md index 5c3b8b491..15736c9a9 100644 --- a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md @@ -46,7 +46,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -73,7 +73,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/python/sdk/batch +cd bindings/python/sdk/batch ``` Install the dependencies: @@ -137,7 +137,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -253,7 +253,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -280,7 +280,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/javascript/sdk/batch +cd bindings/javascript/sdk/batch ``` Install the dependencies: @@ -339,7 +339,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -455,7 +455,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -482,7 +482,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/csharp/sdk/batch +cd bindings/csharp/sdk/batch ``` Install the dependencies: @@ -543,7 +543,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -662,7 +662,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -689,7 +689,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/java/sdk/batch +cd bindings/java/sdk/batch ``` Install the dependencies: @@ -753,7 +753,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -869,7 +869,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -896,7 +896,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/go/sdk/batch +cd bindings/go/sdk/batch ``` Install the dependencies: @@ -965,7 +965,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md index 4baee305d..e457612a1 100644 --- a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -52,7 +52,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/python/sdk/order-processor +cd configuration/python/sdk/order-processor ``` Install the dependencies: @@ -175,7 +175,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/javascript/sdk/order-processor +cd configuration/javascript/sdk/order-processor ``` Install the dependencies: @@ -296,7 +296,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/csharp/sdk/order-processor +cd configuration/csharp/sdk/order-processor ``` Recall NuGet packages: @@ -416,7 +416,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/java/sdk/order-processor +cd configuration/java/sdk/order-processor ``` Install the dependencies: @@ -531,7 +531,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/go/sdk/order-processor +cd configuration/go/sdk/order-processor ``` Run the `order-processor` service alongside a Dapr sidecar. From 735f6738c13e96ea57abbc0b5e6c828588cdb012 Mon Sep 17 00:00:00 2001 From: VuiDJi Date: Tue, 17 Jan 2023 21:35:09 +0400 Subject: [PATCH 08/39] fixed a typo in sentinelMasterName and it's examples (#3064) Signed-off-by: VuiDJi Signed-off-by: VuiDJi Co-authored-by: Mark Fussell --- .../components-reference/supported-locks/redis-lock.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md index ca6c2b54b..7c39c9f6e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md +++ b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md @@ -85,8 +85,8 @@ The above example uses secrets as plain strings. It is recommended to use a secr | enableTLS | N | If the Redis instance supports TLS with public certificates, can be configured to be enabled or disabled. Defaults to `"false"` | `"true"`, `"false"` | maxRetries | N | Maximum number of retries before giving up. Defaults to `3` | `5`, `10` | maxRetryBackoff | N | Maximum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` -| failover | N | Property to enabled failover configuration. Needs sentinalMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` -| sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `""`, `"127.0.0.1:6379"` +| failover | N | Property to enabled failover configuration. Needs sentinelMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` +| sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `"mymaster"` | redeliverInterval | N | The interval between checking for pending messages to redelivery. Defaults to `"60s"`. `"0"` disables redelivery. | `"30s"` | processingTimeout | N | The amount time a message must be pending before attempting to redeliver it. Defaults to `"15s"`. `"0"` disables redelivery. | `"30s"` | redisType | N | The type of redis. There are two valid values, one is `"node"` for single node mode, the other is `"cluster"` for redis cluster mode. Defaults to `"node"`. | `"cluster"` From 77688ac0556519d61f4a5783c1629bfa3ab45290 Mon Sep 17 00:00:00 2001 From: joshvanl Date: Tue, 10 Jan 2023 12:18:32 +0000 Subject: [PATCH 09/39] Now `version` has been moved from to subcommand: change all instances of `dapr --version` to `dapr version`. Signed-off-by: joshvanl --- daprdocs/content/en/getting-started/install-dapr-cli.md | 1 + daprdocs/content/en/reference/cli/cli-overview.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/getting-started/install-dapr-cli.md b/daprdocs/content/en/getting-started/install-dapr-cli.md index 258ff34e0..4c8d39880 100644 --- a/daprdocs/content/en/getting-started/install-dapr-cli.md +++ b/daprdocs/content/en/getting-started/install-dapr-cli.md @@ -188,6 +188,7 @@ Available Commands: stop Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes + version Print the Dapr runtime and CLI version Flags: -h, --help help for dapr diff --git a/daprdocs/content/en/reference/cli/cli-overview.md b/daprdocs/content/en/reference/cli/cli-overview.md index 7ac94c482..ef9d17e05 100644 --- a/daprdocs/content/en/reference/cli/cli-overview.md +++ b/daprdocs/content/en/reference/cli/cli-overview.md @@ -42,6 +42,7 @@ Available Commands: stop Stop Dapr instances and their associated apps. Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes + version Print the Dapr runtime and CLI version Flags: -h, --help help for dapr @@ -73,8 +74,8 @@ You can learn more about each Dapr command from the links below. - [`dapr stop`]({{< ref dapr-stop.md >}}) - [`dapr uninstall`]({{< ref dapr-uninstall.md >}}) - [`dapr upgrade`]({{< ref dapr-upgrade.md >}}) - - [`dapr-version`]({{< ref dapr-version.md >}}) + - [`dapr version`]({{< ref dapr-version.md >}}) ### Environment Variables -Some Dapr flags can be set via environment variables (e.g. `DAPR_NETWORK` for the `--network` flag of the `dapr init` command). Note that specifying the flag on the command line overrides any set environment variable. \ No newline at end of file +Some Dapr flags can be set via environment variables (e.g. `DAPR_NETWORK` for the `--network` flag of the `dapr init` command). Note that specifying the flag on the command line overrides any set environment variable. From da62b1833c22a9aa6874240eddf12d9ccd0f9a1e Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 18 Jan 2023 14:08:54 -0600 Subject: [PATCH 10/39] remove optional Signed-off-by: Hannah Hunter --- .../building-blocks/state-management/howto-state-query-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md index 0aecc3224..ce9f4346a 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md +++ b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md @@ -16,7 +16,7 @@ Even though the state store is a key/value store, the `value` might be a JSON do ## Querying the state -Submit query requests via HTTP POST/PUT or gRPC. The body of the request is the JSON map with 3 _optional_ entries: +Submit query requests via HTTP POST/PUT or gRPC. The body of the request is the JSON map with 3 entries: - `filter` - `sort` From 089814c38c18f0cf4c2a5a294205a2b433e119b3 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Thu, 19 Jan 2023 18:21:10 -0600 Subject: [PATCH 11/39] Adding Solace PubSub Component Docs Signed-off-by: TKTheTechie --- .../supported-pubsub/setup-solace-amqp.md | 108 ++++++++++++++++++ daprdocs/data/components/pubsub/generic.yaml | 5 + 2 files changed, 113 insertions(+) create mode 100644 daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md new file mode 100644 index 000000000..13c9fd1e9 --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -0,0 +1,108 @@ +--- +type: docs +title: "Solace-AMQP" +linkTitle: "Solace-AMQP" +description: "Detailed documentation on the Solace-AMQP pubsub component" +aliases: + - "/operations/components/setup-pubsub/supported-pubsub/setup-solace-amqp/" +--- + +## Component format + +To setup Solace-AMQP pubsub create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: solace +spec: + type: pubsub.solace.amqp + version: v1 + metadata: + - name: url + value: 'amqp://localhost:5672' + - name: username + value: 'default' + - name: password + value: 'default' +``` + +{{% alert title="Warning" color="warning" %}} +The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). +{{% /alert %}} + +## Spec metadata fields + +| Field | Required | Details | Example | +|--------------------|:--------:|---------|---------| +| url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
Use the **`amqp://`** URI scheme for non-TLS communication.
Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` +| username | Y | The user name to connect to the broker with. Only required if anonymous is not specified or set to false | default +| password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default +| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true +| caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` +| clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` +| clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` + +### Communication using TLS + +To configure communication using TLS, ensure that the Solace broker is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: solace +spec: + type: pubsub.solace.amqp + version: v1 + metadata: + - name: url + value: "amqps://host.domain[:port]" + - name: username + value: 'default' + - name: password + value: 'default' + - name: caCert + value: ${{ myLoadedCACert }} + - name: clientCert + value: ${{ myLoadedClientCert }} + - name: clientKey + secretKeyRef: + name: mySolaceClientKey + key: mySolaceClientKey +auth: + secretStore: +``` + +Note that while the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. + +### Publishing/subscribing to topics and queues + +By default, messages are published and subscribed over topics. If you would like your destination to be a queue - prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. + +## Create a Solace broker + +{{< tabs "Self-Hosted" "SaaS">}} + +{{% codetab %}} +You can run a Solace broker [locally using Docker](https://hub.docker.com/r/solace/solace-pubsub-standard): + +```bash +docker run -d -p 8080:8080 -p 55554:55555 -p 8008:8008 -p 1883:1883 -p 8000:8000 -p 5672:5672 -p 9000:9000 -p 2222:2222 --shm-size=2g --env username_admin_globalaccesslevel=admin --env username_admin_password=admin --name=solace solace/solace-pubsub-standard +``` + +You can then interact with the server using the client port: `mqtt://localhost:5672` +{{% /codetab %}} + +{{% codetab %}} +You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming) +{{% /codetab %}} + +{{< /tabs >}} + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- Read [this guide]({{< ref "howto-publish-subscribe.md#step-2-publish-a-topic" >}}) for instructions on configuring pub/sub components +- [Pub/Sub building block]({{< ref pubsub >}}) \ No newline at end of file diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index 58fde998f..b844b3fdc 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -48,3 +48,8 @@ state: Alpha version: v1 since: "1.8" +- component: Solace-AMQP + link: setup-solace-amqp + state: Alpha + version: v1 + since: "1.10" From 5c2c449cc3a8e7c05f0cddd1f56a6ae3d9750f8e Mon Sep 17 00:00:00 2001 From: Filinto Duran Date: Fri, 20 Jan 2023 23:25:19 -0600 Subject: [PATCH 12/39] add information about needed ports for kube api to reach (#3078) * add information about needed ports for kube api to reach Signed-off-by: Filinto Duran * correct identation of next paragraph Signed-off-by: Filinto Duran --- .../troubleshooting/common_issues.md | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/daprdocs/content/en/operations/troubleshooting/common_issues.md b/daprdocs/content/en/operations/troubleshooting/common_issues.md index 59bad856a..02d39fd50 100644 --- a/daprdocs/content/en/operations/troubleshooting/common_issues.md +++ b/daprdocs/content/en/operations/troubleshooting/common_issues.md @@ -50,45 +50,54 @@ spec: imagePullPolicy: Always ``` -If your pod spec template is annotated correctly and you still don't see the sidecar injected, make sure Dapr was deployed to the cluster before your deployment or pod were deployed. +There are some known cases where this might not properly work: -If this is the case, restarting the pods will fix the issue. +- If your pod spec template is annotated correctly, and you still don't see the sidecar injected, make sure Dapr was deployed to the cluster before your deployment or pod were deployed. -If you are deploying Dapr on a private GKE cluster, sidecar injection does not work without extra steps. See [Setup a Google Kubernetes Engine cluster]({{< ref setup-gke.md >}}). + If this is the case, restarting the pods will fix the issue. -In order to further diagnose any issue, check the logs of the Dapr sidecar injector: +- If you are deploying Dapr on a private GKE cluster, sidecar injection does not work without extra steps. See [Setup a Google Kubernetes Engine cluster]({{< ref setup-gke.md >}}). -```bash - kubectl logs -l app=dapr-sidecar-injector -n dapr-system -``` + In order to further diagnose any issue, check the logs of the Dapr sidecar injector: -*Note: If you installed Dapr to a different namespace, replace dapr-system above with the desired namespace* + ```bash + kubectl logs -l app=dapr-sidecar-injector -n dapr-system + ``` -If you are deploying Dapr on Amazon EKS and using an overlay network such as Calico, you will need to set `hostNetwork` parameter to true, this is a limitation of EKS with such CNIs. + *Note: If you installed Dapr to a different namespace, replace dapr-system above with the desired namespace* -You can set this parameter using Helm `values.yaml` file: +- If you are deploying Dapr on Amazon EKS and using an overlay network such as Calico, you will need to set `hostNetwork` parameter to true, this is a limitation of EKS with such CNIs. -``` -helm upgrade --install dapr dapr/dapr \ + You can set this parameter using Helm `values.yaml` file: + + ``` + helm upgrade --install dapr dapr/dapr \ --namespace dapr-system \ --create-namespace \ --values values.yaml -``` + ``` -`values.yaml` -```yaml -dapr_sidecar_injector: - hostNetwork: true -``` + `values.yaml` + ```yaml + dapr_sidecar_injector: + hostNetwork: true + ``` -or using command line: + or using command line: -``` -helm upgrade --install dapr dapr/dapr \ + ``` + helm upgrade --install dapr dapr/dapr \ --namespace dapr-system \ --create-namespace \ --set dapr_sidecar_injector.hostNetwork=true -``` + ``` + +- Make sure the kube api server can reach the following webhooks services: + - [Sidecar Mutating Webhook Injector Service](https://github.com/dapr/dapr/blob/44235fe8e8799589bb393a3124d2564db2dd6885/charts/dapr/charts/dapr_sidecar_injector/templates/dapr_sidecar_injector_deployment.yaml#L157) at port __4000__ that is served from the sidecar injector. + - [CRD Conversion Webhook Service](https://github.com/dapr/dapr/blob/44235fe8e8799589bb393a3124d2564db2dd6885/charts/dapr/charts/dapr_operator/templates/dapr_operator_service.yaml#L28) at port __19443__ that is served from the operator. + + Check with your cluster administrators to setup allow ingress + rules to the above ports, __4000__ and __19443__, in the cluster from the kube api servers. ## My pod is in CrashLoopBackoff or another failed state due to the daprd sidecar From 11f90b03bdfdae01a72ce4d2274466f25b9bb0e2 Mon Sep 17 00:00:00 2001 From: Tomasz Pietrek Date: Sun, 22 Jan 2023 01:48:05 +0100 Subject: [PATCH 13/39] Add docs for domain and api prefix (#3040) Signed-off-by: Tomasz Pietrek Signed-off-by: Tomasz Pietrek --- .../supported-pubsub/setup-jetstream.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md index d2ac9122f..815430fd7 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md @@ -68,6 +68,10 @@ spec: value: explicit - name: deliverPolicy value: all + - name: domain + value: hub + - name: apiPrefix + value: PREFIX ``` ## Spec metadata fields @@ -97,6 +101,8 @@ spec: | hearbeat | N | [Hearbeat] | `10s` | | ackPolicy | N | [Ack Policy] | `explicit` | | deliverPolicy | N | One of: all, last, new, sequence, time | `all` | +| domain | N | [JetStream Leafondes] | `HUB` | +| apiPrefix | N | [JetStream Leafnodes] | `PREFIX` | ## Create a NATS server @@ -162,5 +168,6 @@ nats -s localhost:4222 stream add myStream --subjects mySubject [Rate Limit]: https://docs.nats.io/jetstream/concepts/consumers#ratelimit [Hearbeat]: https://docs.nats.io/jetstream/concepts/consumers#hearbeat [Ack Policy]: https://docs.nats.io/nats-concepts/jetstream/consumers#ackpolicy +[JetStream Leafonodes]: https://docs.nats.io/running-a-nats-service/configuration/leafnodes/jetstream_leafnodes [Decentralized JWT Authentication/Authorization]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/jwt [NATS token based authentication]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/tokens From b445c0314bff04607ebeff21abc356158b3074be Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 23 Jan 2023 18:37:29 -0800 Subject: [PATCH 14/39] Docs for logging options in the Configuration spec (#3034) See dapr/dapr#5462 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../configuration/configuration-overview.md | 31 ++++++++++++++--- .../en/operations/monitoring/logging/logs.md | 4 ++- .../api-logs-troubleshooting.md | 34 +++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/operations/configuration/configuration-overview.md b/daprdocs/content/en/operations/configuration/configuration-overview.md index 75bd9517d..6edfa5b84 100644 --- a/daprdocs/content/en/operations/configuration/configuration-overview.md +++ b/daprdocs/content/en/operations/configuration/configuration-overview.md @@ -48,6 +48,7 @@ The following configuration settings can be applied to Dapr application sidecars - [Tracing](#tracing) - [Metrics](#metrics) +- [Logging](#logging) - [Middleware](#middleware) - [Scope secret store access](#scope-secret-store-access) - [Access Control allow lists for building block APIs](#access-control-allow-lists-for-building-block-apis) @@ -85,7 +86,7 @@ The following table lists the properties for tracing: `samplingRate` is used to enable or disable the tracing. To disable the sampling rate , set `samplingRate : "0"` in the configuration. The valid range of samplingRate is between 0 and 1 inclusive. The sampling rate determines whether a trace span should be sampled or not based on value. `samplingRate : "1"` samples all traces. By default, the sampling rate is (0.0001) or 1 in 10,000 traces. -See [Observability distributed tracing]({{< ref "tracing-overview.md" >}}) for more information +See [Observability distributed tracing]({{< ref "tracing-overview.md" >}}) for more information. #### Metrics @@ -104,7 +105,29 @@ The following table lists the properties for metrics: |--------------|--------|-------------| | `enabled` | boolean | Whether metrics should to be enabled. -See [metrics documentation]({{< ref "metrics-overview.md" >}}) for more information +See [metrics documentation]({{< ref "metrics-overview.md" >}}) for more information. + +#### Logging + +The logging section can be used to configure how logging works in the Dapr Runtime. + +The `logging` section under the `Configuration` spec contains the following properties: + +```yml +logging: + apiLogging: + enabled: false + omitHealthChecks: false +``` + +The following table lists the properties for logging: + +| Property | Type | Description | +|--------------|--------|-------------| +| `apiLogging.enabled` | boolean | The default value for the `--enable-api-logging` flag for `daprd` (and the corresponding `dapr.io/enable-api-logging` annotation): the value set in the Configuration spec is used as default unless a `true` or `false` value is passed to each Dapr Runtime. Default: `false`. +| `apiLogging.omitHealthChecks` | boolean | If `true`, calls to health check endpoints (e.g. `/v1.0/healthz`) are not logged when API logging is enabled. This is useful if those calls are adding a lot of noise in your logs. Default: `false` + +See [logging documentation]({{< ref "logs.md" >}}) for more information. #### Middleware @@ -130,8 +153,8 @@ The following table lists the properties for HTTP handlers: | Property | Type | Description | |----------|--------|-------------| -| name | string | Name of the middleware component -| type | string | Type of middleware component +| `name` | string | Name of the middleware component +| `type` | string | Type of middleware component See [Middleware pipelines]({{< ref "middleware.md" >}}) for more information diff --git a/daprdocs/content/en/operations/monitoring/logging/logs.md b/daprdocs/content/en/operations/monitoring/logging/logs.md index c8b6442a7..397588b69 100644 --- a/daprdocs/content/en/operations/monitoring/logging/logs.md +++ b/daprdocs/content/en/operations/monitoring/logging/logs.md @@ -109,7 +109,9 @@ spec: ## API Logging -API logging enables you to see the API calls your application makes to the Dapr sidecar, to debug issues or monitor the behavior of your application. You can combine both Dapr API logging with Dapr log events. See [configure and view Dapr Logs]({{< ref "logs-troubleshooting.md" >}}) and [configure and view Dapr API Logs]({{< ref "api-logs-troubleshooting.md" >}}) for more information. +API logging enables you to see the API calls your application makes to the Dapr sidecar, to debug issues or monitor the behavior of your application. You can combine both Dapr API logging with Dapr log events. + +See [configure and view Dapr Logs]({{< ref "logs-troubleshooting.md" >}}) and [configure and view Dapr API Logs]({{< ref "api-logs-troubleshooting.md" >}}) for more information. ## Log collectors diff --git a/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md b/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md index 4d8abc7a5..6d124098d 100644 --- a/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md +++ b/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md @@ -77,3 +77,37 @@ time="2022-03-16T18:32:02.917629403Z" level=info msg="HTTP API Called" method="P time="2022-03-16T18:32:03.137830112Z" level=info msg="HTTP API Called" method="POST /v1.0/invoke/{id}/method/{method:*}" app_id=invoke-caller instance=invokecaller-f4f949886-cbnmt scope=dapr.runtime.http-info type=log useragent=Go-http-client/1.1 ver=edge time="2022-03-16T18:32:03.359097916Z" level=info msg="HTTP API Called" method="POST /v1.0/invoke/{id}/method/{method:*}" app_id=invoke-caller instance=invokecaller-f4f949886-cbnmt scope=dapr.runtime.http-info type=log useragent=Go-http-client/1.1 ver=edge ``` + +## API logging configuration + +Using the [Dapr Configuration spec]({{< ref "configuration-overview.md" >}}#sidecar-configuration), you can configure the default behavior of API logging in Dapr runtimes. + +### Enable API logging by default + +Using the Dapr Configuration spec, you can set the default value for the `--enable-api-logging` flag (and the correspondent annotation when running on Kubernetes), with the `logging.apiLogging.enabled` option. This value applies to all Dapr runtimes that reference the Configuration document or resource in which it's defined. + +- If `logging.apiLogging.enabled` is set to `false`, the default value, API logging is disabled for Dapr runtimes unless `--enable-api-logging` is set to `true` (or the `dapr.io/enable-api-logging: true` annotation is added). +- When `logging.apiLogging.enabled` is `true`, Dapr runtimes have API logging enabled by default, and it can be disabled by setting +`--enable-api-logging=false` or with the `dapr.io/enable-api-logging: false` annotation. + +For example: + +```yaml +logging: + apiLogging: + enabled: true +``` + +### Omit health checks from API logging + +When API logging is enabled, all calls to the Dapr API server are logged, including those to health check endpoints (e.g. `/v1.0/healthz`). Depending on your environment, this may generate multiple log lines per minute and could create unwanted noise. + +You can configure Dapr to not log calls to health check endpoints when API logging is enabled using the Dapr Configuration spec, by setting `logging.apiLogging.omitHealthChecks: true`. The default value is `false`, which means that health checks calls are logged in the API logs. + +For example: + +```yaml +logging: + apiLogging: + omitHealthChecks: true +``` From e93d700a83bc5c38d5df13ead0c2e7cbe1faff6b Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:20:45 -0800 Subject: [PATCH 15/39] Rename mqtt components to mqtt3 (#3059) See https://github.com/dapr/components-contrib/issues/2359 The old component names are still available as aliases Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../operations/components/component-schema.md | 4 ++-- .../supported-bindings/{mqtt.md => mqtt3.md} | 15 ++++++++------- .../{setup-mqtt.md => setup-mqtt3.md} | 19 ++++++++++--------- .../data/components/bindings/generic.yaml | 4 ++-- daprdocs/data/components/pubsub/generic.yaml | 4 ++-- 5 files changed, 24 insertions(+), 22 deletions(-) rename daprdocs/content/en/reference/components-reference/supported-bindings/{mqtt.md => mqtt3.md} (93%) rename daprdocs/content/en/reference/components-reference/supported-pubsub/{setup-mqtt.md => setup-mqtt3.md} (92%) diff --git a/daprdocs/content/en/operations/components/component-schema.md b/daprdocs/content/en/operations/components/component-schema.md index 0e4ab7822..d87ac4017 100644 --- a/daprdocs/content/en/operations/components/component-schema.md +++ b/daprdocs/content/en/operations/components/component-schema.md @@ -44,7 +44,7 @@ spec: ### Special metadata values -Metadata values can contain a `{uuid}` tag that is replaced with a randomly generate UUID when the Dapr sidecar starts up. A new UUID is generated on every start up. It can be used, for example, to have a pod on Kubernetes with multiple application instances consuming a [shared MQTT subscription]({{< ref "setup-mqtt.md" >}}). Below is an example of using the `{uuid}` tag. +Metadata values can contain a `{uuid}` tag that is replaced with a randomly generate UUID when the Dapr sidecar starts up. A new UUID is generated on every start up. It can be used, for example, to have a pod on Kubernetes with multiple application instances consuming a [shared MQTT subscription]({{< ref "setup-mqtt3.md" >}}). Below is an example of using the `{uuid}` tag. ```yaml apiVersion: dapr.io/v1alpha1 @@ -52,7 +52,7 @@ kind: Component metadata: name: messagebus spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: consumerID diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md b/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md similarity index 93% rename from daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md rename to daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md index 17a6cecaf..9e4824d83 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md @@ -1,15 +1,16 @@ --- type: docs -title: "MQTT binding spec" -linkTitle: "MQTT" -description: "Detailed documentation on the MQTT binding component" +title: "MQTT3 binding spec" +linkTitle: "MQTT3" +description: "Detailed documentation on the MQTT3 binding component" aliases: + - "/operations/components/setup-bindings/supported-bindings/mqtt3/" - "/operations/components/setup-bindings/supported-bindings/mqtt/" --- ## Component format -To setup MQTT binding create a component of type `bindings.mqtt`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. +To setup a MQTT3 binding create a component of type `bindings.mqtt3`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. ```yaml apiVersion: dapr.io/v1alpha1 @@ -17,7 +18,7 @@ kind: Component metadata: name: spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: url @@ -63,7 +64,7 @@ kind: Component metadata: name: mqtt-binding spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: url @@ -103,7 +104,7 @@ metadata: name: mqtt-binding namespace: default spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: consumerID diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md similarity index 92% rename from daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md rename to daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md index 1fbfa6105..abcb08314 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md @@ -1,15 +1,16 @@ --- type: docs -title: "MQTT" -linkTitle: "MQTT" -description: "Detailed documentation on the MQTT pubsub component" +title: "MQTT3" +linkTitle: "MQTT3" +description: "Detailed documentation on the MQTT3 pubsub component" aliases: + - "/operations/components/setup-pubsub/supported-pubsub/setup-mqtt3/" - "/operations/components/setup-pubsub/supported-pubsub/setup-mqtt/" --- ## Component format -To setup MQTT pubsub create a component of type `pubsub.mqtt`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration +To setup a MQTT3 pubsub create a component of type `pubsub.mqtt3`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration ```yaml apiVersion: dapr.io/v1alpha1 @@ -17,7 +18,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: url @@ -59,7 +60,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: url @@ -96,7 +97,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: consumerID @@ -119,7 +120,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr Note that in the case, the value of the consumer ID is random every time Dapr restarts, so we are setting `cleanSession` to true as well. -## Create a MQTT broker +## Create a MQTT3 broker {{< tabs "Self-Hosted" "Kubernetes">}} @@ -134,7 +135,7 @@ You can then interact with the server using the client port: `mqtt://localhost:1 {{% /codetab %}} {{% codetab %}} -You can run a MQTT broker in kubernetes using following yaml: +You can run a MQTT3 broker in kubernetes using following yaml: ```yaml apiVersion: apps/v1 diff --git a/daprdocs/data/components/bindings/generic.yaml b/daprdocs/data/components/bindings/generic.yaml index 4cbd411bb..c093d9bb2 100644 --- a/daprdocs/data/components/bindings/generic.yaml +++ b/daprdocs/data/components/bindings/generic.yaml @@ -54,8 +54,8 @@ features: input: false output: true -- component: MQTT - link: mqtt +- component: MQTT3 + link: mqtt3 state: Beta version: v1 since: "1.7" diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index 58fde998f..dc76618e4 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -28,8 +28,8 @@ state: Beta version: v1 since: "1.7" -- component: MQTT - link: setup-mqtt +- component: MQTT3 + link: setup-mqtt3 state: Stable version: v1 since: "1.7" From d6ce7c1d621dbe222d6a69212fcb45bc487583a1 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:07 -0500 Subject: [PATCH 16/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 13c9fd1e9..a3d0e955c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -9,7 +9,7 @@ aliases: ## Component format -To setup Solace-AMQP pubsub create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration +To setup Solace-AMQP pub/sub, create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pub/sub configuration. ```yaml apiVersion: dapr.io/v1alpha1 From e33e454b5f2e348d7e4482dfbd872f9d4acee202 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:32 -0500 Subject: [PATCH 17/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index a3d0e955c..b6ebf90e1 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -37,7 +37,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | Field | Required | Details | Example | |--------------------|:--------:|---------|---------| | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
Use the **`amqp://`** URI scheme for non-TLS communication.
Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` -| username | Y | The user name to connect to the broker with. Only required if anonymous is not specified or set to false | default +| username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` | password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default | anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` From 3faa75e0c771904e3b4b70618ff3bb844e12781a Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:45 -0500 Subject: [PATCH 18/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index b6ebf90e1..ed682e6cc 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -38,7 +38,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr |--------------------|:--------:|---------|---------| | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
Use the **`amqp://`** URI scheme for non-TLS communication.
Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` | username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` -| password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default +| password | Y | The password to connect to the broker. Only required if anonymous is not specified or set to `false`. | `default` | anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` From 83fd12d803997173b79e579efa92ecc586d4aa71 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:53 -0500 Subject: [PATCH 19/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index ed682e6cc..f6601bc27 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -39,7 +39,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
Use the **`amqp://`** URI scheme for non-TLS communication.
Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` | username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` | password | Y | The password to connect to the broker. Only required if anonymous is not specified or set to `false`. | `default` -| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true +| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to `true`. | `true` | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` From 17e5e5017aa933c5e832ffc1feefb55e3f4e9cb2 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:10 -0500 Subject: [PATCH 20/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../supported-pubsub/setup-solace-amqp.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index f6601bc27..c923d675e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -46,7 +46,12 @@ The above example uses secrets as plain strings. It is recommended to use a secr ### Communication using TLS -To configure communication using TLS, ensure that the Solace broker is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: +To configure communication using TLS: + +1. Ensure that the Solace broker is configured to support certificates. +1. Provide the `caCert`, `clientCert`, and `clientKey` metadata in the component configuration. + +For example: ```yaml apiVersion: dapr.io/v1alpha1 From 1f25aa03dc579f168eece99bb2d2ab2400c7d294 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:18 -0500 Subject: [PATCH 21/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index c923d675e..54263693e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -84,7 +84,7 @@ Note that while the `caCert` and `clientCert` values may not be secrets, they ca ### Publishing/subscribing to topics and queues -By default, messages are published and subscribed over topics. If you would like your destination to be a queue - prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. +By default, messages are published and subscribed over topics. If you would like your destination to be a queue, prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. ## Create a Solace broker From 874a6651735e3119429bfe366f13755936f8e28d Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:29 -0500 Subject: [PATCH 22/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 54263693e..38411258f 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -80,7 +80,7 @@ auth: secretStore: ``` -Note that while the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. +> While the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. ### Publishing/subscribing to topics and queues From d0492583f632343b697d4fa9b7dd3519e4340581 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:36 -0500 Subject: [PATCH 23/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 38411258f..58ae4e5db 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -101,7 +101,7 @@ You can then interact with the server using the client port: `mqtt://localhost:5 {{% /codetab %}} {{% codetab %}} -You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming) +You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming). {{% /codetab %}} {{< /tabs >}} From 5ef2b250f48c391bd4c9a320caca00669034d3e1 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:47 -0500 Subject: [PATCH 24/39] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 58ae4e5db..6bfe09f49 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -110,4 +110,4 @@ You can also sign up for a free SaaS broker on [Solace Cloud](https://console.so - [Basic schema for a Dapr component]({{< ref component-schema >}}) - Read [this guide]({{< ref "howto-publish-subscribe.md#step-2-publish-a-topic" >}}) for instructions on configuring pub/sub components -- [Pub/Sub building block]({{< ref pubsub >}}) \ No newline at end of file +- [Pub/sub building block]({{< ref pubsub >}}) \ No newline at end of file From 1f805e5b9978193ad91cde615fc466faadfdc59a Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Tue, 24 Jan 2023 16:04:21 -0600 Subject: [PATCH 25/39] update resiliency docs Signed-off-by: Hannah Hunter --- daprdocs/content/en/concepts/resiliency-concept.md | 5 +++++ .../resiliency/resiliency-serviceinvo-quickstart.md | 4 ---- .../resiliency/resiliency-state-quickstart.md | 4 ---- daprdocs/content/en/operations/resiliency/policies.md | 10 +++++++--- .../en/operations/resiliency/resiliency-overview.md | 9 +++++---- daprdocs/content/en/operations/resiliency/targets.md | 7 ++++++- .../en/operations/support/support-preview-features.md | 1 - 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index 7b8cbe675..b1b662bc5 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -37,3 +37,8 @@ Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]( - Determined for readiness and liveness Read more on about how to apply [dapr health checks]({{< ref sidecar-health >}}) to your application. + +## Next steps + +- [Learn more about resiliency]({{< ref resiliency-overview.md >}}) +- [Try out one of the Resiliency quickstarts]({{< ref quickstarts/resiliency >}}) \ No newline at end of file diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md index f338bde8a..24eac44ac 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -6,10 +6,6 @@ weight: 120 description: "Get started with Dapr's resiliency capabilities via the service invocation API" --- -{{% alert title="Note" color="primary" %}} - Resiliency is currently a preview feature. -{{% /alert %}} - Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: - Run two microservice applications: `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index ef34f4a69..13756b748 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -6,10 +6,6 @@ weight: 110 description: "Get started with Dapr's resiliency capabilities via the state management API" --- -{{% alert title="Note" color="primary" %}} - Resiliency is currently a preview feature. -{{% /alert %}} - Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: - Execute a microservice application with resiliency enabled that continuously persists and retrieves state via Dapr's state management API. diff --git a/daprdocs/content/en/operations/resiliency/policies.md b/daprdocs/content/en/operations/resiliency/policies.md index eb7e13895..5dba5eb06 100644 --- a/daprdocs/content/en/operations/resiliency/policies.md +++ b/daprdocs/content/en/operations/resiliency/policies.md @@ -3,10 +3,10 @@ type: docs title: "Policies" linkTitle: "Policies" weight: 4500 -description: "Configure resiliency policies for timeouts, retries and circuit breakers" +description: "Configure resiliency policies for timeouts, retries, and circuit breakers" --- -You define timeouts, retries and circuit breaker policies under `policies`. Each policy is given a name so you can refer to them from the `targets` section in the resiliency spec. +Define timeouts, retries, and circuit breaker policies under `policies`. Each policy is given a name so you can refer to them from the `targets` section in the resiliency spec. > Note: Dapr offers default retries for specific APIs. [See here]({{< ref "#override-default-retries" >}}) to learn how you can overwrite default retry logic with user defined retry policies. @@ -285,4 +285,8 @@ The table below is a break down of which policies are applied when attempting to | statestore | DefaultStatestoreComponentOutboundRetryPolicy | | actorstore | fastRetries | | EventActor | retryForever | -| SummaryActor | DefaultActorRetryPolicy | \ No newline at end of file +| SummaryActor | DefaultActorRetryPolicy | + +## Next steps + +- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/resiliency/resiliency-overview.md b/daprdocs/content/en/operations/resiliency/resiliency-overview.md index fea52eca2..db9b02875 100644 --- a/daprdocs/content/en/operations/resiliency/resiliency-overview.md +++ b/daprdocs/content/en/operations/resiliency/resiliency-overview.md @@ -5,11 +5,8 @@ linkTitle: "Overview" weight: 4500 description: "Configure Dapr retries, timeouts, and circuit breakers" --- -{{% alert title="Note" color="primary" %}} - Resiliency is currently a preview feature. Before you can utilize a resiliency spec, you must first [enable the resiliency preview feature]({{< ref support-preview-features >}}). -{{% /alert %}} -Dapr provides a capability for defining and applying fault tolerance resiliency policies via a [resiliency spec]({{< ref "resiliency-overview.md#complete-example-policy" >}}). Resiliency specs are saved in the same location as components specs and are applied when the Dapr sidecar starts. The sidecar determines how to apply resiliency policies to your Dapr API calls. In self-hosted mode, the resiliency spec must be named `resiliency.yaml`. In Kubernetes Dapr finds the named resiliency specs used by your application. Within the resiliency spec, you can define policies for popular resiliency patterns, such as: +Dapr provides a capability for defining and applying fault tolerance resiliency policies via a [resiliency spec]({{< ref "resiliency-overview.md#complete-example-policy" >}}). Resiliency specs are saved in the same location as components specs and are applied when the Dapr sidecar starts. The sidecar determines how to apply resiliency policies to your Dapr API calls. In self-hosted mode, the resiliency spec must be named `resiliency.yaml`. In Kubernetes Dapr finds the named resiliency specs used by your application. Within the resiliency spec, you can define policies for popular resiliency patterns, such as: - [Timeouts]({{< ref "policies.md#timeouts" >}}) - [Retries/back-offs]({{< ref "policies.md#retries" >}}) @@ -171,3 +168,7 @@ Watch this video for how to use [resiliency](https://www.youtube.com/watch?t=184 - [Policies]({{< ref "policies.md" >}}) - [Targets]({{< ref "targets.md" >}}) + +## Next steps + +- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/resiliency/targets.md b/daprdocs/content/en/operations/resiliency/targets.md index 6935f7d39..486785df9 100644 --- a/daprdocs/content/en/operations/resiliency/targets.md +++ b/daprdocs/content/en/operations/resiliency/targets.md @@ -7,6 +7,7 @@ description: "Apply resiliency policies to apps, components and actors" --- ### Targets + Named policies are applied to targets. Dapr supports three target types that apply all Dapr building block APIs: - `apps` - `components` @@ -129,4 +130,8 @@ spec: circuitBreaker: general circuitBreakerScope: both circuitBreakerCacheSize: 5000 -``` \ No newline at end of file +``` + +## Next steps + +- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/support/support-preview-features.md b/daprdocs/content/en/operations/support/support-preview-features.md index 224d2e065..31bbf68d0 100644 --- a/daprdocs/content/en/operations/support/support-preview-features.md +++ b/daprdocs/content/en/operations/support/support-preview-features.md @@ -16,7 +16,6 @@ For CLI there is no explicit opt-in, just the version that this was first made a | Feature | Description | Setting | Documentation | Version introduced | | ---------- |-------------|---------|---------------|-----------------| | **`--image-registry`** flag in Dapr CLI| In self hosted mode you can set this flag to specify any private registry to pull the container images required to install Dapr| N/A | [CLI init command reference]({{}}) | v1.7 | -| **Resiliency** | Allows configuring of fine-grained policies for retries, timeouts and circuitbreaking. | `Resiliency` | [Configure Resiliency Policies]({{}}) | v1.7| | **App Middleware** | Allow middleware components to be executed when making service-to-service calls | N/A | [App Middleware]({{}}) | v1.9 | | **App health checks** | Allows configuring app health checks | `AppHealthCheck` | [App health checks]({{}}) | v1.9 | | **Pluggable components** | Allows creating self-hosted gRPC-based components written in any language that supports gRPC. The following component APIs are supported: State stores, Pub/sub, Bindings | N/A | [Pluggable components concept]({{}})| v1.9 | From aa685e68b79abda488a2645ff054283ce2140288 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Tue, 24 Jan 2023 16:09:09 -0600 Subject: [PATCH 26/39] fix build Signed-off-by: Hannah Hunter --- daprdocs/content/en/concepts/resiliency-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index b1b662bc5..f66dbdca5 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -41,4 +41,4 @@ Read more on about how to apply [dapr health checks]({{< ref sidecar-health >}}) ## Next steps - [Learn more about resiliency]({{< ref resiliency-overview.md >}}) -- [Try out one of the Resiliency quickstarts]({{< ref quickstarts/resiliency >}}) \ No newline at end of file +- [Try out one of the Resiliency quickstarts]({{< ref "quickstarts/resiliency" >}}) \ No newline at end of file From 9d7e29538569aa4666b31f765f8321b470e169be Mon Sep 17 00:00:00 2001 From: Isekai-Seikatsu Date: Thu, 26 Jan 2023 00:24:43 +0800 Subject: [PATCH 27/39] Fix secrets.json path typo (#3087) Signed-off-by: Isekai-Seikatsu Signed-off-by: Isekai-Seikatsu --- .../en/getting-started/quickstarts/secrets-quickstart.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md index 42772e58d..9c445992c 100644 --- a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md @@ -106,7 +106,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/python/sdk/order-processor/secrets.json): ```json { @@ -328,7 +328,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/csharp/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/csharp/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/csharp/sdk/order-processor/secrets.json): ```json { @@ -436,7 +436,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/java/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/java/sdk/order-processor/secrets.json): ```json { @@ -543,7 +543,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/go/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/go/sdk/order-processor/secrets.json): ```json { From 851c3d5971c7d202d9e1214279cf44dce9c39188 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 25 Jan 2023 11:11:01 -0600 Subject: [PATCH 28/39] fix build Signed-off-by: Hannah Hunter --- daprdocs/content/en/concepts/resiliency-concept.md | 4 +++- daprdocs/content/en/operations/resiliency/policies.md | 4 +++- .../content/en/operations/resiliency/resiliency-overview.md | 4 +++- daprdocs/content/en/operations/resiliency/targets.md | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index f66dbdca5..32656434d 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -41,4 +41,6 @@ Read more on about how to apply [dapr health checks]({{< ref sidecar-health >}}) ## Next steps - [Learn more about resiliency]({{< ref resiliency-overview.md >}}) -- [Try out one of the Resiliency quickstarts]({{< ref "quickstarts/resiliency" >}}) \ No newline at end of file +- Try out one of the Resiliency quickstarts: + - [Resiliency: Service-to-service]({{< ref resiliency-serviceinvo-quickstart.md >}}) + - [Resiliency: State Management]({{< ref resiliency-state-quickstart.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/resiliency/policies.md b/daprdocs/content/en/operations/resiliency/policies.md index 5dba5eb06..935e80492 100644 --- a/daprdocs/content/en/operations/resiliency/policies.md +++ b/daprdocs/content/en/operations/resiliency/policies.md @@ -289,4 +289,6 @@ The table below is a break down of which policies are applied when attempting to ## Next steps -- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file +Try out one of the Resiliency quickstarts: +- [Resiliency: Service-to-service]({{< ref resiliency-serviceinvo-quickstart.md >}}) +- [Resiliency: State Management]({{< ref resiliency-state-quickstart.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/resiliency/resiliency-overview.md b/daprdocs/content/en/operations/resiliency/resiliency-overview.md index db9b02875..ba63fe137 100644 --- a/daprdocs/content/en/operations/resiliency/resiliency-overview.md +++ b/daprdocs/content/en/operations/resiliency/resiliency-overview.md @@ -171,4 +171,6 @@ Watch this video for how to use [resiliency](https://www.youtube.com/watch?t=184 ## Next steps -- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file +Try out one of the Resiliency quickstarts: +- [Resiliency: Service-to-service]({{< ref resiliency-serviceinvo-quickstart.md >}}) +- [Resiliency: State Management]({{< ref resiliency-state-quickstart.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/resiliency/targets.md b/daprdocs/content/en/operations/resiliency/targets.md index 486785df9..49dee7880 100644 --- a/daprdocs/content/en/operations/resiliency/targets.md +++ b/daprdocs/content/en/operations/resiliency/targets.md @@ -134,4 +134,6 @@ spec: ## Next steps -- [Try out one of the Resiliency quickstarts]({{< ref resiliency >}}) \ No newline at end of file +Try out one of the Resiliency quickstarts: +- [Resiliency: Service-to-service]({{< ref resiliency-serviceinvo-quickstart.md >}}) +- [Resiliency: State Management]({{< ref resiliency-state-quickstart.md >}}) \ No newline at end of file From 848bd86d7ccb12743cc3712740ed2bca334456b3 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 25 Jan 2023 11:29:41 -0600 Subject: [PATCH 29/39] update link Signed-off-by: Hannah Hunter --- .../components-reference/supported-pubsub/setup-apache-kafka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md index 86d4a350c..a18b8c261 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md @@ -337,7 +337,7 @@ To run without Docker, see the getting started guide [here](https://kafka.apache {{% /codetab %}} {{% codetab %}} -To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/docs/operators/latest/quickstart.html#ref-install-prerequisites-str). +To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/quickstarts/). {{% /codetab %}} {{< /tabs >}} From 87b4fa4bc5ec3d473ffb607d42b0758e6cc3b124 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 25 Jan 2023 14:21:06 -0600 Subject: [PATCH 30/39] update dapr run commands Signed-off-by: Hannah Hunter --- .../resiliency-serviceinvo-quickstart.md | 59 ++++++++++--------- .../resiliency/resiliency-state-quickstart.md | 44 +++++++------- .../pluggable-components-registration.md | 2 +- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md index 24eac44ac..a1c7722a2 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -55,10 +55,10 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 8001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- python3 app.py +dapr run --app-port 8001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- python3 app.py ``` -### Step 3: Run the `checkout` service application with resiliency enabled +### Step 3: Run the `checkout` service application In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. @@ -72,13 +72,13 @@ Install dependencies: pip3 install -r requirements.txt ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- python3 app.py +dapr run --app-id checkout --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3500 -- python3 app.py ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: +The Dapr sidecar then loads the resiliency spec located in the resources directory: ```yaml apiVersion: dapr.io/v1alpha1 @@ -283,10 +283,10 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start +dapr run --app-port 5001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- npm start ``` -### Step 3: Run the `checkout` service application with resiliency enabled +### Step 3: Run the `checkout` service application In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. @@ -301,13 +301,14 @@ Install dependencies: npm install ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- npm start +dapr run --app-id checkout --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3500 -- npm start ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: +The Dapr sidecar then loads the resiliency spec located in the resources directory: + ```yaml apiVersion: dapr.io/v1alpha1 @@ -446,7 +447,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start +dapr run --app-port 5001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- npm start ``` `checkout` service output: @@ -514,10 +515,10 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 7001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- dotnet run +dapr run --app-port 7001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- dotnet run ``` -### Step 3: Run the `checkout` service application with resiliency enabled +### Step 3: Run the `checkout` service application In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. @@ -533,13 +534,13 @@ dotnet restore dotnet build ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- dotnet run +dapr run --app-id checkout --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3500 -- dotnet run ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: +The Dapr sidecar then loads the resiliency spec located in the resources directory: ```yaml apiVersion: dapr.io/v1alpha1 @@ -747,10 +748,10 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --resources-path ../../../resources/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` -### Step 3: Run the `checkout` service application with resiliency enabled +### Step 3: Run the `checkout` service application In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. @@ -765,13 +766,14 @@ Install dependencies: mvn clean install ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar +dapr run --app-id checkout --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: +The Dapr sidecar then loads the resiliency spec located in the resources directory: + ```yaml apiVersion: dapr.io/v1alpha1 @@ -910,7 +912,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --resources-path ../../../resources/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` `checkout` service output: @@ -976,10 +978,10 @@ go build . Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . +dapr run --app-port 6001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- go run . ``` -### Step 3: Run the `checkout` service application with resiliency enabled +### Step 3: Run the `checkout` service application In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. @@ -994,13 +996,14 @@ Install dependencies: go build . ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- go run . +dapr run --app-id checkout --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3500 -- go run . ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: +The Dapr sidecar then loads the resiliency spec located in the resources directory: + ```yaml apiVersion: dapr.io/v1alpha1 @@ -1139,7 +1142,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . +dapr run --app-port 6001 --app-id order-processor --resources-path ../../../resources/ --app-protocol http --dapr-http-port 3501 -- go run . ``` `checkout` service output: diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 13756b748..b572cb8b1 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -8,7 +8,7 @@ description: "Get started with Dapr's resiliency capabilities via the state mana Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: -- Execute a microservice application with resiliency enabled that continuously persists and retrieves state via Dapr's state management API. +- Execute a microservice application that continuously persists and retrieves state via Dapr's state management API. - Trigger resiliency policies by simulating a system failure. - Resolve the failure and the microservice application will resume. @@ -50,9 +50,10 @@ Install dependencies pip3 install -r requirements.txt ``` -### Step 2: Run the application with resiliency enabled +### Step 2: Run the application + +Run the `order-processor` service alongside a Dapr sidecar. The Dapr sidecar then loads the resiliency spec located in the resources directory: -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: ```yaml apiVersion: dapr.io/v1alpha1 @@ -85,7 +86,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- python3 +dapr run --app-id order-processor --resources-path ../../../resources/ -- python3 ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -128,7 +129,7 @@ Once Redis is stopped, the requests begin to fail and the retry policy titled `r INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryForever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -219,9 +220,10 @@ Install dependencies npm install ``` -### Step 2: Run the application with resiliency enabled +### Step 2: Run the application + +Run the `order-processor` service alongside a Dapr sidecar. The Dapr sidecar then loads the resiliency spec located in the resources directory: -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: ```yaml apiVersion: dapr.io/v1alpha1 @@ -253,7 +255,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ``` ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- npm start +dapr run --app-id order-processor --resources-path ../../../resources/ -- npm start ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -296,7 +298,7 @@ Once Redis is stopped, the requests begin to fail and the retry policy titled `r INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryForever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -388,9 +390,9 @@ dotnet restore dotnet build ``` -### Step 2: Run the application with resiliency enabled +### Step 2: Run the application -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. The Dapr sidecar then loads the resiliency spec located in the resources directory: ```yaml apiVersion: dapr.io/v1alpha1 @@ -422,7 +424,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ``` ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- dotnet run +dapr run --app-id order-processor --resources-path ../../../resources/ -- dotnet run ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -465,7 +467,7 @@ Once Redis is stopped, the requests begin to fail and the retry policy titled `r INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryForever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -559,9 +561,9 @@ Install dependencies mvn clean install ``` -### Step 2: Run the application with resiliency enabled +### Step 2: Run the application -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. The Dapr sidecar then loads the resiliency spec located in the resources directory: ```yaml apiVersion: dapr.io/v1alpha1 @@ -593,7 +595,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ``` ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --resources-path ../../../resources/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -636,7 +638,7 @@ Once Redis is stopped, the requests begin to fail and the retry policy titled `r INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryForever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -727,9 +729,9 @@ Install dependencies go build . ``` -### Step 2: Run the application with resiliency enabled +### Step 2: Run the application -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. The Dapr sidecar then loads the resiliency spec located in the resources directory: ```yaml apiVersion: dapr.io/v1alpha1 @@ -761,7 +763,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ``` ```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components -- go run . +dapr run --app-id order-processor --resources-path ../../../resources -- go run . ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -804,7 +806,7 @@ Once Redis is stopped, the requests begin to fail and the retry policy titled `r INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryForever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: diff --git a/daprdocs/content/en/operations/components/pluggable-components-registration.md b/daprdocs/content/en/operations/components/pluggable-components-registration.md index d7e91e347..06a4b6a2e 100644 --- a/daprdocs/content/en/operations/components/pluggable-components-registration.md +++ b/daprdocs/content/en/operations/components/pluggable-components-registration.md @@ -57,7 +57,7 @@ Since you are running Dapr in the same host as the component, verify this folder Define your component using a [component spec]({{< ref component-schema.md >}}). Your component's `type` is derived from the socket name, without the file extension. -Save the component YAML file in the components-path, replacing: +Save the component YAML file in the resources-path, replacing: - `your_socket_goes_here` with your component socket name (no extension) - `your_component_type` with your component type From 62c4b17fb9d27f1322a4f63843ff3575d5bd957c Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 25 Jan 2023 16:46:03 -0600 Subject: [PATCH 31/39] update strimzi link Signed-off-by: Hannah Hunter --- .../components-reference/supported-pubsub/setup-apache-kafka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md index 86d4a350c..a18b8c261 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md @@ -337,7 +337,7 @@ To run without Docker, see the getting started guide [here](https://kafka.apache {{% /codetab %}} {{% codetab %}} -To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/docs/operators/latest/quickstart.html#ref-install-prerequisites-str). +To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/quickstarts/). {{% /codetab %}} {{< /tabs >}} From 3fa9fabee0263bbfa5b752652a72a09cf1805648 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Fri, 27 Jan 2023 00:27:13 -0600 Subject: [PATCH 32/39] fix typo (#3082) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../supported-pubsub/setup-jetstream.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md index 815430fd7..d62a73fe3 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md @@ -62,7 +62,7 @@ spec: value: false - name: rateLimit value: 1024 - - name: hearbeat + - name: heartbeat value: 15s - name: ackPolicy value: explicit @@ -98,7 +98,7 @@ spec: | replicas | N | [Replicas] | `3` | | memoryStorage | N | [Memory Storage] | `false` | | rateLimit | N | [Rate Limit] | `1024` | -| hearbeat | N | [Hearbeat] | `10s` | +| heartbeat | N | [Heartbeat] | `10s` | | ackPolicy | N | [Ack Policy] | `explicit` | | deliverPolicy | N | One of: all, last, new, sequence, time | `all` | | domain | N | [JetStream Leafondes] | `HUB` | @@ -166,7 +166,7 @@ nats -s localhost:4222 stream add myStream --subjects mySubject [Replicas]: https://docs.nats.io/jetstream/concepts/consumers#replicas [Memory Storage]: https://docs.nats.io/jetstream/concepts/consumers#memorystorage [Rate Limit]: https://docs.nats.io/jetstream/concepts/consumers#ratelimit -[Hearbeat]: https://docs.nats.io/jetstream/concepts/consumers#hearbeat +[Heartbeat]: https://docs.nats.io/jetstream/concepts/consumers#heartbeat [Ack Policy]: https://docs.nats.io/nats-concepts/jetstream/consumers#ackpolicy [JetStream Leafonodes]: https://docs.nats.io/running-a-nats-service/configuration/leafnodes/jetstream_leafnodes [Decentralized JWT Authentication/Authorization]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/jwt From 07ab3ebda9440f1ca9a9470eb3411cac2fd930e0 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Mon, 30 Jan 2023 10:59:37 +0530 Subject: [PATCH 33/39] Add explicit feature to comp data Signed-off-by: Shubham Sharma --- daprdocs/data/components/pubsub/aws.yaml | 3 +++ daprdocs/data/components/pubsub/gcp.yaml | 3 +++ daprdocs/data/components/pubsub/generic.yaml | 24 ++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/daprdocs/data/components/pubsub/aws.yaml b/daprdocs/data/components/pubsub/aws.yaml index fa5328ab9..07db7e27d 100644 --- a/daprdocs/data/components/pubsub/aws.yaml +++ b/daprdocs/data/components/pubsub/aws.yaml @@ -3,3 +3,6 @@ state: Beta version: v1 since: "1.6" + features: + bulkPublish: false + bulkSubscribe: false diff --git a/daprdocs/data/components/pubsub/gcp.yaml b/daprdocs/data/components/pubsub/gcp.yaml index 8fd547af9..815ced19b 100644 --- a/daprdocs/data/components/pubsub/gcp.yaml +++ b/daprdocs/data/components/pubsub/gcp.yaml @@ -3,3 +3,6 @@ state: Alpha version: v1 since: "1.0" + features: + bulkPublish: false + bulkSubscribe: false diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index ab1bf5d01..02035a7ec 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -3,11 +3,17 @@ state: Beta version: v1 since: "1.7" + features: + bulkPublish: false + bulkSubscribe: false - component: In Memory link: setup-inmemory state: Beta version: v1 since: "1.7" + features: + bulkPublish: false + bulkSubscribe: false - component: Apache Kafka link: setup-apache-kafka state: Stable @@ -21,28 +27,46 @@ state: Stable version: v1 since: "1.0" + features: + bulkPublish: false + bulkSubscribe: false - component: JetStream link: setup-jetstream state: Alpha version: v1 since: "1.4" + features: + bulkPublish: false + bulkSubscribe: false - component: Pulsar link: setup-pulsar state: Beta version: v1 since: "1.7" + features: + bulkPublish: false + bulkSubscribe: false - component: MQTT link: setup-mqtt state: Stable version: v1 since: "1.7" + features: + bulkPublish: false + bulkSubscribe: false - component: NATS Streaming link: setup-nats-streaming state: Beta version: v1 since: "1.0" + features: + bulkPublish: false + bulkSubscribe: false - component: RabbitMQ link: setup-rabbitmq state: Stable version: v1 since: "1.7" + features: + bulkPublish: false + bulkSubscribe: false From 73ebc9ac40f0842e30f350da98c4071da4ea9956 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Mon, 30 Jan 2023 12:14:01 +0530 Subject: [PATCH 34/39] Add more examples Signed-off-by: Shubham Sharma --- .../building-blocks/pubsub/pubsub-bulk.md | 135 ++++++++++++++++-- .../building-blocks/pubsub/pubsub-overview.md | 2 +- .../content/en/reference/api/pubsub_api.md | 10 +- 3 files changed, 133 insertions(+), 14 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md index e7ebc89ef..afaff5430 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md @@ -1,7 +1,7 @@ --- type: docs -title: "Send and receive messages in bulk" -linkTitle: "Send and receive messages in bulk" +title: "Publish and subscribe to bulk messages" +linkTitle: "Publish and subscribe to bulk messages" weight: 7100 description: "Learn how to use the bulk publish and subscribe APIs in Dapr." --- @@ -10,7 +10,8 @@ description: "Learn how to use the bulk publish and subscribe APIs in Dapr." The bulk publish and subscribe APIs are in **alpha** stage. {{% /alert %}} -With the bulk publish and subscribe APIs, you can send and receive multiple messages in a single request. +With the bulk publish and subscribe APIs, you can publish and subscribe to multiple messages in a single request. + ## Native bulk publish and subscribe support @@ -28,7 +29,7 @@ The bulk publish API allows you to publish multiple messages to a topic in a sin ### Example -{{< tabs Java Javascript "HTTP API (Bash)" "HTTP API (PowerShell)" >}} +{{< tabs Java Javascript Dotnet Python Go "HTTP API (Bash)" "HTTP API (PowerShell)" >}} {{% codetab %}} @@ -41,6 +42,9 @@ import java.util.ArrayList; import java.util.List; class BulkPublisher { + private static final String PUBSUB_NAME = "my-pubsub-name"; + private static final String TOPIC_NAME = "topic-a"; + public void publishMessages() { try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) { // Create a list of messages to publish @@ -112,19 +116,134 @@ start().catch((e) => { {{% codetab %}} +```csharp +using System; +using System.Collections.Generic; +using Dapr.Client; + +const string PubsubName = "my-pubsub-name"; +const string TopicName = "topic-a"; +IReadOnlyList BulkPublishData = new List() { + new { Id = "17", Amount = 10m }, + new { Id = "18", Amount = 20m }, + new { Id = "19", Amount = 30m } +}; + +using var client = new DaprClientBuilder().Build(); + +var res = await client.BulkPublishEventAsync(PubsubName, TopicName, BulkPublishData); +if (res == null) { + throw new Exception("null response from dapr"); +} +if (res.FailedEntries.Count > 0) +{ + Console.WriteLine("Some events failed to be published!"); + foreach (var failedEntry in res.FailedEntries) + { + Console.WriteLine("EntryId: " + failedEntry.Entry.EntryId + " Error message: " + + failedEntry.ErrorMessage); + } +} +else +{ + Console.WriteLine("Published all events!"); +} +``` + +{{% /codetab %}} + +{{% codetab %}} + +```python +import requests +import json + +base_url = "http://localhost:3500/v1.0-alpha1/publish/bulk/{}/{}" +pubsub_name = "my-pubsub-name" +topic_name = "topic-a" +payload = [ + { + "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", + "event": "first text message", + "contentType": "text/plain" + }, + { + "entryId": "b1f40bd6-4af2-11ed-b878-0242ac120002", + "event": { + "message": "second JSON message" + }, + "contentType": "application/json" + } +] + +response = requests.post(base_url.format(pubsub_name, topic_name), json=payload) +print(response.status_code) +``` + +{{% /codetab %}} + +{{% codetab %}} + +```go +package main + +import ( + "fmt" + "strings" + "net/http" + "io/ioutil" +) + +const ( + pubsubName = "my-pubsub-name" + topicName = "topic-a" + baseUrl = "http://localhost:3500/v1.0-alpha1/publish/bulk/%s/%s" +) + +func main() { + url := fmt.Sprintf(baseUrl, pubsubName, topicName) + method := "POST" + payload := strings.NewReader(`[ + { + "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", + "event": "first text message", + "contentType": "text/plain" + }, + { + "entryId": "b1f40bd6-4af2-11ed-b878-0242ac120002", + "event": { + "message": "second JSON message" + }, + "contentType": "application/json" + } +]`) + + client := &http.Client {} + req, _ := http.NewRequest(method, url, payload) + + req.Header.Add("Content-Type", "application/json") + res, err := client.Do(req) + // ... +} +``` + +{{% /codetab %}} + +{{% codetab %}} + ```bash curl -X POST http://localhost:3500/v1.0-alpha1/publish/bulk/my-pubsub-name/topic-a \ -H 'Content-Type: application/json' \ -d '[ { "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", - "event": "first", + "event": "first text message", "contentType": "text/plain" }, { "entryId": "b1f40bd6-4af2-11ed-b878-0242ac120002", "event": { - "message": "second" + "message": "second JSON message" }, "contentType": "application/json" }, @@ -140,13 +259,13 @@ Invoke-RestMethod -Method Post -ContentType 'application/json' -Uri 'http://loca -Body '[ { "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", - "event": "first", + "event": "first text message", "contentType": "text/plain" }, { "entryId": "b1f40bd6-4af2-11ed-b878-0242ac120002", "event": { - "message": "second" + "message": "second JSON message" }, "contentType": "application/json" }, diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md index 93bc84314..b7c999a94 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md @@ -119,7 +119,7 @@ By default, all topic messages associated with an instance of a pub/sub componen Dapr can set a timeout message on a per-message basis, meaning that if the message is not read from the pub/sub component, then the message is discarded. This timeout message prevents a build up of unread messages. If a message has been in the queue longer than the configured TTL, it is marked as dead. For more information, read [pub/sub message TTL]({{< ref pubsub-message-ttl.md >}}). -### Send and receive messages in bulk +### Publish and subscribe to bulk messages Dapr supports sending and receiving multiple messages in a single request. This is useful for applications that require a high throughput. For more information, read [pub/sub bulk messages]({{< ref pubsub-bulk.md >}}). diff --git a/daprdocs/content/en/reference/api/pubsub_api.md b/daprdocs/content/en/reference/api/pubsub_api.md index 3bdbe09aa..198f71f10 100644 --- a/daprdocs/content/en/reference/api/pubsub_api.md +++ b/daprdocs/content/en/reference/api/pubsub_api.md @@ -89,13 +89,13 @@ curl -X POST http://localhost:3500/v1.0-alpha1/publish/bulk/pubsubName/deathStar -d '[ { "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", - "event": "first", + "event": "first text message", "contentType": "text/plain" }, { "entryId": "b1f40bd6-4af2-11ed-b878-0242ac120002", "event": { - "message": "second" + "message": "second JSON message" }, "contentType": "application/json" }, @@ -104,7 +104,7 @@ curl -X POST http://localhost:3500/v1.0-alpha1/publish/bulk/pubsubName/deathStar ### Headers -The `Content-Type` header should always be set to `application/json`. +The `Content-Type` header should always be set to `application/json` since the request body is a JSON array. ### URL Parameters @@ -134,14 +134,14 @@ Metadata can be sent via query parameters in the request's URL. It must be prefi |403|Forbidden by access controls| |500|At least one message failed to be delivered| -The response body is a JSON containing a list of failed entries. Example: +In case of a 500 status code, the response body will contain a JSON object containing a list of entries that failed to be delivered. For example from our request above, if the entry with event `"first text message"` failed to be delivered, the response would contain its entry ID and an error message from the underlying pub/sub component. ```json { "failedEntries": [ { "entryId": "ae6bf7c6-4af2-11ed-b878-0242ac120002", - "error": "error message" + "error": "some error message" }, ], "errorCode": "ERR_PUBSUB_PUBLISH_MESSAGE" From 864db6341f98a54607997cb8dc80113c2c82fb65 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Mon, 30 Jan 2023 13:15:15 +0530 Subject: [PATCH 35/39] Address comments Signed-off-by: Shubham Sharma --- .../building-blocks/pubsub/pubsub-bulk.md | 29 ++++++++++--------- .../building-blocks/pubsub/pubsub-overview.md | 2 +- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md index afaff5430..35c88dd86 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-bulk.md @@ -10,22 +10,15 @@ description: "Learn how to use the bulk publish and subscribe APIs in Dapr." The bulk publish and subscribe APIs are in **alpha** stage. {{% /alert %}} -With the bulk publish and subscribe APIs, you can publish and subscribe to multiple messages in a single request. - - -## Native bulk publish and subscribe support - -When a pub/sub component supports the bulk publish API natively, Dapr also publishes messages to the underlying pub/sub component in bulk. - -Otherwise, Dapr falls back to sending messages one by one to the underlying pub/sub component. This is still more efficient than using the regular publish API, because applications can still send multiple messages in a single request to Dapr. - -## Supported components - -Refer to the [component reference]({{< ref supported-pubsub >}}) to see which components support the bulk publish API natively. +With the bulk publish and subscribe APIs, you can publish and subscribe to multiple messages in a single request. When writing applications that need to send or receive a large number of messages, using bulk operations allows achieving high throughput by reducing the overall number of requests between the Dapr sidecar, the application, and the underlying pub/sub broker. ## Publishing messages in bulk -The bulk publish API allows you to publish multiple messages to a topic in a single request. If any of the messages fail to publish, the bulk publish operation returns a list of failed messages. Note, the bulk publish operation does not guarantee the order of messages. +### Restrictions when publishing messages in bulk + +The bulk publish API allows you to publish multiple messages to a topic in a single request. It is *non-transactional*, i.e., from a single bulk request, some messages can succeed and some can fail. If any of the messages fail to publish, the bulk publish operation returns a list of failed messages. + +The bulk publish operation also does not guarantee any ordering of messages. ### Example @@ -276,6 +269,16 @@ Invoke-RestMethod -Method Post -ContentType 'application/json' -Uri 'http://loca {{< /tabs >}} +## How components handle publishing and subscribing to bulk messages + +Some pub/sub brokers support sending and receiving multiple messages in a single request. When a component supports bulk publish or subscribe operations, Dapr runtime uses them to further optimize the communication between the Dapr sidecar and the underlying pub/sub broker. + +For components that do not have bulk publish or subscribe support, Dapr runtime uses the regular publish and subscribe APIs to send and receive messages one by one. This is still more efficient than directly using the regular publish or subscribe APIs, because applications can still send/receive multiple messages in a single request to/from Dapr. + +## Supported components + +Refer to the [component reference]({{< ref supported-pubsub >}}) to see which components support bulk publish and subscribe operations. + ## Related links - List of [supported pub/sub components]({{< ref supported-pubsub >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md index b7c999a94..b0015ee2e 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md @@ -121,7 +121,7 @@ Dapr can set a timeout message on a per-message basis, meaning that if the messa ### Publish and subscribe to bulk messages -Dapr supports sending and receiving multiple messages in a single request. This is useful for applications that require a high throughput. For more information, read [pub/sub bulk messages]({{< ref pubsub-bulk.md >}}). +Dapr supports sending and receiving multiple messages in a single request. When writing applications that need to send or receive a large number of messages, using bulk operations allows achieving high throughput by reducing the overall number of requests. For more information, read [pub/sub bulk messages]({{< ref pubsub-bulk.md >}}). ## Try out pub/sub From 9551d689ae7e83585513564ec7e7d64d8faea720 Mon Sep 17 00:00:00 2001 From: Pravin Pushkar Date: Wed, 1 Feb 2023 01:04:16 +0530 Subject: [PATCH 36/39] [HTTP Binding]: adding metadata options for client auth during mTLS (#3050) * [HTTP Binding]: adding metadata options for client authentication during mTLS Signed-off-by: Pravin Pushkar * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Pravin Pushkar * Update daprdocs/content/en/reference/components-reference/supported-bindings/http.md Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-bindings/http.md Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-bindings/http.md Signed-off-by: Mark Fussell --------- Signed-off-by: Pravin Pushkar Signed-off-by: Mark Fussell Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../supported-bindings/http.md | 21 + daprdocs/package-lock.json | 873 ++++++++++++------ 2 files changed, 625 insertions(+), 269 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/http.md b/daprdocs/content/en/reference/components-reference/supported-bindings/http.md index ab0ba190a..4d71f6ae6 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/http.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/http.md @@ -20,6 +20,13 @@ spec: metadata: - name: url value: http://something.com + - name: MTLSRootCA + value: /Users/somepath/root.pem # or + - name: MTLSClientCert + value: /Users/somepath/client.pem # or + - name: MTLSClientKey + value: /Users/somepath/client.key # or + ``` ## Spec metadata fields @@ -27,6 +34,9 @@ spec: | Field | Required | Binding support | Details | Example | |--------------------|:--------:|--------|--------|---------| | url | Y | Output |The base URL of the HTTP endpoint to invoke | `http://host:port/path`, `http://myservice:8000/customers` +| MTLSRootCA | N | Output |Path to root ca certificate or pem encoded string | +| MTLSClientCert | N | Output |Path to client certificate or pem encoded string | +| MTLSClientKey | N | Output |Path client private key or pem encoded string | ## Binding support @@ -292,6 +302,17 @@ curl -d '{ "operation": "get" }' \ {{< /tabs >}} +## Using mTLS or enabling client TLS authentication along with HTTPS +You can configure the HTTP binding to use mTLS or client TLS authentication along with HTTPS by providing the `MTLSRootCA`, `MTLSClientCert`, and `MTLSClientKey` metadata fields in the binding component. + +These fields can be passed as a file path or as a pem encoded string. +- If the file path is provided, the file is read and the contents are used. +- If the pem encoded string is provided, the string is used as is. +When these fields are configured, the Dapr sidecar uses the provided certificate to authenticate itself with the server during the TLS handshake process. + +### When to use: +You can use this when the server with which the HTTP binding is configured to communicate requires mTLS or client TLS authentication. + ## Related links diff --git a/daprdocs/package-lock.json b/daprdocs/package-lock.json index 2d310e1d5..adc813bba 100644 --- a/daprdocs/package-lock.json +++ b/daprdocs/package-lock.json @@ -1,615 +1,842 @@ { "name": "dapr-docs-hugo", "version": "0.0.1", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { + "packages": { + "": { + "name": "dapr-docs-hugo", + "version": "0.0.1", + "dependencies": { + "autoprefixer": "^10.2.5", + "postcss": "^8.3.0" + }, + "devDependencies": { + "autoprefixer": "^10.2.5", + "postcss-cli": "^8.3.1" + } + }, + "node_modules/@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.12.13" } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", "dev": true }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@types/color-name": { + "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "@types/parse-json": { + "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "at-least-node": { + "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, - "autoprefixer": { + "node_modules/autoprefixer": { "version": "10.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz", "integrity": "sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==", - "requires": { + "dev": true, + "dependencies": { "browserslist": "^4.16.6", "caniuse-lite": "^1.0.30001230", "colorette": "^1.2.2", "fraction.js": "^4.1.1", "normalize-range": "^0.1.2", "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.16.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { + "dev": true, + "dependencies": { "caniuse-lite": "^1.0.30001219", "colorette": "^1.2.2", "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001230", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==" + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" } }, - "cliui": { + "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colorette": { + "node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, - "cosmiconfig": { + "node_modules/cosmiconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, - "requires": { + "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" } }, - "dependency-graph": { + "node_modules/dependency-graph": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6.0" + } }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.3.739", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", - "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==" + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "dev": true }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { + "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" } }, - "fastq": { + "node_modules/fastq": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "fraction.js": { + "node_modules/fraction.js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } }, - "fs-extra": { + "node_modules/fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, - "requires": { + "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" } }, - "fsevents": { + "node_modules/fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-stdin": { + "node_modules/get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "globby": { + "node_modules/globby": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "ignore": { + "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-cwd": { + "node_modules/import-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", "dev": true, - "requires": { + "dependencies": { "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "import-from": { + "node_modules/import-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "is-arrayish": { + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "json-parse-even-better-errors": { + "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "jsonfile": { + "node_modules/jsonfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", + "dependencies": { "universalify": "^1.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "lodash.difference": { + "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", "dev": true }, - "lodash.forown": { + "node_modules/lodash.forown": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", "dev": true }, - "lodash.get": { + "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.groupby": { + "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", "dev": true }, - "lodash.sortby": { + "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "nanoid": { + "node_modules/nanoid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "node-releases": { + "node_modules/node-releases": { "version": "1.1.72", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "normalize-range": { + "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "postcss": { + "node_modules/postcss": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", - "requires": { + "dependencies": { "colorette": "^1.2.2", "nanoid": "^3.1.23", "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "postcss-cli": { + "node_modules/postcss-cli": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz", "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "chokidar": "^3.3.0", "dependency-graph": "^0.9.0", @@ -623,246 +850,348 @@ "slash": "^3.0.0", "yargs": "^16.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "bin": { + "postcss": "bin/postcss" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "postcss-load-config": { + "node_modules/postcss-cli/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/postcss-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/postcss-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-load-config": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz", "integrity": "sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==", "dev": true, - "requires": { + "dependencies": { "cosmiconfig": "^7.0.0", "import-cwd": "^3.0.0" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "postcss-reporter": { + "node_modules/postcss-reporter": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz", "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==", "dev": true, - "requires": { + "dependencies": { "colorette": "^1.2.1", "lodash.difference": "^4.5.0", "lodash.forown": "^4.4.0", "lodash.get": "^4.4.2", "lodash.groupby": "^4.6.0", "lodash.sortby": "^4.7.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "postcss-value-parser": { + "node_modules/postcss-value-parser": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true }, - "pretty-hrtime": { + "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "read-cache": { + "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, - "requires": { + "dependencies": { "pify": "^2.3.0" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "source-map-js": { + "node_modules/source-map-js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "universalify": { + "node_modules/universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "y18n": { + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yaml": { + "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "yargs": { + "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -870,13 +1199,19 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } } } -} \ No newline at end of file +} From a547209996fc797853de2018d57b104f747cb79c Mon Sep 17 00:00:00 2001 From: Roberto Rojas Date: Tue, 31 Jan 2023 15:11:35 -0500 Subject: [PATCH 37/39] [1.10][AWS SNS/SQS] PubSub Component to Stable (#3095) * marks aws snssqs state store component as stable Signed-off-by: Roberto J Rojas * updates pubsub sqs component docs Signed-off-by: Roberto J Rojas --------- Signed-off-by: Roberto J Rojas --- .../supported-pubsub/setup-aws-snssqs.md | 7 +++++++ daprdocs/data/components/pubsub/aws.yaml | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-aws-snssqs.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-aws-snssqs.md index 06f540d8b..f0332f086 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-aws-snssqs.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-aws-snssqs.md @@ -105,14 +105,21 @@ Using SQS FIFO (`fifo` metadata field set to `"true"`) per AWS specifications pr Specifying `fifoMessageGroupID` limits the number of concurrent consumers of the FIFO queue used to only one but guarantees global ordering of messages published by the app's Dapr sidecars. See [this AWS blog post](https://aws.amazon.com/blogs/compute/solving-complex-ordering-challenges-with-amazon-sqs-fifo-queues/) to better understand the topic of Message Group IDs and FIFO queues. +To avoid losing the order of messages delivered to consumers, the FIFO configuration for the SQS Component requires the `concurrencyMode` metadata field set to `"single"`. + #### Default parallel `concurrencyMode` Since v1.8.0, the component supports the `"parallel"` `concurrencyMode` as its default mode. In prior versions, the component default behavior was calling the subscriber a single message at a time and waiting for its response. +#### SQS dead-letter Queues + +When configuring the PubSub component with SQS dead-letter queues, the metadata fields `messageReceiveLimit` and `sqsDeadLettersQueueName` must both be set to a value. For `messageReceiveLimit`, the value must be greater than `0` and the `sqsDeadLettersQueueName` must not be empty string. + {{% alert title="Important" color="warning" %}} When running the Dapr sidecar (`daprd`) with your application on EKS (AWS Kubernetes) node/pod already attached to an IAM policy defining access to AWS resources, you **must not** provide AWS access-key, secret-key, and tokens in the definition of the component spec. {{% /alert %}} + ## Create an SNS/SQS instance {{< tabs "Self-Hosted" "Kubernetes" "AWS" >}} diff --git a/daprdocs/data/components/pubsub/aws.yaml b/daprdocs/data/components/pubsub/aws.yaml index fa5328ab9..682428c38 100644 --- a/daprdocs/data/components/pubsub/aws.yaml +++ b/daprdocs/data/components/pubsub/aws.yaml @@ -1,5 +1,5 @@ - component: AWS SNS/SQS link: setup-aws-snssqs - state: Beta + state: Stable version: v1 - since: "1.6" + since: "1.10" From 8d17f5f4dd0c464e1c173974c916874d1709c45a Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Wed, 1 Feb 2023 13:10:16 -0600 Subject: [PATCH 38/39] update code sample to mark suggestion in issue (#3090) Signed-off-by: Hannah Hunter --- .../howto-invoke-discover-services.md | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md index e73456d4b..183b537f6 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md +++ b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md @@ -191,25 +191,24 @@ using System.Threading; //code namespace EventService { - class Program - { - static async Task Main(string[] args) - { - while(true) { - System.Threading.Thread.Sleep(5000); - Random random = new Random(); - int orderId = random.Next(1,1000); - CancellationTokenSource source = new CancellationTokenSource(); - CancellationToken cancellationToken = source.Token; - using var client = new DaprClientBuilder().Build(); - //Using Dapr SDK to invoke a method - var result = client.CreateInvokeMethodRequest(HttpMethod.Get, "checkout", "checkout/" + orderId, cancellationToken); - await client.InvokeMethodAsync(result); - Console.WriteLine("Order requested: " + orderId); - Console.WriteLine("Result: " + result); - } - } - } + class Program + { + static async Task Main(string[] args) + { + while(true) { + System.Threading.Thread.Sleep(5000); + Random random = new Random(); + int orderId = random.Next(1,1000); + using var client = new DaprClientBuilder().Build(); + + //Using Dapr SDK to invoke a method + var result = client.CreateInvokeMethodRequest(HttpMethod.Get, "checkout", "checkout/" + orderId); + await client.InvokeMethodAsync(result); + Console.WriteLine("Order requested: " + orderId); + Console.WriteLine("Result: " + result); + } + } + } } ``` From 492751f66f787b04afca3f428f94edef8f5aeb4d Mon Sep 17 00:00:00 2001 From: Yaron Schneider Date: Wed, 1 Feb 2023 17:27:39 -0800 Subject: [PATCH 39/39] add security token for http binding (#3109) Signed-off-by: yaron2 --- .../supported-bindings/http.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/http.md b/daprdocs/content/en/reference/components-reference/supported-bindings/http.md index 4d71f6ae6..bc2184073 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/http.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/http.md @@ -21,12 +21,17 @@ spec: - name: url value: http://something.com - name: MTLSRootCA - value: /Users/somepath/root.pem # or + value: /Users/somepath/root.pem # OPTIONAL or - name: MTLSClientCert - value: /Users/somepath/client.pem # or + value: /Users/somepath/client.pem # OPTIONAL or - name: MTLSClientKey - value: /Users/somepath/client.key # or - + value: /Users/somepath/client.key # OPTIONAL or + - name: securityToken # OPTIONAL + secretKeyRef: + name: mysecret + key: mytoken + - name: securityTokenHeader + value: "Authorization: Bearer" # OPTIONAL
``` ## Spec metadata fields @@ -37,6 +42,8 @@ spec: | MTLSRootCA | N | Output |Path to root ca certificate or pem encoded string | | MTLSClientCert | N | Output |Path to client certificate or pem encoded string | | MTLSClientKey | N | Output |Path client private key or pem encoded string | +| securityToken | N | Output |The value of a token to be added to an HTTP request as a header. Used together with `securityTokenHeader` | +| securityTokenHeader| N | Output |The name of the header for `securityToken` on an HTTP request that | ## Binding support