diff --git a/daprdocs/content/en/concepts/overview.md b/daprdocs/content/en/concepts/overview.md index 7613042ff..fb1e31502 100644 --- a/daprdocs/content/en/concepts/overview.md +++ b/daprdocs/content/en/concepts/overview.md @@ -76,7 +76,7 @@ Dapr exposes its HTTP and gRPC APIs as a sidecar architecture, either as a conta ## Hosting environments Dapr can be hosted in multiple environments, including: -- Self-hosted on a Windows/Linux/macOS machine for local development +- Self-hosted on a Windows/Linux/macOS machine for local development and in production - On Kubernetes or clusters of physical or virtual machines in production ### Self-hosted local development diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md index 4ee8f2205..38b2ab5ef 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md @@ -20,7 +20,103 @@ When you [run `dapr init` in either self-hosted mode or on Kubernetes]({{< ref i In your code, set up and schedule jobs within your application. -{{< tabs "Go" >}} +{{< tabs ".NET" "Go" >}} + +{{% codetab %}} + + + +The following .NET SDK code sample schedules the job named `prod-db-backup`. The job data contains information +about the database that you'll be seeking to backup regularly. Over the course of this example, you'll: +- Define types used in the rest of the example +- Register an endpoint during application startup that handles all job trigger invocations on the service +- Register the job with Dapr + +In the following example, you'll create records that you'll serialize and register alongside the job so the information +is available when the job is triggered in the future: +- The name of the backup task (`db-backup`) +- The backup task's `Metadata`, including: + - The database name (`DBName`) + - The database location (`BackupLocation`) + +Create an ASP.NET Core project and add the latest version of `Dapr.Jobs` from NuGet. + +> **Note:** While it's not strictly necessary +for your project to use the `Microsoft.NET.Sdk.Web` SDK to create jobs, as of the time this documentation is authored, +only the service that schedules a job receives trigger invocations for it. As those invocations expect an endpoint +that can handle the job trigger and requires the `Microsoft.NET.Sdk.Web` SDK, it's recommended that you +use an ASP.NET Core project for this purpose. + +Start by defining types to persist our backup job data and apply our own JSON property name attributes to the properties +so they're consistent with other language examples. + +```cs +//Define the types that we'll represent the job data with +internal sealed record BackupJobData([property: JsonPropertyName("task")] string Task, [property: JsonPropertyName("metadata")] BackupMetadata Metadata); +internal sealed record BackupMetadata([property: JsonPropertyName("DBName")]string DatabaseName, [property: JsonPropertyName("BackupLocation")] string BackupLocation); +``` + +Next, set up a handler as part of your application setup that will be called anytime a job is triggered on your +application. It's the responsibility of this handler to identify how jobs should be processed based on the job name provided. + +This works by registering a handler with ASP.NET Core at `/job/`, where `` is parameterized and +passed into this handler delegate, meeting Dapr's expectation that an endpoint is available to handle triggered named jobs. + +Populate your `Program.cs` file with the following: + +```cs +using System.Text; +using System.Text.Json; +using Dapr.Jobs; +using Dapr.Jobs.Extensions; +using Dapr.Jobs.Models; +using Dapr.Jobs.Models.Responses; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddDaprJobsClient(); +var app = builder.Build(); + +//Registers an endpoint to receive and process triggered jobs +var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5)); +app.MapDaprScheduledJobHandler((string jobName, DaprJobDetails jobDetails, ILogger logger, CancellationToken cancellationToken) => { + logger?.LogInformation("Received trigger invocation for job '{jobName}'", jobName); + switch (jobName) + { + case "prod-db-backup": + // Deserialize the job payload metadata + var jobData = JsonSerializer.Deserialize(jobDetails.Payload); + + // Process the backup operation - we assume this is implemented elsewhere in your code + await BackupDatabaseAsync(jobData, cancellationToken); + break; + } +}, cancellationTokenSource.Token); + +await app.RunAsync(); +``` + +Finally, the job itself needs to be registered with Dapr so it can be triggered at a later point in time. You can do this +by injecting a `DaprJobsClient` into a class and executing as part of an inbound operation to your application, but for +this example's purposes, it'll go at the bottom of the `Program.cs` file you started above. Because you'll be using the +`DaprJobsClient` you registered with dependency injection, start by creating a scope so you can access it. + +```cs +//Create a scope so we can access the registered DaprJobsClient +await using scope = app.Services.CreateAsyncScope(); +var daprJobsClient = scope.ServiceProvider.GetRequiredService(); + +//Create the payload we wish to present alongside our future job triggers +var jobData = new BackupJobData("db-backup", new BackupMetadata("my-prod-db", "/backup-dir")); + +//Serialize our payload to UTF-8 bytes +var serializedJobData = JsonSerializer.SerializeToUtf8Bytes(jobData); + +//Schedule our backup job to run every minute, but only repeat 10 times +await daprJobsClient.ScheduleJobAsync("prod-db-backup", DaprJobSchedule.FromDuration(TimeSpan.FromMinutes(1)), + serializedJobData, repeats: 10); +``` + +{{% /codetab %}} {{% codetab %}} diff --git a/daprdocs/content/en/developing-applications/error-codes/error-codes-reference.md b/daprdocs/content/en/developing-applications/error-codes/error-codes-reference.md index 314bf67c4..494a123ef 100644 --- a/daprdocs/content/en/developing-applications/error-codes/error-codes-reference.md +++ b/daprdocs/content/en/developing-applications/error-codes/error-codes-reference.md @@ -6,145 +6,199 @@ description: "List of gRPC and HTTP error codes in Dapr and their descriptions" weight: 20 --- -The following tables list the error codes returned by Dapr runtime: +The following tables list the error codes returned by Dapr runtime. +The error codes are returned in the response body of an HTTP request or in the `ErrorInfo` section of a gRPC status response, if one is present. +An effort is underway to enrich all gRPC error responses according to the [Richer Error Model]({{< ref "grpc-error-codes.md#richer-grpc-error-model" >}}). Error codes without a corresponding gRPC code indicate those errors have not yet been updated to this model. ### Actors API -| Error Code | Description | -| -------------------------------- | ------------------------------------------ | -| ERR_ACTOR_INSTANCE_MISSING | Error when an actor instance is missing. | -| ERR_ACTOR_RUNTIME_NOT_FOUND | Error the actor instance. | -| ERR_ACTOR_REMINDER_CREATE | Error creating a reminder for an actor. | -| ERR_ACTOR_REMINDER_DELETE | Error deleting a reminder for an actor. | -| ERR_ACTOR_TIMER_CREATE | Error creating a timer for an actor. | -| ERR_ACTOR_TIMER_DELETE | Error deleting a timer for an actor. | -| ERR_ACTOR_REMINDER_GET | Error getting a reminder for an actor. | -| ERR_ACTOR_INVOKE_METHOD | Error invoking a method on an actor. | -| ERR_ACTOR_STATE_DELETE | Error deleting the state for an actor. | -| ERR_ACTOR_STATE_GET | Error getting the state for an actor. | -| ERR_ACTOR_STATE_TRANSACTION_SAVE | Error storing actor state transactionally. | -| ERR_ACTOR_REMINDER_NON_HOSTED | Error setting reminder for an actor. | +| HTTP Code | gRPC Code | Description | +| ---------------------------------- | --------- | ----------------------------------------------------------------------- | +| `ERR_ACTOR_INSTANCE_MISSING` | | Missing actor instance | +| `ERR_ACTOR_INVOKE_METHOD` | | Error invoking actor method | +| `ERR_ACTOR_RUNTIME_NOT_FOUND` | | Actor runtime not found | +| `ERR_ACTOR_STATE_GET` | | Error getting actor state | +| `ERR_ACTOR_STATE_TRANSACTION_SAVE` | | Error saving actor transaction | +| `ERR_ACTOR_REMINDER_CREATE` | | Error creating actor reminder | +| `ERR_ACTOR_REMINDER_DELETE` | | Error deleting actor reminder | +| `ERR_ACTOR_REMINDER_GET` | | Error getting actor reminder | +| `ERR_ACTOR_REMINDER_NON_HOSTED` | | Reminder operation on non-hosted actor type | +| `ERR_ACTOR_TIMER_CREATE` | | Error creating actor timer | +| `ERR_ACTOR_NO_APP_CHANNEL` | | App channel not initialized | +| `ERR_ACTOR_STACK_DEPTH` | | Maximum actor call stack depth exceeded | +| `ERR_ACTOR_NO_PLACEMENT` | | Placement service not configured | +| `ERR_ACTOR_RUNTIME_CLOSED` | | Actor runtime is closed | +| `ERR_ACTOR_NAMESPACE_REQUIRED` | | Actors must have a namespace configured when running in Kubernetes mode | +| `ERR_ACTOR_NO_ADDRESS` | | No address found for actor | + ### Workflows API -| Error Code | Description | -| -------------------------------- | ----------------------------------------------------------- | -| ERR_GET_WORKFLOW | Error getting workflow. | -| ERR_START_WORKFLOW | Error starting the workflow. | -| ERR_PAUSE_WORKFLOW | Error pausing the workflow. | -| ERR_RESUME_WORKFLOW | Error resuming the workflow. | -| ERR_TERMINATE_WORKFLOW | Error terminating the workflow. | -| ERR_PURGE_WORKFLOW | Error purging workflow. | -| ERR_RAISE_EVENT_WORKFLOW | Error raising an event within the workflow. | -| ERR_WORKFLOW_COMPONENT_MISSING | Error when a workflow component is missing a configuration. | -| ERR_WORKFLOW_COMPONENT_NOT_FOUND | Error when a workflow component is not found. | -| ERR_WORKFLOW_EVENT_NAME_MISSING | Error when the event name for a workflow is missing. | -| ERR_WORKFLOW_NAME_MISSING | Error when the workflow name is missing. | -| ERR_INSTANCE_ID_INVALID | Error invalid workflow instance ID provided. | -| ERR_INSTANCE_ID_NOT_FOUND | Error workflow instance ID not found. | -| ERR_INSTANCE_ID_PROVIDED_MISSING | Error workflow instance ID was provided but missing. | -| ERR_INSTANCE_ID_TOO_LONG | Error workflow instance ID exceeds allowable length. | +| HTTP Code | gRPC Code | Description | +| ---------------------------------- | --------- | --------------------------------------------------------------------------------------- | +| `ERR_GET_WORKFLOW` | | Error getting workflow | +| `ERR_START_WORKFLOW` | | Error starting workflow | +| `ERR_PAUSE_WORKFLOW` | | Error pausing workflow | +| `ERR_RESUME_WORKFLOW` | | Error resuming workflow | +| `ERR_TERMINATE_WORKFLOW` | | Error terminating workflow | +| `ERR_PURGE_WORKFLOW` | | Error purging workflow | +| `ERR_RAISE_EVENT_WORKFLOW` | | Error raising event in workflow | +| `ERR_WORKFLOW_COMPONENT_MISSING` | | Missing workflow component | +| `ERR_WORKFLOW_COMPONENT_NOT_FOUND` | | Workflow component not found | +| `ERR_WORKFLOW_EVENT_NAME_MISSING` | | Missing workflow event name | +| `ERR_WORKFLOW_NAME_MISSING` | | Workflow name not configured | +| `ERR_INSTANCE_ID_INVALID` | | Invalid workflow instance ID. (Only alphanumeric and underscore characters are allowed) | +| `ERR_INSTANCE_ID_NOT_FOUND` | | Workflow instance ID not found | +| `ERR_INSTANCE_ID_PROVIDED_MISSING` | | Missing workflow instance ID | +| `ERR_INSTANCE_ID_TOO_LONG` | | Workflow instance ID too long | -### State Management API -| Error Code | Description | -| ------------------------------------- | ------------------------------------------------------------------------- | -| ERR_STATE_STORE_NOT_FOUND | Error referencing a state store not found. | -| ERR_STATE_STORES_NOT_CONFIGURED | Error no state stores configured. | -| ERR_NOT_SUPPORTED_STATE_OPERATION | Error transaction requested on a state store with no transaction support. | -| ERR_STATE_GET | Error getting a state for state store. | -| ERR_STATE_DELETE | Error deleting a state from state store. | -| ERR_STATE_SAVE | Error saving a state in state store. | -| ERR_STATE_TRANSACTION | Error encountered during state transaction. | -| ERR_STATE_BULK_GET | Error performing bulk retrieval of state entries. | -| ERR_STATE_QUERY | Error querying the state store. | -| ERR_STATE_STORE_NOT_CONFIGURED | Error state store is not configured. | -| ERR_STATE_STORE_NOT_SUPPORTED | Error state store is not supported. | -| ERR_STATE_STORE_TOO_MANY_TRANSACTIONS | Error exceeded maximum allowable transactions. | +### State management API + +| HTTP Code | gRPC Code | Description | +| --------------------------------------- | --------------------------------------- | ----------------------------------------- | +| `ERR_STATE_TRANSACTION` | | Error in state transaction | +| `ERR_STATE_SAVE` | | Error saving state | +| `ERR_STATE_GET` | | Error getting state | +| `ERR_STATE_DELETE` | | Error deleting state | +| `ERR_STATE_BULK_DELETE` | | Error deleting state in bulk | +| `ERR_STATE_BULK_GET` | | Error getting state in bulk | +| `ERR_NOT_SUPPORTED_STATE_OPERATION` | | Operation not supported in transaction | +| `ERR_STATE_QUERY` | `DAPR_STATE_QUERY_FAILED` | Error querying state | +| `ERR_STATE_STORE_NOT_FOUND` | `DAPR_STATE_NOT_FOUND` | State store not found | +| `ERR_STATE_STORE_NOT_CONFIGURED` | `DAPR_STATE_NOT_CONFIGURED` | State store not configured | +| `ERR_STATE_STORE_NOT_SUPPORTED` | `DAPR_STATE_TRANSACTIONS_NOT_SUPPORTED` | State store does not support transactions | +| `ERR_STATE_STORE_NOT_SUPPORTED` | `DAPR_STATE_QUERYING_NOT_SUPPORTED` | State store does not support querying | +| `ERR_STATE_STORE_TOO_MANY_TRANSACTIONS` | `DAPR_STATE_TOO_MANY_TRANSACTIONS` | Too many operations per transaction | +| `ERR_MALFORMED_REQUEST` | `DAPR_STATE_ILLEGAL_KEY` | Invalid key | + ### Configuration API -| Error Code | Description | -| -------------------------------------- | -------------------------------------------- | -| ERR_CONFIGURATION_GET | Error retrieving configuration. | -| ERR_CONFIGURATION_STORE_NOT_CONFIGURED | Error configuration store is not configured. | -| ERR_CONFIGURATION_STORE_NOT_FOUND | Error configuration store not found. | -| ERR_CONFIGURATION_SUBSCRIBE | Error subscribing to a configuration. | -| ERR_CONFIGURATION_UNSUBSCRIBE | Error unsubscribing from a configuration. | +| HTTP Code | gRPC Code | Description | +| ---------------------------------------- | --------- | -------------------------------------- | +| `ERR_CONFIGURATION_GET` | | Error getting configuration | +| `ERR_CONFIGURATION_STORE_NOT_CONFIGURED` | | Configuration store not configured | +| `ERR_CONFIGURATION_STORE_NOT_FOUND` | | Configuration store not found | +| `ERR_CONFIGURATION_SUBSCRIBE` | | Error subscribing to configuration | +| `ERR_CONFIGURATION_UNSUBSCRIBE` | | Error unsubscribing from configuration | + ### Crypto API -| Error Code | Description | -| ----------------------------------- | ------------------------------------------ | -| ERR_CRYPTO | General crypto building block error. | -| ERR_CRYPTO_KEY | Error related to a crypto key. | -| ERR_CRYPTO_PROVIDER_NOT_FOUND | Error specified crypto provider not found. | -| ERR_CRYPTO_PROVIDERS_NOT_CONFIGURED | Error no crypto providers configured. | +| HTTP Code | gRPC Code | Description | +| ------------------------------------- | --------- | ------------------------------- | +| `ERR_CRYPTO` | | Error in crypto operation | +| `ERR_CRYPTO_KEY` | | Error retrieving crypto key | +| `ERR_CRYPTO_PROVIDER_NOT_FOUND` | | Crypto provider not found | +| `ERR_CRYPTO_PROVIDERS_NOT_CONFIGURED` | | Crypto providers not configured | + ### Secrets API -| Error Code | Description | -| -------------------------------- | ---------------------------------------------------- | -| ERR_SECRET_STORES_NOT_CONFIGURED | Error that no secret store is configured. | -| ERR_SECRET_STORE_NOT_FOUND | Error that specified secret store is not found. | -| ERR_SECRET_GET | Error retrieving the specified secret. | -| ERR_PERMISSION_DENIED | Error access denied due to insufficient permissions. | +| HTTP Code | gRPC Code | Description | +| ---------------------------------- | --------- | --------------------------- | +| `ERR_SECRET_GET` | | Error getting secret | +| `ERR_SECRET_STORE_NOT_FOUND` | | Secret store not found | +| `ERR_SECRET_STORES_NOT_CONFIGURED` | | Secret store not configured | +| `ERR_PERMISSION_DENIED` | | Permission denied by policy | -### Pub/Sub API -| Error Code | Description | -| --------------------------- | -------------------------------------------------------- | -| ERR_PUBSUB_NOT_FOUND | Error referencing the Pub/Sub component in Dapr runtime. | -| ERR_PUBSUB_PUBLISH_MESSAGE | Error publishing a message. | -| ERR_PUBSUB_FORBIDDEN | Error message forbidden by access controls. | -| ERR_PUBSUB_CLOUD_EVENTS_SER | Error serializing Pub/Sub event envelope. | -| ERR_PUBSUB_EMPTY | Error empty Pub/Sub. | -| ERR_PUBSUB_NOT_CONFIGURED | Error Pub/Sub component is not configured. | -| ERR_PUBSUB_REQUEST_METADATA | Error with metadata in Pub/Sub request. | -| ERR_PUBSUB_EVENTS_SER | Error serializing Pub/Sub events. | -| ERR_PUBLISH_OUTBOX | Error publishing message to the outbox. | -| ERR_TOPIC_NAME_EMPTY | Error topic name for Pub/Sub message is empty. | +### Pub/Sub and messaging errors + +| HTTP Code | gRPC Code | Description | +| ----------------------------- | -------------------------------------- | -------------------------------------- | +| `ERR_PUBSUB_EMPTY` | `DAPR_PUBSUB_NAME_EMPTY` | Pubsub name is empty | +| `ERR_PUBSUB_NOT_FOUND` | `DAPR_PUBSUB_NOT_FOUND` | Pubsub not found | +| `ERR_PUBSUB_NOT_FOUND` | `DAPR_PUBSUB_TEST_NOT_FOUND` | Pubsub not found | +| `ERR_PUBSUB_NOT_CONFIGURED` | `DAPR_PUBSUB_NOT_CONFIGURED` | Pubsub not configured | +| `ERR_TOPIC_NAME_EMPTY` | `DAPR_PUBSUB_TOPIC_NAME_EMPTY` | Topic name is empty | +| `ERR_PUBSUB_FORBIDDEN` | `DAPR_PUBSUB_FORBIDDEN` | Access to topic forbidden for APP ID | +| `ERR_PUBSUB_PUBLISH_MESSAGE` | `DAPR_PUBSUB_PUBLISH_MESSAGE` | Error publishing message | +| `ERR_PUBSUB_REQUEST_METADATA` | `DAPR_PUBSUB_METADATA_DESERIALIZATION` | Error deserializing metadata | +| `ERR_PUBSUB_CLOUD_EVENTS_SER` | `DAPR_PUBSUB_CLOUD_EVENT_CREATION` | Error creating CloudEvent | +| `ERR_PUBSUB_EVENTS_SER` | `DAPR_PUBSUB_MARSHAL_ENVELOPE` | Error marshalling Cloud Event envelope | +| `ERR_PUBSUB_EVENTS_SER` | `DAPR_PUBSUB_MARSHAL_EVENTS` | Error marshalling events to bytes | +| `ERR_PUBSUB_EVENTS_SER` | `DAPR_PUBSUB_UNMARSHAL_EVENTS` | Error unmarshalling events | +| `ERR_PUBLISH_OUTBOX` | | Error publishing message to outbox | + ### Conversation API -| Error Code | Description | -| ------------------------------- | ----------------------------------------------- | -| ERR_INVOKE_OUTPUT_BINDING | Error invoking an output binding. | -| ERR_DIRECT_INVOKE | Error in direct invocation. | -| ERR_CONVERSATION_INVALID_PARMS | Error invalid parameters for conversation. | -| ERR_CONVERSATION_INVOKE | Error invoking the conversation. | -| ERR_CONVERSATION_MISSING_INPUTS | Error missing required inputs for conversation. | -| ERR_CONVERSATION_NOT_FOUND | Error conversation not found. | +| HTTP Code | gRPC Code | Description | +| --------------------------------- | --------- | --------------------------------------------- | +| `ERR_CONVERSATION_INVALID_PARMS` | | Invalid parameters for conversation component | +| `ERR_CONVERSATION_INVOKE` | | Error invoking conversation | +| `ERR_CONVERSATION_MISSING_INPUTS` | | Missing inputs for conversation | +| `ERR_CONVERSATION_NOT_FOUND` | | Conversation not found | + + +### Service Invocation / Direct Messaging API + +| HTTP Code | gRPC Code | Description | +| ------------------- | --------- | ---------------------- | +| `ERR_DIRECT_INVOKE` | | Error invoking service | + + +### Bindings API + +| HTTP Code | gRPC Code | Description | +| --------------------------- | --------- | ----------------------------- | +| `ERR_INVOKE_OUTPUT_BINDING` | | Error invoking output binding | + ### Distributed Lock API -| Error Code | Description | -| ----------------------------- | ----------------------------------- | -| ERR_TRY_LOCK | Error attempting to acquire a lock. | -| ERR_UNLOCK | Error attempting to release a lock. | -| ERR_LOCK_STORE_NOT_CONFIGURED | Error lock store is not configured. | -| ERR_LOCK_STORE_NOT_FOUND | Error lock store not found. | +| HTTP Code | gRPC Code | Description | +| ------------------------------- | --------- | ------------------------- | +| `ERR_LOCK_STORE_NOT_CONFIGURED` | | Lock store not configured | +| `ERR_LOCK_STORE_NOT_FOUND` | | Lock store not found | +| `ERR_TRY_LOCK` | | Error acquiring lock | +| `ERR_UNLOCK` | | Error releasing lock | + ### Healthz -| Error Code | Description | -| ----------------------------- | --------------------------------------------------------------- | -| ERR_HEALTH_NOT_READY | Error that Dapr is not ready. | -| ERR_HEALTH_APPID_NOT_MATCH | Error the app-id does not match expected value in health check. | -| ERR_OUTBOUND_HEALTH_NOT_READY | Error outbound connection health is not ready. | +| HTTP Code | gRPC Code | Description | +| ------------------------------- | --------- | --------------------------- | +| `ERR_HEALTH_NOT_READY` | | Dapr not ready | +| `ERR_HEALTH_APPID_NOT_MATCH` | | Dapr App ID does not match | +| `ERR_OUTBOUND_HEALTH_NOT_READY` | | Dapr outbound not ready | + ### Common -| Error Code | Description | -| -------------------------- | ------------------------------------------------ | -| ERR_API_UNIMPLEMENTED | Error API is not implemented. | -| ERR_APP_CHANNEL_NIL | Error application channel is nil. | -| ERR_BAD_REQUEST | Error client request is badly formed or invalid. | -| ERR_BODY_READ | Error reading body. | -| ERR_INTERNAL | Internal server error encountered. | -| ERR_MALFORMED_REQUEST | Error with a malformed request. | -| ERR_MALFORMED_REQUEST_DATA | Error request data is malformed. | -| ERR_MALFORMED_RESPONSE | Error response data is malformed. | +| HTTP Code | gRPC Code | Description | +| ---------------------------- | --------- | -------------------------- | +| `ERR_API_UNIMPLEMENTED` | | API not implemented | +| `ERR_APP_CHANNEL_NIL` | | App channel is nil | +| `ERR_BAD_REQUEST` | | Bad request | +| `ERR_BODY_READ` | | Error reading request body | +| `ERR_INTERNAL` | | Internal error | +| `ERR_MALFORMED_REQUEST` | | Malformed request | +| `ERR_MALFORMED_REQUEST_DATA` | | Malformed request data | +| `ERR_MALFORMED_RESPONSE` | | Malformed response | + + +### Scheduler/Jobs API + +| HTTP Code | gRPC Code | Description | +| ------------------------------- | ------------------------------- | -------------------------------------- | +| `DAPR_SCHEDULER_SCHEDULE_JOB` | `DAPR_SCHEDULER_SCHEDULE_JOB` | Error scheduling job | +| `DAPR_SCHEDULER_JOB_NAME` | `DAPR_SCHEDULER_JOB_NAME` | Job name should only be set in the url | +| `DAPR_SCHEDULER_JOB_NAME_EMPTY` | `DAPR_SCHEDULER_JOB_NAME_EMPTY` | Job name is empty | +| `DAPR_SCHEDULER_GET_JOB` | `DAPR_SCHEDULER_GET_JOB` | Error getting job | +| `DAPR_SCHEDULER_LIST_JOBS` | `DAPR_SCHEDULER_LIST_JOBS` | Error listing jobs | +| `DAPR_SCHEDULER_DELETE_JOB` | `DAPR_SCHEDULER_DELETE_JOB` | Error deleting job | +| `DAPR_SCHEDULER_EMPTY` | `DAPR_SCHEDULER_EMPTY` | Required argument is empty | +| `DAPR_SCHEDULER_SCHEDULE_EMPTY` | `DAPR_SCHEDULER_SCHEDULE_EMPTY` | No schedule provided for job | + + +### Generic + +| HTTP Code | gRPC Code | Description | +| --------- | --------- | ------------- | +| `ERROR` | `ERROR` | Generic error | ## Next steps