From ed1e30e75e31315e9f5cc7e2f4c77ead1cde0929 Mon Sep 17 00:00:00 2001 From: Ramanth Addala Date: Wed, 19 Aug 2020 15:48:09 +0530 Subject: [PATCH] feat(csharp): adding retry configuration (#5929) * feat(csharp): adding retry configuration * fix(csharp-retry) : adding retry policy through configuration * fix(csharp): moving RetryConfiguration out of Configuration class * fix(csharp): minor changes * fix(csharp): fixing tabs * fix(csharp): reverting FILES * fix(csharp) :reverting some file changes * fix(csharp): reverting changes * update samples * fix(csharp-retry) : fixing merge conflicts and build failure * fix(chsarp-retry) : FILES changes * update samples Co-authored-by: William Cheng --- .../languages/CSharpNetCoreClientCodegen.java | 1 + .../csharp-netcore/ApiClient.mustache | 36 +++++++++++++++++-- .../csharp-netcore/Configuration.mustache | 2 +- .../IReadableConfiguration.mustache | 2 +- .../RetryConfiguration.mustache | 21 +++++++++++ .../csharp-netcore/netcore_project.mustache | 1 + .../OpenAPIClient/.openapi-generator/FILES | 1 + .../src/Org.OpenAPITools/Client/ApiClient.cs | 36 +++++++++++++++++-- .../Org.OpenAPITools/Client/Configuration.cs | 2 +- .../Client/IReadableConfiguration.cs | 2 +- .../Client/RetryConfiguration.cs | 21 +++++++++++ .../Org.OpenAPITools/Org.OpenAPITools.csproj | 1 + .../.openapi-generator/FILES | 1 + .../src/Org.OpenAPITools/Client/ApiClient.cs | 36 +++++++++++++++++-- .../Org.OpenAPITools/Client/Configuration.cs | 2 +- .../Client/IReadableConfiguration.cs | 2 +- .../Client/RetryConfiguration.cs | 21 +++++++++++ .../Org.OpenAPITools/Org.OpenAPITools.csproj | 1 + 18 files changed, 174 insertions(+), 15 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/csharp-netcore/RetryConfiguration.mustache create mode 100644 samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/RetryConfiguration.cs create mode 100644 samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/RetryConfiguration.cs diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java index 00ea2907f6f..0e189813db7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNetCoreClientCodegen.java @@ -616,6 +616,7 @@ public class CSharpNetCoreClientCodegen extends AbstractCSharpCodegen { supportingFiles.add(new SupportingFile("ISynchronousClient.mustache", clientPackageDir, "ISynchronousClient.cs")); supportingFiles.add(new SupportingFile("RequestOptions.mustache", clientPackageDir, "RequestOptions.cs")); supportingFiles.add(new SupportingFile("Multimap.mustache", clientPackageDir, "Multimap.cs")); + supportingFiles.add(new SupportingFile("RetryConfiguration.mustache", clientPackageDir, "RetryConfiguration.cs")); supportingFiles.add(new SupportingFile("IReadableConfiguration.mustache", clientPackageDir, "IReadableConfiguration.cs")); diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/ApiClient.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/ApiClient.mustache index 0a963cc5827..d0c10be558c 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/ApiClient.mustache @@ -13,6 +13,7 @@ using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Text; +using System.Threading; using System.Text.RegularExpressions; using System.Threading.Tasks; using Newtonsoft.Json; @@ -21,6 +22,7 @@ using RestSharp; using RestSharp.Deserializers; using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs; using RestSharpMethod = RestSharp.Method; +using Polly; namespace {{packageName}}.Client { @@ -419,7 +421,21 @@ namespace {{packageName}}.Client InterceptRequest(req); - var response = client.Execute(req); + IRestResponse response; + if (RetryConfiguration.RetryPolicy != null) + { + var policy = RetryConfiguration.RetryPolicy; + var policyResult = policy.ExecuteAndCapture(() => client.Execute(req)); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = client.Execute(req); + } InterceptResponse(req, response); @@ -503,7 +519,21 @@ namespace {{packageName}}.Client InterceptRequest(req); - var response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + IRestResponse response; + if (RetryConfiguration.AsyncRetryPolicy != null) + { + var policy = RetryConfiguration.AsyncRetryPolicy; + var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteAsync(req, cancellationToken)).ConfigureAwait(false); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + } InterceptResponse(req, response); @@ -750,4 +780,4 @@ namespace {{packageName}}.Client } #endregion ISynchronousClient } -} +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/Configuration.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/Configuration.mustache index bded375bb36..d7fd85f58be 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/Configuration.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/Configuration.mustache @@ -417,4 +417,4 @@ namespace {{packageName}}.Client } #endregion Static Members } -} +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/IReadableConfiguration.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/IReadableConfiguration.mustache index ba12e9b8158..9a139514cc2 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/IReadableConfiguration.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/IReadableConfiguration.mustache @@ -97,4 +97,4 @@ namespace {{packageName}}.Client /// X509 Certificate collection. X509CertificateCollection ClientCertificates { get; } } -} +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/RetryConfiguration.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/RetryConfiguration.mustache new file mode 100644 index 00000000000..8926f922c4b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/RetryConfiguration.mustache @@ -0,0 +1,21 @@ +using Polly.Retry; +using RestSharp; + +namespace {{packageName}}.Client +{ + /// + /// Configuration class to set the polly retry policies to be applied to the requests. + /// + public class RetryConfiguration + { + /// + /// Retry policy + /// + public static RetryPolicy RetryPolicy { get; set; } + + /// + /// Async retry policy + /// + public static AsyncRetryPolicy AsyncRetryPolicy { get; set; } + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/csharp-netcore/netcore_project.mustache b/modules/openapi-generator/src/main/resources/csharp-netcore/netcore_project.mustache index e9570eda444..6b725ceeb00 100644 --- a/modules/openapi-generator/src/main/resources/csharp-netcore/netcore_project.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-netcore/netcore_project.mustache @@ -28,6 +28,7 @@ + {{#validatable}} {{/validatable}} diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/.openapi-generator/FILES b/samples/client/petstore/csharp-netcore/OpenAPIClient/.openapi-generator/FILES index 5aafbfa64d8..028532c2b59 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/.openapi-generator/FILES +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/.openapi-generator/FILES @@ -81,6 +81,7 @@ src/Org.OpenAPITools/Client/ISynchronousClient.cs src/Org.OpenAPITools/Client/Multimap.cs src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs src/Org.OpenAPITools/Client/RequestOptions.cs +src/Org.OpenAPITools/Client/RetryConfiguration.cs src/Org.OpenAPITools/Model/AdditionalPropertiesClass.cs src/Org.OpenAPITools/Model/Animal.cs src/Org.OpenAPITools/Model/ApiResponse.cs diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ApiClient.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ApiClient.cs index 48245247eeb..165cb43a233 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ApiClient.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/ApiClient.cs @@ -18,6 +18,7 @@ using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Text; +using System.Threading; using System.Text.RegularExpressions; using System.Threading.Tasks; using Newtonsoft.Json; @@ -26,6 +27,7 @@ using RestSharp; using RestSharp.Deserializers; using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs; using RestSharpMethod = RestSharp.Method; +using Polly; namespace Org.OpenAPITools.Client { @@ -423,7 +425,21 @@ namespace Org.OpenAPITools.Client InterceptRequest(req); - var response = client.Execute(req); + IRestResponse response; + if (RetryConfiguration.RetryPolicy != null) + { + var policy = RetryConfiguration.RetryPolicy; + var policyResult = policy.ExecuteAndCapture(() => client.Execute(req)); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = client.Execute(req); + } InterceptResponse(req, response); @@ -506,7 +522,21 @@ namespace Org.OpenAPITools.Client InterceptRequest(req); - var response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + IRestResponse response; + if (RetryConfiguration.AsyncRetryPolicy != null) + { + var policy = RetryConfiguration.AsyncRetryPolicy; + var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteAsync(req, cancellationToken)).ConfigureAwait(false); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + } InterceptResponse(req, response); @@ -752,4 +782,4 @@ namespace Org.OpenAPITools.Client } #endregion ISynchronousClient } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/Configuration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/Configuration.cs index b8dc7784a23..f0d7536e829 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/Configuration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/Configuration.cs @@ -413,4 +413,4 @@ namespace Org.OpenAPITools.Client } #endregion Static Members } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/IReadableConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/IReadableConfiguration.cs index 997142723fa..a1a2f397296 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/IReadableConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/IReadableConfiguration.cs @@ -105,4 +105,4 @@ namespace Org.OpenAPITools.Client /// X509 Certificate collection. X509CertificateCollection ClientCertificates { get; } } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/RetryConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/RetryConfiguration.cs new file mode 100644 index 00000000000..0a8f3f9d07b --- /dev/null +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Client/RetryConfiguration.cs @@ -0,0 +1,21 @@ +using Polly.Retry; +using RestSharp; + +namespace Org.OpenAPITools.Client +{ + /// + /// Configuration class to set the polly retry policies to be applied to the requests. + /// + public class RetryConfiguration + { + /// + /// Retry policy + /// + public static RetryPolicy RetryPolicy { get; set; } + + /// + /// Async retry policy + /// + public static AsyncRetryPolicy AsyncRetryPolicy { get; set; } + } +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Org.OpenAPITools.csproj index aeeb5c097c9..565cada04ef 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Org.OpenAPITools.csproj +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -24,6 +24,7 @@ + diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/.openapi-generator/FILES b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/.openapi-generator/FILES index 5aafbfa64d8..028532c2b59 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/.openapi-generator/FILES +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/.openapi-generator/FILES @@ -81,6 +81,7 @@ src/Org.OpenAPITools/Client/ISynchronousClient.cs src/Org.OpenAPITools/Client/Multimap.cs src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs src/Org.OpenAPITools/Client/RequestOptions.cs +src/Org.OpenAPITools/Client/RetryConfiguration.cs src/Org.OpenAPITools/Model/AdditionalPropertiesClass.cs src/Org.OpenAPITools/Model/Animal.cs src/Org.OpenAPITools/Model/ApiResponse.cs diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ApiClient.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ApiClient.cs index 790e57e4c7a..0a8c9a3ed24 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ApiClient.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/ApiClient.cs @@ -19,6 +19,7 @@ using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Text; +using System.Threading; using System.Text.RegularExpressions; using System.Threading.Tasks; using Newtonsoft.Json; @@ -27,6 +28,7 @@ using RestSharp; using RestSharp.Deserializers; using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs; using RestSharpMethod = RestSharp.Method; +using Polly; namespace Org.OpenAPITools.Client { @@ -424,7 +426,21 @@ namespace Org.OpenAPITools.Client InterceptRequest(req); - var response = client.Execute(req); + IRestResponse response; + if (RetryConfiguration.RetryPolicy != null) + { + var policy = RetryConfiguration.RetryPolicy; + var policyResult = policy.ExecuteAndCapture(() => client.Execute(req)); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = client.Execute(req); + } InterceptResponse(req, response); @@ -507,7 +523,21 @@ namespace Org.OpenAPITools.Client InterceptRequest(req); - var response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + IRestResponse response; + if (RetryConfiguration.AsyncRetryPolicy != null) + { + var policy = RetryConfiguration.AsyncRetryPolicy; + var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteAsync(req, cancellationToken)).ConfigureAwait(false); + response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize(policyResult.Result) : new RestResponse + { + Request = req, + ErrorException = policyResult.FinalException + }; + } + else + { + response = await client.ExecuteAsync(req, cancellationToken).ConfigureAwait(false); + } InterceptResponse(req, response); @@ -753,4 +783,4 @@ namespace Org.OpenAPITools.Client } #endregion ISynchronousClient } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/Configuration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/Configuration.cs index 89a38c29ef6..1bd91d8d5eb 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/Configuration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/Configuration.cs @@ -418,4 +418,4 @@ namespace Org.OpenAPITools.Client } #endregion Static Members } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/IReadableConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/IReadableConfiguration.cs index 997142723fa..a1a2f397296 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/IReadableConfiguration.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/IReadableConfiguration.cs @@ -105,4 +105,4 @@ namespace Org.OpenAPITools.Client /// X509 Certificate collection. X509CertificateCollection ClientCertificates { get; } } -} +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/RetryConfiguration.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/RetryConfiguration.cs new file mode 100644 index 00000000000..0a8f3f9d07b --- /dev/null +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Client/RetryConfiguration.cs @@ -0,0 +1,21 @@ +using Polly.Retry; +using RestSharp; + +namespace Org.OpenAPITools.Client +{ + /// + /// Configuration class to set the polly retry policies to be applied to the requests. + /// + public class RetryConfiguration + { + /// + /// Retry policy + /// + public static RetryPolicy RetryPolicy { get; set; } + + /// + /// Async retry policy + /// + public static AsyncRetryPolicy AsyncRetryPolicy { get; set; } + } +} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Org.OpenAPITools.csproj index 2a7da9dc2ca..1c6de6f87e9 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Org.OpenAPITools.csproj +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -24,6 +24,7 @@ +