From 9ff3dfd63c634b8485eadfcdfb955af84e7fe205 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Sat, 27 Jan 2024 07:04:19 -0600
Subject: [PATCH 01/38] Fix incorrect doc for java sdk
Java SDK already support creating timer.
Signed-off-by: kaibocai <89094811+kaibocai@users.noreply.github.com>
---
.../building-blocks/workflow/workflow-patterns.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md
index c7aebca4e..3caeddad2 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md
@@ -496,9 +496,8 @@ public class MonitorWorkflow extends Workflow {
}
// Put the workflow to sleep until the determined time
- // Note: ctx.createTimer() method is not supported in the Java SDK yet
try {
- TimeUnit.SECONDS.sleep(nextSleepInterval.getSeconds());
+ ctx.createTimer(nextSleepInterval);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
@@ -745,4 +744,4 @@ External events don't have to be directly triggered by humans. They can also be
- Try out the following examples:
- [Python](https://github.com/dapr/python-sdk/tree/master/examples/demo_workflow)
- [.NET](https://github.com/dapr/dotnet-sdk/tree/master/examples/Workflow)
- - [Java](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/workflows)
\ No newline at end of file
+ - [Java](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/workflows)
From 26663223111fc21ffc75fdbc626d6ec81d999126 Mon Sep 17 00:00:00 2001
From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
Date: Wed, 31 Jan 2024 09:47:02 -0800
Subject: [PATCH 02/38] Clarify actor state store support for MongoDB
Fixes #3303
Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
---
.../supported-state-stores/setup-mongodb.md | 29 +++++++++++--------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 428953dd3..50686e7fd 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -47,20 +47,23 @@ spec:
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 %}}
-If you wish to use MongoDB as an actor store, append the following to the yaml.
+### Actor state store and transactions support
+
+For using as an actor state store or to leverage transactions, MongoDB must be running in a [Replica Set](https://www.mongodb.com/docs/manual/replication/).
+
+If you wish to use MongoDB as an actor store, add this metadata option to your Component YAML:
```yaml
- name: actorStateStore
value: "true"
```
-
## Spec metadata fields
| Field | Required | Details | Example |
|--------------------|:--------:|---------|---------|
-| server | Y* | The server to connect to, when using DNS SRV record | `"server.example.com"`
-| host | Y* | The host to connect to | `"mongo-mongodb.default.svc.cluster.local:27017"`
+| server | Y1 | The server to connect to, when using DNS SRV record | `"server.example.com"`
+| host | Y1 | The host to connect to | `"mongo-mongodb.default.svc.cluster.local:27017"`
| username | N | The username of the user to connect with (applicable in conjunction with `host`) | `"admin"`
| password | N | The password of the user (applicable in conjunction with `host`) | `"password"`
| databaseName | N | The name of the database to use. Defaults to `"daprStore"` | `"daprStore"`
@@ -68,11 +71,11 @@ If you wish to use MongoDB as an actor store, append the following to the yaml.
| writeConcern | N | The write concern to use | `"majority"`
| readConcern | N | The read concern to use | `"majority"`, `"local"`,`"available"`, `"linearizable"`, `"snapshot"`
| operationTimeout | N | The timeout for the operation. Defaults to `"5s"` | `"5s"`
-| params | N** | Additional parameters to use | `"?authSource=daprStore&ssl=true"`
+| params | N2 | Additional parameters to use | `"?authSource=daprStore&ssl=true"`
-> [*] The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr will return an error.
+> [1] The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr will return an error.
-> [**] The `params` field accepts a query string that specifies connection specific options as `=` pairs, separated by `"&"` and prefixed with `"?"`. e.g. to use "daprStore" db as authentication database and enabling SSL/TLS in connection, specify params as `"?authSource=daprStore&ssl=true"`. See [the mongodb manual](https://docs.mongodb.com/manual/reference/connection-string/#std-label-connections-connection-options) for the list of available options and their use cases.
+> [2] The `params` field accepts a query string that specifies connection specific options as `=` pairs, separated by `&` and prefixed with `?`. e.g. to use "daprStore" db as authentication database and enabling SSL/TLS in connection, specify params as `?authSource=daprStore&ssl=true`. See [the mongodb manual](https://docs.mongodb.com/manual/reference/connection-string/#std-label-connections-connection-options) for the list of available options and their use cases.
## Setup MongoDB
@@ -81,11 +84,11 @@ If you wish to use MongoDB as an actor store, append the following to the yaml.
{{% codetab %}}
You can run MongoDB locally using Docker:
-```
+```sh
docker run --name some-mongo -d mongo
```
-You can then interact with the server using `localhost:27017`.
+You can then interact with the server at `localhost:27017`.
If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.
@@ -94,7 +97,7 @@ If you do not specify a `databaseName` value in your component definition, make
{{% codetab %}}
The easiest way to install MongoDB on Kubernetes is by using the [Helm chart](https://github.com/helm/charts/tree/master/stable/mongodb):
-```
+```sh
helm install mongo stable/mongodb
```
@@ -103,8 +106,9 @@ To interact with MongoDB, find the service with: `kubectl get svc mongo-mongodb`
For example, if installing using the example above, the MongoDB host address would be:
-`mongo-mongodb.default.svc.cluster.local:27017`
-
+```text
+mongo-mongodb.default.svc.cluster.local:27017
+```
Follow the on-screen instructions to get the root password for MongoDB.
The username is `admin` by default.
@@ -117,6 +121,7 @@ The username is `admin` by default.
This state store supports [Time-To-Live (TTL)]({{< ref state-store-ttl.md >}}) for records stored with Dapr. When storing data using Dapr, you can set the `ttlInSeconds` metadata property to indicate when the data should be considered "expired".
## Related links
+
- [Basic schema for a Dapr component]({{< ref component-schema >}})
- Read [this guide]({{< ref "howto-get-save-state.md#step-2-save-and-retrieve-a-single-state" >}}) for instructions on configuring state store components
- [State management building block]({{< ref state-management >}})
From 11730336ead6ba9de5d89c952eeb53ae6e99233e Mon Sep 17 00:00:00 2001
From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Date: Wed, 31 Jan 2024 18:07:53 -0500
Subject: [PATCH 03/38] Fix incorrect statement regarding actor timers (#3977)
* update incorrect sentence
Signed-off-by: Hannah Hunter
* mark edit
Signed-off-by: Hannah Hunter
---------
Signed-off-by: Hannah Hunter
Co-authored-by: Mark Fussell
---
.../building-blocks/actors/actors-features-concepts.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/actors/actors-features-concepts.md b/daprdocs/content/en/developing-applications/building-blocks/actors/actors-features-concepts.md
index a9e82c287..e486b3243 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/actors/actors-features-concepts.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/actors/actors-features-concepts.md
@@ -14,7 +14,9 @@ Now that you've learned about the [actor building block]({{< ref "actors-overvie
Dapr actors are virtual, meaning that their lifetime is not tied to their in-memory representation. As a result, they do not need to be explicitly created or destroyed. The Dapr actor runtime automatically activates an actor the first time it receives a request for that actor ID. If an actor is not used for a period of time, the Dapr actor runtime garbage-collects the in-memory object. It will also maintain knowledge of the actor's existence should it need to be reactivated later.
-Invocation of actor methods and reminders reset the idle time, e.g. reminder firing will keep the actor active. Actor reminders fire whether an actor is active or inactive, if fired for inactive actor, it will activate the actor first. Actor timers do not reset the idle time, so timer firing will not keep the actor active. Timers only fire while the actor is active.
+Invocation of actor methods, timers, and reminders reset the actor idle time. For example, a reminder firing keeps the actor active.
+- Actor reminders fire whether an actor is active or inactive. If fired for an inactive actor, it activates the actor first.
+- Actor timers firing reset the idle time; however, timers only fire while the actor is active.
The idle timeout and scan interval Dapr runtime uses to see if an actor can be garbage-collected is configurable. This information can be passed when Dapr runtime calls into the actor service to get supported actor types.
From 694bd624d911fa377c2fa7ebca033f2a5789866c Mon Sep 17 00:00:00 2001
From: arthbalete <67156595+arthbalete@users.noreply.github.com>
Date: Thu, 1 Feb 2024 10:37:55 +0100
Subject: [PATCH 04/38] Documentation : Removed duplicates for failover and
sentinelMasterName in setup-redis.md
In Redis state store component configuration example (https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-redis/#component-format), "failover" and "sentinelMasterName" fields were duplicated.
This commit removes these duplicates, keeping the most verbose value (eg: " # Optional. Allowed: true, false" instead of "# Optional") and using the same position as the one in the spec metadata fields part (https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-redis/#spec-metadata-fields).
Signed-off-by: arthbalete <67156595+arthbalete@users.noreply.github.com>
---
.../supported-state-stores/setup-redis.md | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md
index 834a43ebf..366bbde0d 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md
@@ -30,18 +30,14 @@ spec:
value:
- name: enableTLS
value: # Optional. Allowed: true, false.
- - name: failover
- value: # Optional. Allowed: true, false.
- - name: sentinelMasterName
- value: # Optional
- name: maxRetries
value: # Optional
- name: maxRetryBackoff
value: # Optional
- name: failover
- value: # Optional
+ value: # Optional. Allowed: true, false.
- name: sentinelMasterName
- value: # Optional
+ value: # Optional
- name: redeliverInterval
value: # Optional
- name: processingTimeout
From fc488832c4534bfe00936d95e8a95a1dd47dcd3c Mon Sep 17 00:00:00 2001
From: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
Date: Sat, 27 Jan 2024 19:09:59 +0530
Subject: [PATCH 05/38] Add instructions to open the .dapr folder in the user
profile on Windows
Signed-off-by: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
---
.../content/en/getting-started/install-dapr-selfhost.md | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 55168bb18..4af3c0f86 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -135,9 +135,13 @@ ls $HOME/.dapr
{{% /codetab %}}
{{% codetab %}}
-
+Powershell
```powershell
-explorer "%USERPROFILE%\.dapr\"
+explorer "$env:USERPROFILE.dapr"
+```
+command line
+```cmd
+explorer "%USERPROFILE%.dapr"
```
**Result:**
From e9a7a6f995cdf8fe15c54deeb8036d5c51ec7a93 Mon Sep 17 00:00:00 2001
From: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
Date: Wed, 31 Jan 2024 22:25:09 +0530
Subject: [PATCH 06/38] Update
daprdocs/content/en/getting-started/install-dapr-selfhost.md
Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Signed-off-by: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 4af3c0f86..3550eda7d 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -135,7 +135,7 @@ ls $HOME/.dapr
{{% /codetab %}}
{{% codetab %}}
-Powershell
+You can verify using either PowerShell or command line. If using PowerShell, run:
```powershell
explorer "$env:USERPROFILE.dapr"
```
From 96cad2bbb354131b860d916696979d9229fcb81d Mon Sep 17 00:00:00 2001
From: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
Date: Wed, 31 Jan 2024 22:26:03 +0530
Subject: [PATCH 07/38] Update
daprdocs/content/en/getting-started/install-dapr-selfhost.md
Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Signed-off-by: Prashant Rewar <108176843+prashantrewar@users.noreply.github.com>
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 3550eda7d..f08b11135 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -139,7 +139,8 @@ You can verify using either PowerShell or command line. If using PowerShell, run
```powershell
explorer "$env:USERPROFILE.dapr"
```
-command line
+
+If using command line, run:
```cmd
explorer "%USERPROFILE%.dapr"
```
From d88ccb610baeae6893c62f2b53aa8b2df44b7bf7 Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Wed, 31 Jan 2024 14:54:43 -0800
Subject: [PATCH 08/38] Update
daprdocs/content/en/getting-started/install-dapr-selfhost.md
Co-authored-by: Marc Duiker
Signed-off-by: Mark Fussell
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index f08b11135..174bf6ded 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -137,7 +137,7 @@ ls $HOME/.dapr
{{% codetab %}}
You can verify using either PowerShell or command line. If using PowerShell, run:
```powershell
-explorer "$env:USERPROFILE.dapr"
+explorer "$env:USERPROFILE\.dapr"
```
If using command line, run:
From 9a35e69eb026bdc155bdb10581f59925c0623c07 Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Wed, 31 Jan 2024 14:54:48 -0800
Subject: [PATCH 09/38] Update
daprdocs/content/en/getting-started/install-dapr-selfhost.md
Co-authored-by: Marc Duiker
Signed-off-by: Mark Fussell
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 174bf6ded..6c27f4d58 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -142,7 +142,7 @@ explorer "$env:USERPROFILE\.dapr"
If using command line, run:
```cmd
-explorer "%USERPROFILE%.dapr"
+explorer "%USERPROFILE%\.dapr"
```
**Result:**
From 1cdb40f5499c9c948824f2518fb970ff96879863 Mon Sep 17 00:00:00 2001
From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com>
Date: Thu, 1 Feb 2024 09:16:18 -0800
Subject: [PATCH 10/38] Apply suggestions from code review
Co-authored-by: Mark Fussell
Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
---
.../supported-state-stores/setup-mongodb.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 50686e7fd..434afc5f8 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -49,7 +49,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr
### Actor state store and transactions support
-For using as an actor state store or to leverage transactions, MongoDB must be running in a [Replica Set](https://www.mongodb.com/docs/manual/replication/).
+When using as an actor state store or to leverage transactions, MongoDB must be running in a [Replica Set](https://www.mongodb.com/docs/manual/replication/).
If you wish to use MongoDB as an actor store, add this metadata option to your Component YAML:
@@ -73,7 +73,7 @@ If you wish to use MongoDB as an actor store, add this metadata option to your C
| operationTimeout | N | The timeout for the operation. Defaults to `"5s"` | `"5s"`
| params | N2 | Additional parameters to use | `"?authSource=daprStore&ssl=true"`
-> [1] The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr will return an error.
+> [1] The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr returns an error.
> [2] The `params` field accepts a query string that specifies connection specific options as `=` pairs, separated by `&` and prefixed with `?`. e.g. to use "daprStore" db as authentication database and enabling SSL/TLS in connection, specify params as `?authSource=daprStore&ssl=true`. See [the mongodb manual](https://docs.mongodb.com/manual/reference/connection-string/#std-label-connections-connection-options) for the list of available options and their use cases.
From 75161a0bfeebc79c312aa259c2c744c20fbfdb39 Mon Sep 17 00:00:00 2001
From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
Date: Thu, 1 Feb 2024 09:22:12 -0800
Subject: [PATCH 11/38] Changed to use the Helm chart by bitnami
Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
---
.../supported-state-stores/setup-mongodb.md | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 434afc5f8..c923f327d 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -95,23 +95,7 @@ If you do not specify a `databaseName` value in your component definition, make
{{% /codetab %}}
{{% codetab %}}
-The easiest way to install MongoDB on Kubernetes is by using the [Helm chart](https://github.com/helm/charts/tree/master/stable/mongodb):
-
-```sh
-helm install mongo stable/mongodb
-```
-
-This installs MongoDB into the `default` namespace.
-To interact with MongoDB, find the service with: `kubectl get svc mongo-mongodb`.
-
-For example, if installing using the example above, the MongoDB host address would be:
-
-```text
-mongo-mongodb.default.svc.cluster.local:27017
-```
-
-Follow the on-screen instructions to get the root password for MongoDB.
-The username is `admin` by default.
+You can conveniently install MongoDB on Kubernetes using the [Helm chart packaged by Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/). Please refer to the documentation for the Helm chart for deploying MongoDB, both as a standalone server, and with a Replica Set (required for using transactions and actors).
{{% /codetab %}}
{{< /tabs >}}
From 9af649127139631739d1c5d3b9db23d1f70fd5ab Mon Sep 17 00:00:00 2001
From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
Date: Thu, 1 Feb 2024 09:24:56 -0800
Subject: [PATCH 12/38] Updatd Docker too
Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
---
.../supported-state-stores/setup-mongodb.md | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index c923f327d..4a996bd11 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -82,16 +82,15 @@ If you wish to use MongoDB as an actor store, add this metadata option to your C
{{< tabs "Self-Hosted" "Kubernetes" >}}
{{% codetab %}}
-You can run MongoDB locally using Docker:
+You can run a single MongoDB instance locally using Docker:
```sh
docker run --name some-mongo -d mongo
```
-You can then interact with the server at `localhost:27017`.
-
-If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.
+You can then interact with the server at `localhost:27017`. If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.
+In order to use the MongoDB state store for transactions and as an actor state store, you will need to run MongoDB as a Replica Set. Please refer to [the official documentation](https://www.mongodb.com/compatibility/deploying-a-mongodb-cluster-with-docker) for how to create a 3-node Replica Set using Docker.
{{% /codetab %}}
{{% codetab %}}
From e4847eb702cb8b63219e1e6dcd785908a23cb6de Mon Sep 17 00:00:00 2001
From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Date: Thu, 1 Feb 2024 15:29:39 -0500
Subject: [PATCH 13/38] add actual valid states for runtimeStatus (#3989)
Signed-off-by: Hannah Hunter
---
daprdocs/content/en/reference/api/workflow_api.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/reference/api/workflow_api.md b/daprdocs/content/en/reference/api/workflow_api.md
index 9f9c34de8..ca272d0fa 100644
--- a/daprdocs/content/en/reference/api/workflow_api.md
+++ b/daprdocs/content/en/reference/api/workflow_api.md
@@ -235,7 +235,7 @@ The API call will provide a JSON response similar to this:
Parameter | Description
--------- | -----------
-`runtimeStatus` | The status of the workflow instance. Values include: `RUNNING`, `TERMINATED`, `PAUSED`
+`runtimeStatus` | The status of the workflow instance. Values include: `"RUNNING"`, `"COMPLETED"`, `"CONTINUED_AS_NEW"`, `"FAILED"`, `"CANCELED"`, `"TERMINATED"`, `"PENDING"`, `"SUSPENDED"`
## Component format
From de0bf93079da6fabdafa5dfa200f131474687dee Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Fri, 2 Feb 2024 08:52:40 -0800
Subject: [PATCH 14/38] Update
daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
Signed-off-by: Mark Fussell
---
.../supported-state-stores/setup-mongodb.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 4a996bd11..2255429f8 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -90,7 +90,7 @@ docker run --name some-mongo -d mongo
You can then interact with the server at `localhost:27017`. If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.
-In order to use the MongoDB state store for transactions and as an actor state store, you will need to run MongoDB as a Replica Set. Please refer to [the official documentation](https://www.mongodb.com/compatibility/deploying-a-mongodb-cluster-with-docker) for how to create a 3-node Replica Set using Docker.
+In order to use the MongoDB state store for transactions and as an actor state store, you need to run MongoDB as a Replica Set. Refer to [the official documentation](https://www.mongodb.com/compatibility/deploying-a-mongodb-cluster-with-docker) for how to create a 3-node Replica Set using Docker.
{{% /codetab %}}
{{% codetab %}}
From 6f7727c7b061855fedd4b8fb5f3a41163462d4dd Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Fri, 2 Feb 2024 08:53:54 -0800
Subject: [PATCH 15/38] Update
daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
Signed-off-by: Mark Fussell
---
.../supported-state-stores/setup-mongodb.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 2255429f8..8bcd5791c 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -94,7 +94,7 @@ In order to use the MongoDB state store for transactions and as an actor state s
{{% /codetab %}}
{{% codetab %}}
-You can conveniently install MongoDB on Kubernetes using the [Helm chart packaged by Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/). Please refer to the documentation for the Helm chart for deploying MongoDB, both as a standalone server, and with a Replica Set (required for using transactions and actors).
+You can conveniently install MongoDB on Kubernetes using the [Helm chart packaged by Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/). Refer to the documentation for the Helm chart for deploying MongoDB, both as a standalone server, and with a Replica Set (required for using transactions and actors).
{{% /codetab %}}
{{< /tabs >}}
From f36672f58c0071b3cc81c090235082c3c33e7da6 Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Fri, 2 Feb 2024 09:02:06 -0800
Subject: [PATCH 16/38] Update
daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
Signed-off-by: Mark Fussell
---
.../supported-state-stores/setup-mongodb.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
index 8bcd5791c..db3fec2ed 100644
--- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
+++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-mongodb.md
@@ -95,6 +95,12 @@ In order to use the MongoDB state store for transactions and as an actor state s
{{% codetab %}}
You can conveniently install MongoDB on Kubernetes using the [Helm chart packaged by Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/). Refer to the documentation for the Helm chart for deploying MongoDB, both as a standalone server, and with a Replica Set (required for using transactions and actors).
+This installs MongoDB into the `default` namespace.
+To interact with MongoDB, find the service with: `kubectl get svc mongo-mongodb`.
+For example, if installing using the Helm defaults above, the MongoDB host address would be:
+`mongo-mongodb.default.svc.cluster.local:27017`
+Follow the on-screen instructions to get the root password for MongoDB.
+The username is typically `admin` by default.
{{% /codetab %}}
{{< /tabs >}}
From 5555c05b990c58c2c734c409def4caab42b4d84d Mon Sep 17 00:00:00 2001
From: Hannah Hunter
Date: Mon, 5 Feb 2024 15:24:28 -0500
Subject: [PATCH 17/38] remove old versions
Signed-off-by: Hannah Hunter
---
daprdocs/config.toml | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/daprdocs/config.toml b/daprdocs/config.toml
index 2d2d5f0a8..bcc1eb945 100644
--- a/daprdocs/config.toml
+++ b/daprdocs/config.toml
@@ -209,18 +209,6 @@ url_latest_version = "https://docs.dapr.io"
[[params.versions]]
version = "v1.7"
url = "https://v1-7.docs.dapr.io"
-[[params.versions]]
- version = "v1.6"
- url = "https://v1-6.docs.dapr.io"
-[[params.versions]]
- version = "v1.5"
- url = "https://v1-5.docs.dapr.io"
-[[params.versions]]
- version = "v1.4"
- url = "https://v1-4.docs.dapr.io"
-[[params.versions]]
- version = "v1.3"
- url = "https://v1-3.docs.dapr.io"
# UI Customization
[params.ui]
From 4be49a7913e4ebcb8dbe3fbe4154b0105a6bdeb7 Mon Sep 17 00:00:00 2001
From: Hannah Hunter
Date: Tue, 6 Feb 2024 14:11:17 -0500
Subject: [PATCH 18/38] add openai to index
Signed-off-by: Hannah Hunter
---
daprdocs/data/components/bindings/azure.yaml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/daprdocs/data/components/bindings/azure.yaml b/daprdocs/data/components/bindings/azure.yaml
index 54d89da3e..af2d796b3 100644
--- a/daprdocs/data/components/bindings/azure.yaml
+++ b/daprdocs/data/components/bindings/azure.yaml
@@ -14,6 +14,14 @@
features:
input: true
output: true
+- component: Azure OpenAI
+ link: openai
+ state: Alpha
+ version: v1
+ since: "1.11"
+ features:
+ input: true
+ output: true
- component: Azure SignalR
link: signalr
state: Alpha
From 59d0101c6756bdcad5331bfb5740cc5de96c4823 Mon Sep 17 00:00:00 2001
From: Hannah Hunter
Date: Tue, 6 Feb 2024 16:45:15 -0500
Subject: [PATCH 19/38] add purge to workflow docs
Signed-off-by: Hannah Hunter
---
.../building-blocks/workflow/workflow-architecture.md | 2 ++
.../workflow/workflow-features-concepts.md | 9 +++++++++
2 files changed, 11 insertions(+)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
index 18ec9110b..8d9494cd3 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
@@ -145,6 +145,8 @@ Different state store implementations may implicitly put restrictions on the typ
Similarly, if a state store imposes restrictions on the size of a batch transaction, that may limit the number of parallel actions that can be scheduled by a workflow.
+Workflow state can be purged from a state store, purging all its history. Purging removes all metadata related to a specific workflow instance.
+
## Workflow scalability
Because Dapr Workflows are internally implemented using actors, Dapr Workflows have the same scalability characteristics as actors. The placement service:
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
index ce39d4bac..fe35284a9 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
@@ -151,6 +151,15 @@ Learn more about [external system interaction.]({{< ref "workflow-patterns.md#ex
## Limitations
+### Purging
+
+Workflow state can be purged from a state store, purging all its history and removing all metadata related to a specific workflow instance. The purge capability is typically used for workflows that have run to a `COMPLETED` or `TERMINATED` state.
+
+There are other times you may choose to purge a workflow history and reuse a workflow instance with new inputs, like:
+
+- `CONTINUED_AS_NEW` state
+- A `FAILED` workflow instance
+
### Workflow determinism and code restraints
To take advantage of the workflow replay technique, your workflow code needs to be deterministic. For your workflow code to be deterministic, you may need to work around some limitations.
From e94babe8d78f5ef40fb33d8634906386a63066bd Mon Sep 17 00:00:00 2001
From: Hannah Hunter
Date: Wed, 7 Feb 2024 12:42:22 -0500
Subject: [PATCH 20/38] cross link and update daprbot doc
Signed-off-by: Hannah Hunter
---
CONTRIBUTING.md | 2 +-
daprdocs/content/en/contributing/daprbot.md | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 259662622..35945d05d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,3 @@
# Contributing to Dapr docs
-Please see [this docs section](https://docs.dapr.io/contributing/) for general guidance on contributions to the Dapr project as well as specific guidelines on contributions to the docs repo.
\ No newline at end of file
+Please see [this docs section](https://docs.dapr.io/contributing/) for general guidance on contributions to the Dapr project as well as specific guidelines on contributions to the docs repo. Learn more about [Dapr bot commands and labels](https://docs.dapr.io/contributing/daprbot/) to improve your docs contributing experience.
\ No newline at end of file
diff --git a/daprdocs/content/en/contributing/daprbot.md b/daprdocs/content/en/contributing/daprbot.md
index 64a50a664..14fb29373 100644
--- a/daprdocs/content/en/contributing/daprbot.md
+++ b/daprdocs/content/en/contributing/daprbot.md
@@ -12,7 +12,7 @@ Dapr bot is triggered by a list of commands that helps with common tasks in the
| Command | Target | Description | Who can use | Repository |
| ---------------- | --------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------- |
-| `/assign` | Issue | Assigns an issue to a user or group of users | Anyone | `dapr`, `components-contrib`, `go-sdk` |
+| `/assign` | Issue | Assigns an issue to a user or group of users | Anyone | `dapr`, `docs`, `quickstarts`, `cli`, `components-contrib`, `go-sdk`, `js-sdk`, `java-sdk`, `python-sdk`, `dotnet-sdk` |
| `/ok-to-test` | Pull request | `dapr`: trigger end to end tests
`components-contrib`: trigger conformance and certification tests | Users listed in the [bot](https://github.com/dapr/dapr/blob/master/.github/scripts/dapr_bot.js) | `dapr`, `components-contrib` |
| `/ok-to-perf` | Pull request | Trigger performance tests. | Users listed in the [bot](https://github.com/dapr/dapr/blob/master/.github/scripts/dapr_bot.js) | `dapr` |
| `/make-me-laugh` | Issue or pull request | Posts a random joke | Users listed in the [bot](https://github.com/dapr/dapr/blob/master/.github/scripts/dapr_bot.js) | `dapr`, `components-contrib` |
From feb648081a0dce090ea2378ed5bc90ebe62f111a Mon Sep 17 00:00:00 2001
From: mikeee
Date: Wed, 7 Feb 2024 18:40:24 +0000
Subject: [PATCH 21/38] add init -k --dev docs
Signed-off-by: mikeee
---
.../getting-started/install-dapr-selfhost.md | 2 +
.../hosting/kubernetes/kubernetes-deploy.md | 45 +++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 135c14587..caa7f3894 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -10,6 +10,8 @@ aliases:
Now that you've [installed the Dapr CLI]({{[}}), use the CLI to initialize Dapr on your local machine.
+To initialize dapr in your local (or remote) kubernetes cluster. [How to initialize dapr with redis and zipkin]({{][}})
+
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
- Fetch and install the Dapr sidecar binaries locally.
diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
index d88ec2920..4973bfd72 100644
--- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
+++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
@@ -72,6 +72,51 @@ The `-k` flag initializes Dapr on the Kubernetes cluster in your current context
dapr dashboard -k -n
```
+
+ #### Install Dapr from the offical Dapr Helm chart (with development flag)
+
+Adding the `--dev` flag initializes Dapr on the Kubernetes cluster on your current context with the addition of Redis and Zipkin deployments.
+
+The steps are similar to the above, save for the inclusion of the `--dev` flag being appended to the init command like so:
+
+ ```bash
+ dapr init -k --dev
+ ```
+
+The expected output will be:
+
+```bash
+⌛ Making the jump to hyperspace...
+ℹ️ Note: To install Dapr using Helm, see here: https://docs.dapr.io/getting-started/install-dapr-kubernetes/#install-with-helm-advanced
+
+ℹ️ Container images will be pulled from Docker Hub
+✅ Deploying the Dapr control plane with latest version to your cluster...
+✅ Deploying the Dapr dashboard with latest version to your cluster...
+✅ Deploying the Dapr Redis with latest version to your cluster...
+✅ Deploying the Dapr Zipkin with latest version to your cluster...
+ℹ️ Applying "statestore" component to Kubernetes "default" namespace.
+ℹ️ Applying "pubsub" component to Kubernetes "default" namespace.
+ℹ️ Applying "appconfig" zipkin configuration to Kubernetes "default" namespace.
+✅ Success! Dapr has been installed to namespace dapr-system. To verify, run `dapr status -k' in your terminal. To get started, go here: https://aka.ms/dapr-getting-started
+ ```
+
+After a short period of time (or using the `--wait` flag and specifying an amount of time to wait) you should be able to check that the Redis and Zipkin components have been stood up correctly.
+
+```bash
+kubectl get pods --namespace default
+```
+
+Expected Output:
+
+```bash
+NAME READY STATUS RESTARTS AGE
+dapr-dev-zipkin-bfb4b45bb-sttz7 1/1 Running 0 159m
+dapr-dev-redis-master-0 1/1 Running 0 159m
+dapr-dev-redis-replicas-0 1/1 Running 0 159m
+dapr-dev-redis-replicas-1 1/1 Running 0 159m
+dapr-dev-redis-replicas-2 1/1 Running 0 158m
+ ```
+
#### Install Dapr from a private Dapr Helm chart
Installing Dapr from a private Helm chart can be helpful for when you:
From 470ae2b91b0d5ef36005ca92549c609c95f4755b Mon Sep 17 00:00:00 2001
From: mikeee
Date: Wed, 7 Feb 2024 18:59:44 +0000
Subject: [PATCH 22/38] fix syntax issue
Signed-off-by: mikeee
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index caa7f3894..a14d4ff20 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -10,7 +10,7 @@ aliases:
Now that you've [installed the Dapr CLI]({{][}}), use the CLI to initialize Dapr on your local machine.
-To initialize dapr in your local (or remote) kubernetes cluster. [How to initialize dapr with redis and zipkin]({{][}})
+To initialize dapr in your local (or remote) kubernetes cluster. [How to initialize dapr with redis and zipkin]({{][}})
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
From 1501757ef5a79e8f19dd795416390e953a779bb3 Mon Sep 17 00:00:00 2001
From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Date: Thu, 8 Feb 2024 15:12:23 -0500
Subject: [PATCH 23/38] add video to openai spec (#4026)
Signed-off-by: Hannah Hunter
---
.../components-reference/supported-bindings/openai.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/openai.md b/daprdocs/content/en/reference/components-reference/supported-bindings/openai.md
index 34bbeb151..a58765667 100644
--- a/daprdocs/content/en/reference/components-reference/supported-bindings/openai.md
+++ b/daprdocs/content/en/reference/components-reference/supported-bindings/openai.md
@@ -276,6 +276,11 @@ The response body contains the following JSON:
[0.018574921,-0.00023652936,-0.0057790717,.... (1536 floats total for ada)]
```
+## Learn more about the Azure OpenAI output binding
+
+Watch [the following Community Call presentation](https://youtu.be/rTovKpG0rhY?si=g7hZTQSpSEXz4pV1&t=80) to learn more about the Azure OpenAI output binding.
+
+
## Related links
From fa98d6bbae34b026c3f25bdc6f9a4440547d3561 Mon Sep 17 00:00:00 2001
From: mikeee
Date: Fri, 9 Feb 2024 13:58:58 +0000
Subject: [PATCH 24/38] Apply suggestions from code review
Co-authored-by: Mark Fussell
Signed-off-by: mikeee
---
.../content/en/getting-started/install-dapr-selfhost.md | 2 +-
.../en/operations/hosting/kubernetes/kubernetes-deploy.md | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index 68a120918..cd1a5557f 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -10,7 +10,7 @@ aliases:
Now that you've [installed the Dapr CLI]({{][}}), use the CLI to initialize Dapr on your local machine.
-To initialize dapr in your local (or remote) kubernetes cluster. [How to initialize dapr with redis and zipkin]({{][}})
+To initialize Dapr in your local (or remote) kubernetes cluster for development including the Redis and Zipkin containers listed above see [how to initialize Dapr for development on Kubernetes]({{][}})
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
index bfae8b10b..6c06de4e3 100644
--- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
+++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
@@ -77,13 +77,13 @@ The `-k` flag initializes Dapr on the Kubernetes cluster in your current context
Adding the `--dev` flag initializes Dapr on the Kubernetes cluster on your current context with the addition of Redis and Zipkin deployments.
-The steps are similar to the above, save for the inclusion of the `--dev` flag being appended to the init command like so:
+The steps are similar to the above, save for the inclusion of the `--dev` flag being appended to the init command:
```bash
dapr init -k --dev
```
-The expected output will be:
+Expected output:
```bash
⌛ Making the jump to hyperspace...
@@ -100,13 +100,13 @@ The expected output will be:
✅ Success! Dapr has been installed to namespace dapr-system. To verify, run `dapr status -k' in your terminal. To get started, go here: https://aka.ms/dapr-getting-started
```
-After a short period of time (or using the `--wait` flag and specifying an amount of time to wait) you should be able to check that the Redis and Zipkin components have been stood up correctly.
+After a short period of time (or using the `--wait` flag and specifying an amount of time to wait) you can check that the Redis and Zipkin components have been deployed to the cluster.
```bash
kubectl get pods --namespace default
```
-Expected Output:
+Expected output:
```bash
NAME READY STATUS RESTARTS AGE
From 443bc6bb0e3e5941ffbb98e7434c055af3f8e279 Mon Sep 17 00:00:00 2001
From: mikeee
Date: Fri, 9 Feb 2024 14:19:05 +0000
Subject: [PATCH 25/38] add --dev example to cli init docs
Signed-off-by: mikeee
---
daprdocs/content/en/reference/cli/dapr-init.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/daprdocs/content/en/reference/cli/dapr-init.md b/daprdocs/content/en/reference/cli/dapr-init.md
index 7cc2d86ad..eeafded3b 100644
--- a/daprdocs/content/en/reference/cli/dapr-init.md
+++ b/daprdocs/content/en/reference/cli/dapr-init.md
@@ -162,6 +162,12 @@ dapr uninstall --all --network mynet
dapr init -k
```
+Using the `--dev` flag will initialize dapr in dev mode which includes Zipkin and Redis.
+```bash
+dapr init -k --dev
+```
+
+
You can wait for the installation to complete its deployment with the `--wait` flag.
The default timeout is 300s (5 min), but can be customized with the `--timeout` flag.
From 785aaf5615ec4d9f9cb9195c9324eabec3f6e426 Mon Sep 17 00:00:00 2001
From: mikeee
Date: Fri, 9 Feb 2024 14:23:55 +0000
Subject: [PATCH 26/38] wrap the kubernetes development environment hint with
an alert
Signed-off-by: mikeee
---
daprdocs/content/en/getting-started/install-dapr-selfhost.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index cd1a5557f..fe413e35f 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -10,7 +10,9 @@ aliases:
Now that you've [installed the Dapr CLI]({{][}}), use the CLI to initialize Dapr on your local machine.
+{{% alert title="Kubernetes Development Environment" color="primary" %}}
To initialize Dapr in your local (or remote) kubernetes cluster for development including the Redis and Zipkin containers listed above see [how to initialize Dapr for development on Kubernetes]({{][}})
+{{% /alert %}}
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
From 90af1972f72428e2481f3494329c20224b490c5e Mon Sep 17 00:00:00 2001
From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Date: Fri, 9 Feb 2024 11:10:15 -0500
Subject: [PATCH 27/38] Update
daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
Co-authored-by: Chris Gillum
Signed-off-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
---
.../building-blocks/workflow/workflow-architecture.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
index 8d9494cd3..dffea560d 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-architecture.md
@@ -145,7 +145,7 @@ Different state store implementations may implicitly put restrictions on the typ
Similarly, if a state store imposes restrictions on the size of a batch transaction, that may limit the number of parallel actions that can be scheduled by a workflow.
-Workflow state can be purged from a state store, purging all its history. Purging removes all metadata related to a specific workflow instance.
+Workflow state can be purged from a state store, including all its history. Each Dapr SDK exposes APIs for purging all metadata related to specific workflow instances.
## Workflow scalability
From b6fcabeb0704811426a49d78b7e7c067e3b40a65 Mon Sep 17 00:00:00 2001
From: Hannah Hunter
Date: Fri, 9 Feb 2024 11:23:43 -0500
Subject: [PATCH 28/38] edits per Chris and Mark review
Signed-off-by: Hannah Hunter
---
.../workflow/workflow-features-concepts.md | 17 ++++++++---------
.../content/en/reference/api/workflow_api.md | 4 ++++
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
index fe35284a9..71d146caf 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
@@ -63,6 +63,8 @@ You can use the following two techniques to write workflows that may need to sch
1. **Use the _continue-as-new_ API**:
Each workflow SDK exposes a _continue-as-new_ API that workflows can invoke to restart themselves with a new input and history. The _continue-as-new_ API is especially ideal for implementing "eternal workflows", like monitoring agents, which would otherwise be implemented using a `while (true)`-like construct. Using _continue-as-new_ is a great way to keep the workflow history size small.
+
+ > The _continue-as-new_ API truncates the existing history, replacing it with a new history.
1. **Use child workflows**:
Each workflow SDK exposes an API for creating child workflows. A child workflow behaves like any other workflow, except that it's scheduled by a parent workflow. Child workflows have:
@@ -149,17 +151,14 @@ Workflows can also wait for multiple external event signals of the same name, in
Learn more about [external system interaction.]({{< ref "workflow-patterns.md#external-system-interaction" >}})
+## Purging
+
+Workflow state can be purged from a state store, purging all its history and removing all metadata related to a specific workflow instance. The purge capability is typically used for workflows that have run to a `COMPLETED`, `FAILED`, or `TERMINATED` state.
+
+Learn more in [the workflow API reference guide]({{< ref workflow_api.md >}}).
+
## Limitations
-### Purging
-
-Workflow state can be purged from a state store, purging all its history and removing all metadata related to a specific workflow instance. The purge capability is typically used for workflows that have run to a `COMPLETED` or `TERMINATED` state.
-
-There are other times you may choose to purge a workflow history and reuse a workflow instance with new inputs, like:
-
-- `CONTINUED_AS_NEW` state
-- A `FAILED` workflow instance
-
### Workflow determinism and code restraints
To take advantage of the workflow replay technique, your workflow code needs to be deterministic. For your workflow code to be deterministic, you may need to work around some limitations.
diff --git a/daprdocs/content/en/reference/api/workflow_api.md b/daprdocs/content/en/reference/api/workflow_api.md
index ca272d0fa..aea4234a1 100644
--- a/daprdocs/content/en/reference/api/workflow_api.md
+++ b/daprdocs/content/en/reference/api/workflow_api.md
@@ -174,6 +174,10 @@ Purge the workflow state from your state store with the workflow's instance ID.
POST http://localhost:3500/v1.0-beta1/workflows///purge
```
+{{% alert title="Note" color="primary" %}}
+Only `COMPLETED`, `FAILED`, or `TERMINATED` workflows can be purged.
+{{% /alert %}}
+
### URL parameters
Parameter | Description
From 912e3ace5ac259c4527b85f02baefcd8320dd743 Mon Sep 17 00:00:00 2001
From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Date: Fri, 9 Feb 2024 11:51:40 -0500
Subject: [PATCH 29/38] Update
daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
Co-authored-by: Mark Fussell
Signed-off-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
---
.../building-blocks/workflow/workflow-features-concepts.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
index 71d146caf..fdd06701e 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-features-concepts.md
@@ -153,7 +153,7 @@ Learn more about [external system interaction.]({{< ref "workflow-patterns.md#ex
## Purging
-Workflow state can be purged from a state store, purging all its history and removing all metadata related to a specific workflow instance. The purge capability is typically used for workflows that have run to a `COMPLETED`, `FAILED`, or `TERMINATED` state.
+Workflow state can be purged from a state store, purging all its history and removing all metadata related to a specific workflow instance. The purge capability is used for workflows that have run to a `COMPLETED`, `FAILED`, or `TERMINATED` state.
Learn more in [the workflow API reference guide]({{< ref workflow_api.md >}}).
From 5b8b307be4684003066c920bbe928897ddd449ef Mon Sep 17 00:00:00 2001
From: mikeee
Date: Fri, 9 Feb 2024 18:00:03 +0000
Subject: [PATCH 30/38] Apply suggestions from code review
Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
Signed-off-by: mikeee
---
.../content/en/getting-started/install-dapr-selfhost.md | 2 +-
.../en/operations/hosting/kubernetes/kubernetes-deploy.md | 6 +++---
daprdocs/content/en/reference/cli/dapr-init.md | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index fe413e35f..fcaa49282 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -11,7 +11,7 @@ aliases:
Now that you've [installed the Dapr CLI]({{][}}), use the CLI to initialize Dapr on your local machine.
{{% alert title="Kubernetes Development Environment" color="primary" %}}
-To initialize Dapr in your local (or remote) kubernetes cluster for development including the Redis and Zipkin containers listed above see [how to initialize Dapr for development on Kubernetes]({{][}})
+To initialize Dapr in your local or remote Kubernetes cluster for development (including the Redis and Zipkin containers listed above), see [how to initialize Dapr for development on Kubernetes]({{][}})
{{% /alert %}}
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
index 6c06de4e3..8cde9af5a 100644
--- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
+++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md
@@ -75,9 +75,9 @@ The `-k` flag initializes Dapr on the Kubernetes cluster in your current context
#### Install Dapr from the offical Dapr Helm chart (with development flag)
-Adding the `--dev` flag initializes Dapr on the Kubernetes cluster on your current context with the addition of Redis and Zipkin deployments.
+Adding the `--dev` flag initializes Dapr on the Kubernetes cluster on your current context, with the addition of Redis and Zipkin deployments.
-The steps are similar to the above, save for the inclusion of the `--dev` flag being appended to the init command:
+The steps are similar to [installing from the Dapr Helm chart](#install-dapr-from-an-official-dapr-helm-chart), except for appending the `--dev` flag to the `init` command:
```bash
dapr init -k --dev
@@ -100,7 +100,7 @@ Expected output:
✅ Success! Dapr has been installed to namespace dapr-system. To verify, run `dapr status -k' in your terminal. To get started, go here: https://aka.ms/dapr-getting-started
```
-After a short period of time (or using the `--wait` flag and specifying an amount of time to wait) you can check that the Redis and Zipkin components have been deployed to the cluster.
+After a short period of time (or using the `--wait` flag and specifying an amount of time to wait), you can check that the Redis and Zipkin components have been deployed to the cluster.
```bash
kubectl get pods --namespace default
diff --git a/daprdocs/content/en/reference/cli/dapr-init.md b/daprdocs/content/en/reference/cli/dapr-init.md
index eeafded3b..b40af6701 100644
--- a/daprdocs/content/en/reference/cli/dapr-init.md
+++ b/daprdocs/content/en/reference/cli/dapr-init.md
@@ -162,7 +162,7 @@ dapr uninstall --all --network mynet
dapr init -k
```
-Using the `--dev` flag will initialize dapr in dev mode which includes Zipkin and Redis.
+Using the `--dev` flag initializes Dapr in dev mode, which includes Zipkin and Redis.
```bash
dapr init -k --dev
```
From ea9233c5dc6a97ee9d19e83112ff7f4aab5f5fa0 Mon Sep 17 00:00:00 2001
From: Mark Fussell
Date: Tue, 13 Feb 2024 17:19:24 -0800
Subject: [PATCH 31/38] Update install-dapr-selfhost.md
Moved the paragraph down
Signed-off-by: Mark Fussell
---
.../content/en/getting-started/install-dapr-selfhost.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
index fcaa49282..7ffa33f2c 100644
--- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md
+++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md
@@ -10,10 +10,6 @@ aliases:
Now that you've [installed the Dapr CLI]({{][}}), use the CLI to initialize Dapr on your local machine.
-{{% alert title="Kubernetes Development Environment" color="primary" %}}
-To initialize Dapr in your local or remote Kubernetes cluster for development (including the Redis and Zipkin containers listed above), see [how to initialize Dapr for development on Kubernetes]({{][}})
-{{% /alert %}}
-
Dapr runs as a sidecar alongside your application. In self-hosted mode, this means it is a process on your local machine. By initializing Dapr, you:
- Fetch and install the Dapr sidecar binaries locally.
@@ -26,6 +22,10 @@ Dapr initialization includes:
1. Creating a **default components folder** with component definitions for the above.
1. Running a **Dapr placement service container instance** for local actor support.
+{{% alert title="Kubernetes Development Environment" color="primary" %}}
+To initialize Dapr in your local or remote **Kubernetes** cluster for development (including the Redis and Zipkin containers listed above), see [how to initialize Dapr for development on Kubernetes]({{][}})
+{{% /alert %}}
+
{{% alert title="Docker" color="primary" %}}
The recommended development environment requires [Docker](https://docs.docker.com/install/). While you can [initialize Dapr without a dependency on Docker]({{< ref self-hosted-no-docker.md >}})), the next steps in this guide assume the recommended Docker development environment.
From 40f90691026d000db89db5c7b960c522f14d9568 Mon Sep 17 00:00:00 2001
From: Whit Waldo
Date: Wed, 14 Feb 2024 17:32:25 -0500
Subject: [PATCH 32/38] Added .NET examples for string encryption and
decryption to Cryptography how-to. (#3947)
Signed-off-by: Whit Waldo
Co-authored-by: Mark Fussell
Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com>
---
.../cryptography/howto-cryptography.md | 51 +++++++++++++++++--
1 file changed, 47 insertions(+), 4 deletions(-)
diff --git a/daprdocs/content/en/developing-applications/building-blocks/cryptography/howto-cryptography.md b/daprdocs/content/en/developing-applications/building-blocks/cryptography/howto-cryptography.md
index 92f3a6710..ca9d02796 100644
--- a/daprdocs/content/en/developing-applications/building-blocks/cryptography/howto-cryptography.md
+++ b/daprdocs/content/en/developing-applications/building-blocks/cryptography/howto-cryptography.md
@@ -6,16 +6,16 @@ weight: 2000
description: "Learn how to encrypt and decrypt files"
---
-Now that you've read about [Cryptography as a Dapr building block]({{< ref cryptography-overview.md >}}), let's walk through using the cryptography APIs with the SDKs.
+Now that you've read about [Cryptography as a Dapr building block]({{< ref cryptography-overview.md >}}), let's walk through using the cryptography APIs with the SDKs.
{{% alert title="Note" color="primary" %}}
- Dapr cryptography is currently in alpha.
+Dapr cryptography is currently in alpha.
{{% /alert %}}
## Encrypt
-{{< tabs "JavaScript" "Go" >}}
+{{< tabs "JavaScript" "Go" ".NET" >}}
{{% codetab %}}
@@ -136,12 +136,32 @@ if err != nil {
{{% /codetab %}}
+{{% codetab %}}
+
+
+Using the Dapr SDK in your project, with the gRPC APIs, you can encrypt data in a string or a byte array:
+
+```csharp
+using var client = new DaprClientBuilder().Build();
+
+const string componentName = "azurekeyvault"; //Change this to match your cryptography component
+const string keyName = "myKey"; //Change this to match the name of the key in your cryptographic store
+
+const string plainText = "This is the value we're going to encrypt today";
+
+//Encode the string to a UTF-8 byte array and encrypt it
+var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
+var encryptedBytesResult = await client.EncryptAsync(componentName, plaintextBytes, keyName, new EncryptionOptions(KeyWrapAlgorithm.Rsa));
+```
+
+{{% /codetab %}}
+
{{< /tabs >}}
## Decrypt
-{{< tabs "JavaScript" "Go" >}}
+{{< tabs "JavaScript" "Go" ".NET" >}}
{{% codetab %}}
@@ -186,6 +206,29 @@ out, err := sdkClient.Decrypt(context.Background(), rf, dapr.EncryptOptions{
{{% /codetab %}}
+{{% codetab %}}
+
+
+To decrypt a string, use the 'DecryptAsync' gRPC API in your project.
+
+In the following example, we'll take a byte array (such as from the example above) and decrypt it to a UTF-8 encoded string.
+
+```csharp
+public async Task DecryptBytesAsync(byte[] encryptedBytes)
+{
+ using var client = new DaprClientBuilder().Build();
+
+ const string componentName = "azurekeyvault"; //Change this to match your cryptography component
+ const string keyName = "myKey"; //Change this to match the name of the key in your cryptographic store
+
+ var decryptedBytes = await client.DecryptAsync(componentName, encryptedBytes, keyName);
+ var decryptedString = Encoding.UTF8.GetString(decryptedBytes.ToArray());
+ return decryptedString;
+}
+```
+
+{{% /codetab %}}
+
{{< /tabs >}}
## Next steps
From 11f7a796789d76cdb30b34ea37803a988702150f Mon Sep 17 00:00:00 2001
From: Marc Duiker
Date: Fri, 16 Feb 2024 22:26:35 +0000
Subject: [PATCH 33/38] Add new Dapr slide deck
Signed-off-by: Marc Duiker
---
.../presentations/dapr-slidedeck.pptx.zip | Bin 7588378 -> 8479823 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/daprdocs/static/presentations/dapr-slidedeck.pptx.zip b/daprdocs/static/presentations/dapr-slidedeck.pptx.zip
index 6ef5a3b872089f07b4525efbd9b7f25f68315e24..27df424b293bbf14bcd2fc61786b285c8c8d2997 100644
GIT binary patch
literal 8479823
zcmV(rK<>X#O9KQH000080MfZoSiP(3+Q(yo0NnGF022TJ0AyisaxHUgX=G(&Wn*hD
zaBy^Z?0N%tWL>vzY$qMtNyqNkwr!(htK&}6v2EM7ZB}gCym|Y(XWVnfc>lpYYs|6N
ze5UrS+Pn68R#nMMfr6m{K>$Gk0Ra&KG2y@-B0vBE`4s{Ip#njHXbIW=bTawrq^Im|
zXX2]oJ}_;jk)>7WAmZddY8*22ui!VmQhX{;V+}R~qa7
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