diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b56eeb81159e..c8cdf419978f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -44,7 +44,7 @@ /sdk/batch/ @gingi @paterasMSFT @dpwatrous # PRLabel: %Communication -/sdk/communication/ @JianpingChen @ankitarorabit @minnieliu @Azure/azure-sdk-communication-code-reviewers +/sdk/communication/ # PRLabel: %Communication - Calling Server /sdk/communication/sdk/communication/azure-communication-callingserver/ @minwoolee-msft @@ -53,7 +53,7 @@ /sdk/communication/sdk/communication/azure-communication-callautomation/ @juntuchen-msft @cochi2 # PRLabel: %Communication - Chat -/sdk/communication/sdk/communication/azure-communication-chat/ @JianpingChen @ankitarorabit @minnieliu @Azure/azure-sdk-communication-code-reviewers +/sdk/communication/sdk/communication/azure-communication-chat/ @ankitarorabit @minnieliu @Azure/azure-sdk-communication-code-reviewers # PRLabel: %Communication - Identity /sdk/communication/azure-communication-identity/ @Azure/acs-identity-sdk @petrsvihlik @AikoBB @maximrytych-ms @ostoliarova-msft @@ -62,7 +62,7 @@ /sdk/communication/azure-communication-common/ @Azure/acs-identity-sdk @petrsvihlik @AikoBB @maximrytych-ms @ostoliarova-msft # PRLabel: %Communication - Network Traversal -/sdk/communication/sdk/communication/azure-communication-networktraversal/ @JianpingChen @ankitarorabit @minnieliu @Azure/azure-sdk-communication-code-reviewers +/sdk/communication/sdk/communication/azure-communication-networktraversal/ @ankitarorabit @minnieliu @Azure/azure-sdk-communication-code-reviewers # PRLabel: %Communication - Phone Numbers /sdk/communication/azure-communication-phonenumbers/ @miguhern @whisper6284 @lucasrsant @RoyHerrod @danielav7 @@ -86,11 +86,11 @@ /sdk/core/azure-core-tracing-opentelemetry/ @samvaity @alzimmermsft @trask @lmolkova # PRLabel: %Cosmos -/sdk/cosmos/ @kushagraThapar @FabianMeiswinkel @kirankumarkolli @xinlian12 @milismsft @aayush3011 @simorenoh +/sdk/cosmos/ @kushagraThapar @FabianMeiswinkel @kirankumarkolli @xinlian12 @milismsft @aayush3011 @simorenoh @jeet1995 # PRLabel: %azure-spring -/sdk/cosmos/azure-spring-data-cosmos/ @kushagraThapar @FabianMeiswinkel @backwind1233 @chenrujun @hui1110 @netyyyy @saragluna @stliu @yiliuTo @xinlian12 @moarychan @aayush3011 @simorenoh @fangjian0423 +/sdk/cosmos/azure-spring-data-cosmos/ @kushagraThapar @FabianMeiswinkel @backwind1233 @chenrujun @hui1110 @netyyyy @saragluna @stliu @yiliuTo @xinlian12 @moarychan @aayush3011 @simorenoh @fangjian0423 @jeet1995 # PRLabel: %azure-spring -/sdk/cosmos/azure-spring-data-cosmos-test/ @kushagraThapar @FabianMeiswinkel @backwind1233 @chenrujun @hui1110 @netyyyy @saragluna @stliu @yiliuTo @xinlian12 @moarychan @aayush3011 @simorenoh @fangjian0423 +/sdk/cosmos/azure-spring-data-cosmos-test/ @kushagraThapar @FabianMeiswinkel @backwind1233 @chenrujun @hui1110 @netyyyy @saragluna @stliu @yiliuTo @xinlian12 @moarychan @aayush3011 @simorenoh @fangjian0423 @jeet1995 # PRLabel: %Load Testing /sdk/loadtestservice/ @Harshan01 @abranj1219 diff --git a/.vscode/cspell.json b/.vscode/cspell.json index d210d573c97f..12786a3af426 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -165,7 +165,6 @@ "sdk/parents/azure-client-sdk-parent/**", "sdk/parents/azure-sdk-parent/**", "sdk/parents/azure-data-sdk-parent/**", - "sdk/metricsadvisor/azure-ai-metricsadvisor/**", "sdk/personalizer/azure-ai-personalizer/**", "sdk/purview/azure-analytics-purview-administration/**", "sdk/quantum/azure-quantum-jobs/**", @@ -177,7 +176,6 @@ "sdk/schemaregistry/azure-data-schemaregistry-apacheavro/**", "sdk/servicebus/build/**", "sdk/spring/scripts/**", - "sdk/servicebus/azure-messaging-servicebus/**", "sdk/spring/spring-cloud-azure-actuator/**", "sdk/spring/spring-cloud-azure-actuator-autoconfigure/**", "sdk/spring/spring-cloud-azure-integration-tests/**", @@ -258,6 +256,7 @@ "words": [ "adal", "amqp", + "Apim", "AUHours", "autoscale", "autodetection", @@ -630,8 +629,20 @@ "filename": "sdk/spring/CHANGELOG.md", "words": [ "AADB", - "JPMS", - "nimbusds" + "JPMS" + ] + }, + { + "filename": "sdk/spring/README.md", + "words": [ + "Dcheckstyle", + "Dcodesnippet", + "Djacoco", + "Drevapi", + "Dskip", + "Dspotbugs", + "Pdev", + "" ] }, { @@ -672,6 +683,34 @@ "RAGRS", "saoid" ] + }, + { + "filename": "sdk/metricsadvisor/azure-ai-metricsadvisor/**", + "words": [ + "APIV", + "bacf", + "alertme", + "adwiki", + "howto", + "bpfdfee", + "deduped", + "dedupe", + "POSTGRE", + "dgfbbbb", + "gdgfbbbb", + "dvhkl", + "yufrjo", + "kldn", + "dccf" + ] + }, + { + "filename": "sdk/servicebus/azure-messaging-servicebus/**", + "words": [ + "Conniey", + "qpid", + "unretriable" + ] } ], "allowCompoundWords": true diff --git a/common/perf-test-core/src/main/java/com/azure/perf/test/core/ApiPerfTestBase.java b/common/perf-test-core/src/main/java/com/azure/perf/test/core/ApiPerfTestBase.java index d2c8018c01f8..595cdb54d372 100644 --- a/common/perf-test-core/src/main/java/com/azure/perf/test/core/ApiPerfTestBase.java +++ b/common/perf-test-core/src/main/java/com/azure/perf/test/core/ApiPerfTestBase.java @@ -24,11 +24,12 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; -import java.util.Arrays; +import java.util.Collections; import java.util.concurrent.CompletableFuture; /** * The Base Performance Test class for API based Perf Tests. + * * @param the performance test options to use while running the test. */ public abstract class ApiPerfTestBase extends PerfTestBase { @@ -46,6 +47,7 @@ public abstract class ApiPerfTestBase extend /** * Creates an instance of the Http Based Performance test. + * * @param options the performance test options to use while running the test. * @throws IllegalStateException if an errors is encountered with building ssl context. */ @@ -58,7 +60,7 @@ public ApiPerfTestBase(TOptions options) { recordPlaybackHttpClient = createRecordPlaybackClient(options); testProxy = options.getTestProxies().get(parallelIndex % options.getTestProxies().size()); testProxyPolicy = new TestProxyPolicy(testProxy); - policies = Arrays.asList(testProxyPolicy); + policies = Collections.singletonList(testProxyPolicy); } else { recordPlaybackHttpClient = null; testProxy = null; @@ -79,7 +81,7 @@ private static HttpClient createHttpClient(PerfStressOptions options) { reactor.netty.http.client.HttpClient nettyHttpClient = reactor.netty.http.client.HttpClient.create() - .secure(sslContextSpec -> sslContextSpec.sslContext(sslContext)); + .secure(sslContextSpec -> sslContextSpec.sslContext(sslContext)); return new NettyAsyncHttpClientBuilder(nettyHttpClient).build(); } catch (SSLException e) { @@ -127,21 +129,20 @@ private static reactor.netty.http.client.HttpClient createRecordPlaybackClient(P } /** - * Attempts to configure a ClientBuilder using reflection. If a ClientBuilder does not follow the standard convention, - * it can be configured manually using the "httpClient" and "policies" fields. + * Attempts to configure a ClientBuilder using reflection. If a ClientBuilder does not follow the standard + * convention, it can be configured manually using the "httpClient" and "policies" fields. + * * @param clientBuilder The client builder. * @throws IllegalStateException If reflective access to get httpClient or addPolicy methods fail. */ protected void configureClientBuilder(HttpTrait clientBuilder) { - if (httpClient != null || policies != null) { - if (httpClient != null) { - clientBuilder.httpClient(httpClient); - } + if (httpClient != null) { + clientBuilder.httpClient(httpClient); + } - if (policies != null) { - for (HttpPipelinePolicy policy : policies) { - clientBuilder.addPolicy(policy); - } + if (policies != null) { + for (HttpPipelinePolicy policy : policies) { + clientBuilder.addPolicy(policy); } } } @@ -163,28 +164,37 @@ public Mono runAllAsync(long endNanoTime) { lastCompletionNanoTime = 0; long startNanoTime = System.nanoTime(); - return Flux.just(1) - .repeat() - .flatMap(i -> runTestAsync(), 1) - .doOnNext(v -> { - completedOperations += v; + return Flux.generate(sink -> { + if (System.nanoTime() < endNanoTime) { + sink.next(1); + } else { + sink.complete(); + } + }) + .flatMap(ignored -> { + if (System.nanoTime() < endNanoTime) { + return runTestAsync(); + } else { + return Mono.just(0); + } + }, 1) + .doOnNext(result -> { + completedOperations += result; lastCompletionNanoTime = System.nanoTime() - startNanoTime; }) - .takeWhile(i -> System.nanoTime() < endNanoTime) .then(); } /** - * Indicates how many operations were completed in a single run of the test. - * Good to be used for batch operations. + * Indicates how many operations were completed in a single run of the test. Good to be used for batch operations. * * @return the number of successful operations completed. */ abstract int runTest(); /** - * Indicates how many operations were completed in a single run of the async test. - * Good to be used for batch operations. + * Indicates how many operations were completed in a single run of the async test. Good to be used for batch + * operations. * * @return the number of successful operations completed. */ @@ -192,6 +202,7 @@ public Mono runAllAsync(long endNanoTime) { /** * Stops playback tests. + * * @return An empty {@link Mono}. */ public Mono stopPlaybackAsync() { @@ -245,6 +256,7 @@ private Mono startPlaybackAsync() { /** * Records responses and starts tests in playback mode. + * * @return */ @Override @@ -253,16 +265,16 @@ Mono postSetupAsync() { // Make one call to Run() before starting recording, to avoid capturing one-time setup like authorization requests. return runSyncOrAsync() - .then(startRecordingAsync()) - .then(Mono.defer(() -> { + .then(startRecordingAsync()) + .then(Mono.defer(() -> { testProxyPolicy.setRecordingId(recordingId); testProxyPolicy.setMode("record"); return Mono.empty(); })) - .then(runSyncOrAsync()) - .then(stopRecordingAsync()) - .then(startPlaybackAsync()) - .then(Mono.defer(() -> { + .then(runSyncOrAsync()) + .then(stopRecordingAsync()) + .then(startPlaybackAsync()) + .then(Mono.defer(() -> { testProxyPolicy.setRecordingId(recordingId); testProxyPolicy.setMode("playback"); return Mono.empty(); diff --git a/common/perf-test-core/src/main/java/com/azure/perf/test/core/PerfStressProgram.java b/common/perf-test-core/src/main/java/com/azure/perf/test/core/PerfStressProgram.java index 8ca329511da8..1b7e36351258 100644 --- a/common/perf-test-core/src/main/java/com/azure/perf/test/core/PerfStressProgram.java +++ b/common/perf-test-core/src/main/java/com/azure/perf/test/core/PerfStressProgram.java @@ -18,11 +18,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import java.util.stream.IntStream; -import java.util.stream.Stream; /** * Represents the main program class which reflectively runs and manages the performance tests. @@ -30,14 +31,25 @@ public class PerfStressProgram { private static final int NANOSECONDS_PER_SECOND = 1_000_000_000; - private static int getCompletedOperations(PerfTestBase[] tests) { - return Stream.of(tests).mapToInt(perfStressTest -> Long.valueOf(perfStressTest.getCompletedOperations()).intValue()).sum(); + private static long getCompletedOperations(PerfTestBase[] tests) { + long completedOperations = 0; + for (PerfTestBase test : tests) { + completedOperations += test.getCompletedOperations(); + } + + return completedOperations; } private static double getOperationsPerSecond(PerfTestBase[] tests) { - return IntStream.range(0, tests.length) - .mapToDouble(i -> tests[i].getCompletedOperations() / (((double) tests[i].lastCompletionNanoTime) / NANOSECONDS_PER_SECOND)) - .sum(); + double operationsPerSecond = 0.0D; + for (PerfTestBase test : tests) { + double temp = test.getCompletedOperations() / (((double) test.lastCompletionNanoTime) / NANOSECONDS_PER_SECOND); + if (!Double.isNaN(temp)) { + operationsPerSecond += temp; + } + } + + return operationsPerSecond; } /** @@ -187,7 +199,7 @@ public static void run(Class testClass, PerfStressOptions options) { if (!options.isNoCleanup()) { cleanupStatus = printStatus("=== Cleanup ===", () -> ".", false, false); - Flux.just(tests).flatMap(t -> t.cleanupAsync()).blockLast(); + Flux.just(tests).flatMap(PerfTestBase::cleanupAsync).blockLast(); } } } @@ -222,11 +234,11 @@ public static void runTests(PerfTestBase[] tests, boolean sync, int parallel, long endNanoTime = System.nanoTime() + ((long) durationSeconds * 1000000000); - int[] lastCompleted = new int[]{0}; + long[] lastCompleted = new long[]{0}; Disposable progressStatus = printStatus( "=== " + title + " ===" + System.lineSeparator() + "Current\t\tTotal\t\tAverage", () -> { - int totalCompleted = getCompletedOperations(tests); - int currentCompleted = totalCompleted - lastCompleted[0]; + long totalCompleted = getCompletedOperations(tests); + long currentCompleted = totalCompleted - lastCompleted[0]; double averageCompleted = getOperationsPerSecond(tests); lastCompleted[0] = totalCompleted; @@ -236,10 +248,16 @@ public static void runTests(PerfTestBase[] tests, boolean sync, int parallel, try { if (sync) { ForkJoinPool forkJoinPool = new ForkJoinPool(parallel); - forkJoinPool.submit(() -> { - IntStream.range(0, parallel).parallel().forEach(i -> tests[i].runAll(endNanoTime)); - }).get(); + List> operations = new ArrayList<>(parallel); + for (PerfTestBase test : tests) { + operations.add(() -> { + test.runAll(endNanoTime); + return 1; + }); + } + forkJoinPool.invokeAll(operations, (durationSeconds * 1000L) + 100L, TimeUnit.MILLISECONDS); + forkJoinPool.shutdown(); } else { // Exceptions like OutOfMemoryError are handled differently by the default Reactor schedulers. Instead of terminating the // Flux, the Flux will hang and the exception is only sent to the thread's uncaughtExceptionHandler and the Reactor @@ -251,13 +269,13 @@ public static void runTests(PerfTestBase[] tests, boolean sync, int parallel, }); Flux.range(0, parallel) - .parallel() - .runOn(Schedulers.boundedElastic()) - .flatMap(i -> tests[i].runAllAsync(endNanoTime)) + .parallel(parallel) + .runOn(Schedulers.parallel()) + .flatMap(i -> tests[i].runAllAsync(endNanoTime), false, Math.min(parallel, 1000 / parallel), 1) .then() .block(); } - } catch (InterruptedException | ExecutionException e) { + } catch (InterruptedException e) { System.err.println("Error occurred when submitting jobs to ForkJoinPool. " + System.lineSeparator() + e); e.printStackTrace(System.err); throw new RuntimeException(e); @@ -270,7 +288,7 @@ public static void runTests(PerfTestBase[] tests, boolean sync, int parallel, System.out.println("=== Results ==="); - int totalOperations = getCompletedOperations(tests); + long totalOperations = getCompletedOperations(tests); if (totalOperations == 0) { throw new IllegalStateException("Zero operations has been completed"); } diff --git a/eng/CredScanSuppression.json b/eng/CredScanSuppression.json index 705d7cb8a260..e9fe1202b288 100644 --- a/eng/CredScanSuppression.json +++ b/eng/CredScanSuppression.json @@ -3,44 +3,40 @@ "suppressions": [ { "placeholder": [ - "secret=", - "123", - "1234567890", - "((***Redacted***by***CredScan***))", - "proxyPassword", - "pass", - "dummyPassword", - "P@ssw0rd", - "12NewPA$$w0rd!", - "Samp1eP@ssw0rd", - "facebookapplicationsecret", - "updatedfacebooksecret", "serverappsecret" ], - "_justification": "Secret used by test code, it is fake." + "_justification": "Secret used by jackson json property and test code, it is fake." }, { - "placeholder": "*sig=sD3fPKLnFKZUjnSV4qA%2FXoJOqsmDfNfxWcZ7kPtLc0I%3D*", - "_justification": "Base-64 encoded SHA-256 of a placeholder above." - }, - { - "placeholder": "95o6TL9jkIjNr6HurD6Xa+zLQ+PX9/VWR8fI2ofHatbrUb8kRJ75B6enwRU3q1OP8fmjghaoxdqnwhN7m3pZow=", - "_justification": "Well-known Account Key" + "placeholder": [ + "administratorLoginPassword" + ], + "_justification": "Secret used by spring-cloud-azure-integration-tests/test-resources/jdbc/mysql/test-resources.json" }, { "placeholder": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "_justification": "SHA-256 encrypted random data generated at test time." }, - { - "placeholder": "JdppJP5eH1w/CQ0cx4RGYWoC7NmQ0nmDbYR2PYWSDTXojV9bI1ck0Eh0sUIg8xj4KYj7tv+ZPLICu3BgLt6mMz==", - "_justification": "Mocked key used in performance testing." - }, { "placeholder": "OAuth2ClientCredential", "_justification": "Javadoc in azure-resourcemanager-datafactory" }, { - "file":[ + "placeholder": [ + "h2PermissionGrants", + "h2PermissionScopes" + ], + "_justification": "Javadoc in azure-resourcemanager" + }, + { + "placeholder": [ + "h2AllowImplicitFlow", + "h2Permissions" + ], + "_justification": "Javadoc in azure resourcemanagerhybrid" + }, + { + "file": [ "eng/common/testproxy/dotnet-devcert.pfx", "sdk/cosmos/azure-cosmos/src/test/resources/server.jks", "sdk/cosmos/azure-cosmos/src/test/resources/client.jks", @@ -57,6 +53,24 @@ "sdk/keyvault/microsoft-azure-keyvault-cryptography/src/test/resources/secp256keynew.pem" ], "_justification": "File contains private key used by test code." + }, + { + "file": [ + "sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/FakeCredentialConstants.java" + ], + "_justification": "File contains fake key used by implementation code." + }, + { + "file": [ + "sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/FakeCredentialInTest.java", + "sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/FakeCredentialInTest.java", + "sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/FakeCredentialInTest.java", + "sdk/spring/spring-cloud-azure-service/src/test/java/com/azure/spring/cloud/service/implementation/storage/FakeCredentialInTest.java", + "sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/FakeCredentialInTest.java", + "sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/FakeCredentialInTest.java", + "sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/FakeCredentialInTest.groovy" + ], + "_justification": "File contains fake key used by test code." } ] } diff --git a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml index 0e7e17602cf5..a8c399de6de0 100755 --- a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml +++ b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml @@ -100,6 +100,7 @@ + diff --git a/eng/code-quality-reports/src/main/resources/revapi/revapi.json b/eng/code-quality-reports/src/main/resources/revapi/revapi.json index 18df0ac2add2..a6adbe567df5 100644 --- a/eng/code-quality-reports/src/main/resources/revapi/revapi.json +++ b/eng/code-quality-reports/src/main/resources/revapi/revapi.json @@ -352,6 +352,11 @@ "new": "class com.azure.spring.cloud.autoconfigure.data.cosmos.CosmosDataAutoConfiguration", "justification": "Fixes a bug." }, + { + "code": "java.method.added", + "new": "method void com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer::(org.springframework.security.web.authentication.logout.LogoutSuccessHandler, org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver, org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient, org.springframework.boot.web.client.RestTemplateBuilder)", + "justification": "New method added to fix a bug." + }, { "code": "java.missing.newSuperType", "old": "class com.azure.messaging.eventhubs.EventData", diff --git a/eng/common/TestResources/New-TestResources.ps1 b/eng/common/TestResources/New-TestResources.ps1 index 25d8060cc116..8fdcaad7f794 100644 --- a/eng/common/TestResources/New-TestResources.ps1 +++ b/eng/common/TestResources/New-TestResources.ps1 @@ -723,29 +723,27 @@ try { Log $msg $deployment = Retry { - $lastDebugPreference = $DebugPreference - try { - if ($CI) { - $DebugPreference = 'Continue' - } - New-AzResourceGroupDeployment -Name $BaseName -ResourceGroupName $resourceGroup.ResourceGroupName -TemplateFile $templateFile.jsonFilePath -TemplateParameterObject $templateFileParameters -Force:$Force - } catch { - Write-Output @' + New-AzResourceGroupDeployment ` + -Name $BaseName ` + -ResourceGroupName $resourceGroup.ResourceGroupName ` + -TemplateFile $templateFile.jsonFilePath ` + -TemplateParameterObject $templateFileParameters ` + -Force:$Force + } + + if ($deployment.ProvisioningState -ne 'Succeeded') { + Write-Host "Deployment '$($deployment.DeploymentName)' has state '$($deployment.ProvisioningState)' with CorrelationId '$($deployment.CorrelationId)'. Exiting..." + Write-Host @' ##################################################### # For help debugging live test provisioning issues, # -# see http://aka.ms/azsdk/engsys/live-test-help, # +# see http://aka.ms/azsdk/engsys/live-test-help # ##################################################### '@ - throw - } finally { - $DebugPreference = $lastDebugPreference - } + exit 1 } - if ($deployment.ProvisioningState -eq 'Succeeded') { - # New-AzResourceGroupDeployment would've written an error and stopped the pipeline by default anyway. - Write-Verbose "Successfully deployed template '$($templateFile.jsonFilePath)' to resource group '$($resourceGroup.ResourceGroupName)'" - } + Write-Host "Deployment '$($deployment.DeploymentName)' has CorrelationId '$($deployment.CorrelationId)'" + Write-Host "Successfully deployed template '$($templateFile.jsonFilePath)' to resource group '$($resourceGroup.ResourceGroupName)'" $deploymentOutputs = SetDeploymentOutputs $serviceName $context $deployment $templateFile diff --git a/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 b/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 index ea4923daa42a..fe98ca172167 100644 --- a/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 +++ b/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 @@ -14,7 +14,8 @@ param ( [Parameter(Mandatory=$False)][string] $DisplayNameFilter, [Parameter(Mandatory=$False)][array] $Filters, [Parameter(Mandatory=$False)][array] $Replace, - [Parameter(Mandatory=$False)][array] $NonSparseParameters + [Parameter(Mandatory=$False)][array] $NonSparseParameters, + [Parameter()][switch] $CI = ($null -ne $env:SYSTEM_TEAMPROJECTID) ) . $PSScriptRoot/job-matrix-functions.ps1 @@ -39,6 +40,6 @@ $serialized = SerializePipelineMatrix $matrix Write-Output $serialized.pretty -if ($null -ne $env:SYSTEM_TEAMPROJECTID) { +if ($CI) { Write-Output "##vso[task.setVariable variable=matrix;isOutput=true]$($serialized.compressed)" -} \ No newline at end of file +} diff --git a/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 b/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 index f949b03ad8a3..a79db98e7c96 100644 --- a/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 +++ b/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 @@ -30,30 +30,40 @@ function FindStressPackages( # Bare minimum filter for stress tests $filters['stressTest'] = 'true' $packages = @() - $chartFiles = Get-ChildItem -Recurse -Filter 'Chart.yaml' $directory + $chartFiles = Get-ChildItem -Recurse -Filter 'Chart.yaml' $directory + Write-Host "Found chart files:" + Write-Host ($chartFiles -join "`n") + if (!$MatrixFileName) { - $MatrixFileName = '/scenarios-matrix.yaml' + $MatrixFileName = 'scenarios-matrix.yaml' } + foreach ($chartFile in $chartFiles) { $chart = ParseChart $chartFile - if (matchesAnnotations $chart $filters) { - $matrixFilePath = (Join-Path $chartFile.Directory.FullName $MatrixFileName) - if (Test-Path $matrixFilePath) { - GenerateScenarioMatrix ` - -matrixFilePath $matrixFilePath ` - -Selection $MatrixSelection ` - -DisplayNameFilter $MatrixDisplayNameFilter ` - -Filters $MatrixFilters ` - -Replace $MatrixReplace ` - -NonSparseParameters $MatrixNonSparseParameters - } - - $packages += NewStressTestPackageInfo ` - -chart $chart ` - -chartFile $chartFile ` - -CI:$CI ` - -namespaceOverride $namespaceOverride + + if (!(matchesAnnotations $chart $filters)) { + Write-Host "Skipping chart file '$chartFile'" + continue + } + + VerifyAddonsVersion $chart $chartFile + + $matrixFilePath = (Join-Path $chartFile.Directory.FullName $MatrixFileName) + if (Test-Path $matrixFilePath) { + GenerateScenarioMatrix ` + -matrixFilePath $matrixFilePath ` + -Selection $MatrixSelection ` + -DisplayNameFilter $MatrixDisplayNameFilter ` + -Filters $MatrixFilters ` + -Replace $MatrixReplace ` + -NonSparseParameters $MatrixNonSparseParameters } + + $packages += NewStressTestPackageInfo ` + -chart $chart ` + -chartFile $chartFile ` + -CI:$CI ` + -namespaceOverride $namespaceOverride } return $packages @@ -65,7 +75,7 @@ function ParseChart([string]$chartFile) { function MatchesAnnotations([hashtable]$chart, [hashtable]$filters) { foreach ($filter in $filters.GetEnumerator()) { - if (!$chart.annotations -or $chart.annotations[$filter.Key] -ne $filter.Value) { + if (!$chart["annotations"] -or $chart["annotations"][$filter.Key] -ne $filter.Value) { return $false } } @@ -73,6 +83,16 @@ function MatchesAnnotations([hashtable]$chart, [hashtable]$filters) { return $true } +function VerifyAddonsVersion([hashtable]$chart, [string]$chartFile) { + foreach ($dependency in $chart.dependencies) { + if ($dependency.name -eq "stress-test-addons" -and + $dependency.version -like '0.1.*' -or + $dependency.version -like '^0.1.*') { + throw "The stress-test-addons version in use for '$chartFile' is $($dependency.version), please use versions >= 0.2.0" + } + } +} + function GetUsername() { # Check GITHUB_USER for users in codespaces environments, since the default user is `codespaces` and # we would like to avoid namespace overlaps for different codespaces users. diff --git a/eng/common/scripts/stress-testing/generate-scenario-matrix.ps1 b/eng/common/scripts/stress-testing/generate-scenario-matrix.ps1 index 1ddb05cd0cd7..d0f23f486156 100644 --- a/eng/common/scripts/stress-testing/generate-scenario-matrix.ps1 +++ b/eng/common/scripts/stress-testing/generate-scenario-matrix.ps1 @@ -7,9 +7,11 @@ param( [Parameter(Mandatory=$False)][array]$NonSparseParameters ) +$ErrorActionPreference = 'Stop' + function GenerateScenarioMatrix( - [string]$matrixFilePath, - [string]$Selection, + [Parameter(Mandatory=$True)][string]$matrixFilePath, + [Parameter(Mandatory=$True)][string]$Selection, [Parameter(Mandatory=$False)][string]$DisplayNameFilter, [Parameter(Mandatory=$False)][array]$Filters, [Parameter(Mandatory=$False)][array]$Replace, @@ -23,12 +25,17 @@ function GenerateScenarioMatrix( -DisplayNameFilter $DisplayNameFilter ` -Filters $Filters ` -Replace $Replace ` - -NonSparseParameters $NonSparseParameters + -NonSparseParameters $NonSparseParameters ` + -CI:$False + + Write-Host "==================================================" + Write-Host "Generated matrix for $matrixFilePath" Write-Host $prettyMatrix - $prettyMatrix = $prettyMatrix | ConvertFrom-Json + Write-Host "==================================================" + $matrixObj = $prettyMatrix | ConvertFrom-Json $scenariosMatrix = @() - foreach($permutation in $prettyMatrix.psobject.properties) { + foreach($permutation in $matrixObj.psobject.properties) { $entry = @{} $entry.Name = $permutation.Name -replace '_', '-' $entry.Scenario = $entry.Name @@ -46,13 +53,14 @@ function GenerateScenarioMatrix( $values = $valuesYaml | ConvertFrom-Yaml -Ordered if (!$values) {$values = @{}} - if ($values.ContainsKey('Scenarios')) { - throw "Please use matrix generation for stress test scenarios." + if ($values.Contains('Scenarios')) { + throw "Please remove the 'Scenarios' key from $valuesConfig as it is deprecated." } } $values.scenarios = $scenariosMatrix - $values | ConvertTo-Yaml | Out-File -FilePath (Join-Path $matrixFilePath '../generatedValues.yaml') + $generatedValues = Join-Path (Split-Path $matrixFilePath) 'generatedValues.yaml' + $values | ConvertTo-Yaml | Out-File -FilePath $generatedValues } function NewStressTestPackageInfo( diff --git a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 index 0365bbb30cbb..e6f9ee191975 100644 --- a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 +++ b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 @@ -40,8 +40,12 @@ function Login([string]$subscription, [string]$clusterGroup, [switch]$pushImages $cluster = RunOrExitOnFailure az aks list -g $clusterGroup --subscription $subscription -o json $clusterName = ($cluster | ConvertFrom-Json).name - $kubeContext = (RunOrExitOnFailure kubectl config view -o json) | ConvertFrom-Json - $defaultNamespace = $kubeContext.contexts.Where({ $_.name -eq $clusterName }).context.namespace + $kubeContext = (RunOrExitOnFailure kubectl config view -o json) | ConvertFrom-Json -AsHashtable + $defaultNamespace = $null + $targetContext = $kubeContext.contexts.Where({ $_.name -eq $clusterName }) | Select -First 1 + if ($targetContext -ne $null) { + $defaultNamespace = $targetContext.context.namespace + } RunOrExitOnFailure az aks get-credentials ` -n "$clusterName" ` @@ -201,6 +205,9 @@ function DeployStressPackage( $dockerFilePath = "$($pkg.Directory)/Dockerfile" } $dockerFilePath = [System.IO.Path]::GetFullPath($dockerFilePath).Trim() + if (!(Test-Path $dockerFilePath)) { + continue + } if ("imageBuildDir" -in $scenario.keys) { $dockerBuildDir = Join-Path $pkg.Directory $scenario.imageBuildDir @@ -212,7 +219,7 @@ function DeployStressPackage( } } if ($pkg.Dockerfile -or $pkg.DockerBuildDir) { - throw "The chart.yaml docker config is depracated, please use the scenarios matrix instead." + throw "The chart.yaml docker config is deprecated, please use the scenarios matrix instead." } @@ -249,9 +256,10 @@ function DeployStressPackage( } } $genVal.scenarios = @( foreach ($scenario in $genVal.scenarios) { - $dockerPath = Join-Path $pkg.Directory $scenario.image - if ("image" -notin $scenario) { - $dockerPath = $dockerFilePath + $dockerPath = if ("image" -notin $scenario) { + $dockerFilePath + } else { + Join-Path $pkg.Directory $scenario.image } if ([System.IO.Path]::GetFullPath($dockerPath) -eq $dockerFilePath) { $scenario.imageTag = $imageTag @@ -267,7 +275,7 @@ function DeployStressPackage( -n $pkg.Namespace ` --install ` --set stress-test-addons.env=$environment ` - --values generatedValues.yaml + --values (Join-Path $pkg.Directory generatedValues.yaml) if ($LASTEXITCODE) { # Issues like 'UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress' # can be the result of cancelled `upgrade` operations (e.g. ctrl-c). diff --git a/eng/common/testproxy/target_version.txt b/eng/common/testproxy/target_version.txt index ae57303e6a0c..bd5c540d4aab 100644 --- a/eng/common/testproxy/target_version.txt +++ b/eng/common/testproxy/target_version.txt @@ -1 +1 @@ -1.0.0-dev.20221007.3 +1.0.0-dev.20221031.1 diff --git a/eng/java.gdnbaselines b/eng/java.gdnbaselines index 3691109f233f..d5f2f5c90dab 100644 --- a/eng/java.gdnbaselines +++ b/eng/java.gdnbaselines @@ -3,8 +3,8 @@ "baselines": { "baseline": { "name": "baseline", - "createdDate": "2022-02-16 19:00:07Z", - "lastUpdatedDate": "2022-02-16 19:00:07Z" + "createdDate": "2022-11-01 17:35:53Z", + "lastUpdatedDate": "2022-11-01 17:35:53Z" } }, "results": { @@ -20,7 +20,7 @@ "tool": "credscan", "ruleId": "CSCAN-GENERAL0020", "justification": null, - "createdDate": "2022-02-16 19:00:07Z", + "createdDate": "2022-11-01 17:35:53Z", "expirationDate": null, "type": null }, @@ -36,503 +36,7 @@ "tool": "credscan", "ruleId": "CSCAN-GENERAL0020", "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "46edbe27e32a28d61b37719072e7030064668f4580f25c7bba8b7a04e5356735": { - "signature": "46edbe27e32a28d61b37719072e7030064668f4580f25c7bba8b7a04e5356735", - "alternativeSignatures": [ - "55fe0dd39cc42572e72067a1f52c2861f627539ae8338e2a7bc3f0c5e9cab66c" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "5c0af6c0a8a8423241034f37ac9ebbb95b06fbe491fa000d5d2c68cec7c38ee2": { - "signature": "5c0af6c0a8a8423241034f37ac9ebbb95b06fbe491fa000d5d2c68cec7c38ee2", - "alternativeSignatures": [ - "5331fac3fe07d404894cc71e51f1b6c2261d545d6516e58e15d0210c06c8aaf9" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "9b1572ba5adeeff75c33598e949fb5e49e012cde430643ad59ae1434c3ece6de": { - "signature": "9b1572ba5adeeff75c33598e949fb5e49e012cde430643ad59ae1434c3ece6de", - "alternativeSignatures": [ - "f8a6f7277561228f8c1b310bec7544206f81db1e0d0cfd7e6d984a8890564f5c" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "0258c0ac1efddcf15ab7c0f696ce417b2e351c87cecfec1733f4633a92e266ab": { - "signature": "0258c0ac1efddcf15ab7c0f696ce417b2e351c87cecfec1733f4633a92e266ab", - "alternativeSignatures": [ - "276433d71eb6fb0b32b2226859cb196835de6fa5ec7fddc7ad7b36f5b76b8137" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployMultipleWars.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "731fed63ad56b1a59cac47679160580ebc1db180d92fabb838543baebcde75c6": { - "signature": "731fed63ad56b1a59cac47679160580ebc1db180d92fabb838543baebcde75c6", - "alternativeSignatures": [ - "15ac2d3dc08add72b33cede937faa06da2d970e7ab1d0af953e8e48c40338a0c" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployWar.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "c4851071483de4819162ff744b2b2d78958e5d9f1eb4d82ee6af5bc1ca7323c9": { - "signature": "c4851071483de4819162ff744b2b2d78958e5d9f1eb4d82ee6af5bc1ca7323c9", - "alternativeSignatures": [ - "b30fd406cea8f4244170b319a60aaa3d4486fea57d965c191a7ec8eb4308a1c4" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "098455758c185d26578cc1df1178c8c77597bd8e262c5dd1c96951c07bdc541e": { - "signature": "098455758c185d26578cc1df1178c8c77597bd8e262c5dd1c96951c07bdc541e", - "alternativeSignatures": [ - "5cc45b23e0e417513cf25ad506742d3ee8ee886422211d158a0293903c75013c" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "8344791f83398c200ac88cd03a4b4054f6f8348b2ec4981b2b8e3ffac8cf00a2": { - "signature": "8344791f83398c200ac88cd03a4b4054f6f8348b2ec4981b2b8e3ffac8cf00a2", - "alternativeSignatures": [ - "26714d308b21b09964ad760db814a6fe79829a12b7d8995c4422edf7cec4e605" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "f4667e9f2720e5ae59edbc0242194c30bd23d8d35ce09e2696a3aa71c1ced5a9": { - "signature": "f4667e9f2720e5ae59edbc0242194c30bd23d8d35ce09e2696a3aa71c1ced5a9", - "alternativeSignatures": [ - "da952a5b1626fd69b74a4c0ca59bbae0d8218a71cbd33f4a7f590d7cb083a13f" - ], - "target": "sdk/core/azure-core/src/test/java/com/azure/core/credential/CredentialsTests.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "1e8416c5591fe2672d26cde9c2f91cc0423a43f215c97f7b5bb443005d4f9d53": { - "signature": "1e8416c5591fe2672d26cde9c2f91cc0423a43f215c97f7b5bb443005d4f9d53", - "alternativeSignatures": [ - "b09941ae2d8b2659b63ce28807e4a3adca9b11f13f7a66689288a245a59430be" - ], - "target": "sdk/translation/azure-ai-documenttranslator/src/samples/java/com/azure/ai/documenttranslator/TranslateDocuments.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-AZURE0061", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "f6a8781bbc63f19c504c923944ab94e5320cb49e1d831badc9975ed4e284f5d1": { - "signature": "f6a8781bbc63f19c504c923944ab94e5320cb49e1d831badc9975ed4e284f5d1", - "alternativeSignatures": [ - "e73567a91319514f40d1c1943f503d23f7722dd0783906afd8367f1255e1bb8c" - ], - "target": "sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksCreateSamples.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "be66b316d9a12a7720fb42bf5557eb0096d08d34ed61809876cd9ba397c91105": { - "signature": "be66b316d9a12a7720fb42bf5557eb0096d08d34ed61809876cd9ba397c91105", - "alternativeSignatures": [ - "cd4c1f7c5766ceef9b425efaf830003cdf48cf0b583ddc659a74246cef956e47" - ], - "target": "sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksUpdateSamples.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "343376ede9c517c31a76e2aad40ae42bb1af8e3dff1170f0684cd26680c9dd43": { - "signature": "343376ede9c517c31a76e2aad40ae42bb1af8e3dff1170f0684cd26680c9dd43", - "alternativeSignatures": [ - "08119f94dcf0792d9849847c4bac5510d0f54f2bd08ea05f1243f804397f8215" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/models/ApplicationBase.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "97657b7d7e29c63300cf904a0c67caa8902a6e0db6debec89ecca6ed7af286b8": { - "signature": "97657b7d7e29c63300cf904a0c67caa8902a6e0db6debec89ecca6ed7af286b8", - "alternativeSignatures": [ - "868666c7caaa3c04e7c2ff93a698b0bea6c314ec8d49d0fd2d4cd5aa78e853ff" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/models/ApplicationBase.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "b7fa8d10396dbd1638adecc6064bc073b2698e4647e03588d9bbfe151c8bb138": { - "signature": "b7fa8d10396dbd1638adecc6064bc073b2698e4647e03588d9bbfe151c8bb138", - "alternativeSignatures": [ - "6d11aacc6b9925125a59c1463b6bfe44f578b6192d2d48d6215ab7847b81d767" - ], - "target": "sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/blob/HelperTest.groovy", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-AZURE0060", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "e93f4a17093e5d7f026e9b0645acb66c7ab35c764e2fd97c05f75a71303953b0": { - "signature": "e93f4a17093e5d7f026e9b0645acb66c7ab35c764e2fd97c05f75a71303953b0", - "alternativeSignatures": [ - "a8cab12f0603de10c6a87d190b14fe93ef733e5cff4226bc769735135654843d" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/Get2ItemsItem.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "45499e4d0d0cc02e44338eaff1e095ca9cc435a43676fa7a3dd90933e6019b39": { - "signature": "45499e4d0d0cc02e44338eaff1e095ca9cc435a43676fa7a3dd90933e6019b39", - "alternativeSignatures": [ - "6eb2ad0663ba6c4b29d243c11d8cdd4300dc9a94030bcac1e16f18022c274c10" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/Get3ItemsItem.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "89d7a324a237aa0ad4050dd0fee224ca5af6fe2c53b597c718d34babe9ea6fd8": { - "signature": "89d7a324a237aa0ad4050dd0fee224ca5af6fe2c53b597c718d34babe9ea6fd8", - "alternativeSignatures": [ - "9cbb0dc365ee3419705732afba468f6639e5ca86143ac7439270ab6fbf54284b" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/Get7ItemsItem.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "2914e893bfb383b43511e881998552e0068a9e6a4bba0f8dfeb0920108937167": { - "signature": "2914e893bfb383b43511e881998552e0068a9e6a4bba0f8dfeb0920108937167", - "alternativeSignatures": [ - "6725b7226db11df4ea9ac4b6e411c6a72dc6efc4576b2296e0b11b78461f785d" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/Get8ItemsItem.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "b09c71e7bffaa57335004c6fbd91fbdc8c00a0b5febfa56f34c669a609ade5ab": { - "signature": "b09c71e7bffaa57335004c6fbd91fbdc8c00a0b5febfa56f34c669a609ade5ab", - "alternativeSignatures": [ - "0246b00825f93eede59e0f589c427fecfe3a7f115324f003a3f5d419c71ce048" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/MicrosoftGraphApiApplication.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "680bd1e214b82208e1d831a08f31a474fd9ed63dcdabe05426aa7bb6ce959e18": { - "signature": "680bd1e214b82208e1d831a08f31a474fd9ed63dcdabe05426aa7bb6ce959e18", - "alternativeSignatures": [ - "5689795eec2b409822516b7fdcbd37e456b7c400457a16238cdffdba9f787ac2" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/MicrosoftGraphServicePrincipalInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "399f89fbc54cbc668e802da292f13c18e6ae7a0c8c02ed272a97dff58c680192": { - "signature": "399f89fbc54cbc668e802da292f13c18e6ae7a0c8c02ed272a97dff58c680192", - "alternativeSignatures": [ - "bbf14e2d834b96f32989cf5d471982c2834e5967ec753bf89d24bb5ce87523b9" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/MicrosoftGraphServicePrincipalInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "3c37bcf3288a1bed3a1da8fe7def633096583cceb0dcb8c80e57080af46db280": { - "signature": "3c37bcf3288a1bed3a1da8fe7def633096583cceb0dcb8c80e57080af46db280", - "alternativeSignatures": [ - "06ae7a4a3d618eb53daf9fcbb43a874a5b11fb20f321ed9a693f3d9d8cef6711" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/MicrosoftGraphUserInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "dc20062df7ce1b72552811f387ba39015906c9548cad64ec89bf006772faab7a": { - "signature": "dc20062df7ce1b72552811f387ba39015906c9548cad64ec89bf006772faab7a", - "alternativeSignatures": [ - "5c903217fe6ed8c5b9031d4b91985915b1e1c49b7350645c3e0c3b1c8718e0bc" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalsServicePrincipalExpand.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "708e4990a808c33857e1597bb0ca9d63b3d452850d1d72f820a87b68f45f0ba7": { - "signature": "708e4990a808c33857e1597bb0ca9d63b3d452850d1d72f820a87b68f45f0ba7", - "alternativeSignatures": [ - "f3698c23125ed83e8ee038c6631ef835bb5e433abf922786c697e07e3beff70e" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalsServicePrincipalOrderby.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "edec27e49ed23bfa6bf1edad022a47d1858b24d82a4e257cfc7ca0be2a04cd47": { - "signature": "edec27e49ed23bfa6bf1edad022a47d1858b24d82a4e257cfc7ca0be2a04cd47", - "alternativeSignatures": [ - "6765185ceb0c660ebbfd37942bae705a5aa4dcef4af8579251a212a7b49c6b25" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalsServicePrincipalOrderby.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "379b76fe81bc0b541bf8f80eb48bba70b2acadf0fecea8c429434afcc7a99f2c": { - "signature": "379b76fe81bc0b541bf8f80eb48bba70b2acadf0fecea8c429434afcc7a99f2c", - "alternativeSignatures": [ - "2b749b36f579faa2edf673177b7a7e7a114df233833b8b9f0321efee89551b14" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalsServicePrincipalSelect.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "0eea1b751c39d35f45c859eab5fc0cae72c6cc8a79231dbdf0583a401dbf1f9c": { - "signature": "0eea1b751c39d35f45c859eab5fc0cae72c6cc8a79231dbdf0583a401dbf1f9c", - "alternativeSignatures": [ - "9f1fa49ab0b05ba4e399caf76a9fe9d80f8411a81dd72d30354384ba6df568d0" - ], - "target": "sdk/resourcemanager/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalsServicePrincipalSelect.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "ff3ad74c1ec4be67f4c9e8b01dbc9177cbf05ec158133b1045654657e59353c7": { - "signature": "ff3ad74c1ec4be67f4c9e8b01dbc9177cbf05ec158133b1045654657e59353c7", - "alternativeSignatures": [ - "9de5e4a85b947993c826b4976cd096d3e9904ceda035f4f2821d1b56d726b329" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ApplicationInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "1e1b4c8ef0759c3943212137bfdef03f1da9d1a117705f56e8107ae502de5fb3": { - "signature": "1e1b4c8ef0759c3943212137bfdef03f1da9d1a117705f56e8107ae502de5fb3", - "alternativeSignatures": [ - "30988657640112606dfd054d8c9c9c9fb2593d7ee3ed94242f32859c255a2ea5" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ApplicationInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", - "expirationDate": null, - "type": null - }, - "c459147551918e1c4884bbcbbd8832086758444f5cf7637e328022167e48aab6": { - "signature": "c459147551918e1c4884bbcbbd8832086758444f5cf7637e328022167e48aab6", - "alternativeSignatures": [ - "f05e67fcbd8fec8b6cee078b9f3b5c42534567596c5787fda1d7a7c0cec14ade" - ], - "target": "sdk/resourcemanagerhybrid/azure-resourcemanager-authorization/src/main/java/com/azure/resourcemanager/authorization/fluent/models/ServicePrincipalInner.java", - "memberOf": [ - "baseline" - ], - "tool": "credscan", - "ruleId": "CSCAN-GENERAL0120", - "justification": null, - "createdDate": "2022-02-16 19:00:07Z", + "createdDate": "2022-11-01 17:35:53Z", "expirationDate": null, "type": null } diff --git a/eng/pipelines/docindex.yml b/eng/pipelines/docindex.yml index a16873b7159e..2ab0223301cc 100644 --- a/eng/pipelines/docindex.yml +++ b/eng/pipelines/docindex.yml @@ -7,6 +7,7 @@ jobs: - job: UpdateDocsMsBuildConfig pool: vmImage: ubuntu-20.04 + timeoutInMinutes: 180 variables: DocRepoLocation: $(Pipeline.Workspace)/docs DailyDocRepoLocation: $(Pipeline.Workspace)/daily diff --git a/eng/pipelines/templates/jobs/ci.tests.yml b/eng/pipelines/templates/jobs/ci.tests.yml index 730bdddda808..eeefe0a3dcdc 100644 --- a/eng/pipelines/templates/jobs/ci.tests.yml +++ b/eng/pipelines/templates/jobs/ci.tests.yml @@ -75,6 +75,8 @@ jobs: CheckoutRecordings: true SDKType: ${{ parameters.SDKType }} + - template: ../steps/install-latest-jdk.yml + - template: ../steps/install-reporting-tools.yml parameters: JdkVersion: $(JavaTestVersion) diff --git a/eng/pipelines/templates/jobs/live.tests.yml b/eng/pipelines/templates/jobs/live.tests.yml index bd7fbe8b933a..2f37cae4faa8 100644 --- a/eng/pipelines/templates/jobs/live.tests.yml +++ b/eng/pipelines/templates/jobs/live.tests.yml @@ -54,6 +54,8 @@ jobs: ServiceDirectory: ${{ parameters.ServiceDirectory }} SDKType: ${{ parameters.SDKType }} + - template: ../steps/install-latest-jdk.yml + - template: ../steps/install-reporting-tools.yml parameters: JdkVersion: $(JavaTestVersion) diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index c989470de2f2..0d878bb99c7e 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -97,7 +97,7 @@ stages: - AZURE_TEST.*=.*/ - ${{ if eq(parameters.SDKType, 'data') }}: - - JavaTestVersion=(.*1)\.17(.*)/$1.11$2 + - JavaTestVersion=(.*1)\.\d{2}(.*)/$1.11$2 PreBuildSteps: ${{ parameters.PreBuildSteps }} AdditionalLintingOptions: ${{ parameters.AdditionalLintingOptions }} ${{ if eq(parameters.SDKType, 'data') }}: diff --git a/eng/pipelines/templates/stages/platform-matrix.json b/eng/pipelines/templates/stages/platform-matrix.json index 4583de075438..8e1389ce4edc 100644 --- a/eng/pipelines/templates/stages/platform-matrix.json +++ b/eng/pipelines/templates/stages/platform-matrix.json @@ -50,6 +50,16 @@ "TestFromSource": false, "TestGoals": "surefire:test", "TestOptions": "" + }, + { + "Agent": { + "ubuntu-20.04": { "OSVmImage": "MMSUbuntu20.04", "Pool": "azsdk-pool-mms-ubuntu-2004-general" } + }, + "JavaTestVersion": "1.19", + "AZURE_TEST_HTTP_CLIENTS": "netty", + "TestFromSource": false, + "TestGoals": "surefire:test", + "TestOptions": "" } ] } diff --git a/eng/pipelines/templates/steps/build-and-test.yml b/eng/pipelines/templates/steps/build-and-test.yml index 4eb88782093a..43c5532cbf82 100644 --- a/eng/pipelines/templates/steps/build-and-test.yml +++ b/eng/pipelines/templates/steps/build-and-test.yml @@ -54,6 +54,7 @@ steps: env: AZURE_VERSION_OVERRIDE_TESTS: ${{ parameters.TestVersionSupport }} condition: and(succeeded(), ne(variables['TestFromSource'], 'true')) + continueOnError: ${{ eq(variables['LatestJdkVersion'], variables['JavaTestVersion']) }} - task: Maven@3 displayName: 'Run tests' @@ -69,6 +70,7 @@ steps: env: ${{ parameters.TestEnvVars }} # we want to run this when TestFromSource isn't true condition: and(succeeded(), ne(variables['TestFromSource'], 'true')) + continueOnError: ${{ eq(variables['LatestJdkVersion'], variables['JavaTestVersion']) }} # Generate the pom file with all the modules required for creating an aggregate code coverage report - task: PythonScript@0 diff --git a/eng/pipelines/templates/steps/initialize-test-environment.yml b/eng/pipelines/templates/steps/initialize-test-environment.yml index c6da81eaf16d..6f511f1b5b5c 100644 --- a/eng/pipelines/templates/steps/initialize-test-environment.yml +++ b/eng/pipelines/templates/steps/initialize-test-environment.yml @@ -16,7 +16,7 @@ parameters: steps: # Skip sparse checkout for the `azure-sdk-for--pr` private mirrored repositories - # as we require the github service connection to be loaded. + # as we require the GitHub service connection to be loaded. - ${{ if not(contains(variables['Build.DefinitionName'], 'java-pr')) }}: - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml parameters: @@ -86,7 +86,7 @@ steps: condition: and(succeeded(), eq(variables['TestFromSource'], 'true')) # Skip sparse checkout for the `azure-sdk-for--pr` private mirrored repositories - # as we require the github service connection to be loaded. + # as we require the GitHub service connection to be loaded. - ${{ if not(contains(variables['Build.DefinitionName'], 'java-pr')) }}: - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml parameters: diff --git a/eng/pipelines/templates/steps/install-latest-jdk.yml b/eng/pipelines/templates/steps/install-latest-jdk.yml new file mode 100644 index 000000000000..f852c76a3436 --- /dev/null +++ b/eng/pipelines/templates/steps/install-latest-jdk.yml @@ -0,0 +1,27 @@ +steps: + # Non-standard JDK versions are only supported in Linux. + # Make the assumption here Linux is being used, if it's not it's a configuration issue that needs to be fixed there. + - task: Cache@2 + inputs: + key: 'jdk | "$(JavaTestVersion)" | "$(CacheSalt)" | "$(Agent.OS)"' + path: $(Agent.BuildDirectory)/jdk-$(LatestJdkFeatureVersion) + displayName: 'Cache Latest JDK' + condition: eq(variables['LatestJdkVersion'], variables['JavaTestVersion']) + + - task: PowerShell@2 + displayName: 'Install Latest JDK' + inputs: + pwsh: true + arguments: > + -JdkFeatureVersion $(LatestJdkFeatureVersion) + workingDirectory: $(Agent.BuildDirectory) + filePath: eng/scripts/Install-Latest-JDK.ps1 + condition: eq(variables['LatestJdkVersion'], variables['JavaTestVersion']) + + - pwsh: | + Write-Host "Java 8 JDK: $Env:JAVA_HOME_8_X64" + Write-Host "Java 11 JDK: $Env:JAVA_HOME_11_X64" + Write-Host "Java 17 JDK: $Env:JAVA_HOME_17_X64" + Write-Host "Latest JDK: $Env:JAVA_HOME_$(LatestJdkFeatureVersion)_X64" + displayName: 'Verify Latest JDK Install' + condition: eq(variables['LatestJdkVersion'], variables['JavaTestVersion']) \ No newline at end of file diff --git a/eng/pipelines/templates/variables/globals.yml b/eng/pipelines/templates/variables/globals.yml index 507556fe7e6d..2ba6b8b4c37e 100644 --- a/eng/pipelines/templates/variables/globals.yml +++ b/eng/pipelines/templates/variables/globals.yml @@ -4,6 +4,9 @@ variables: JavaBuildVersion: '1.17' # This is the default Java test version. It's the version used when running tests. JavaTestVersion: '1.17' + # This is the latest JDK version. + LatestJdkVersion: '1.19' + LatestJdkFeatureVersion: '19' # This is the version of Python used by various tools in the Java build/release processes PythonVersion: '3.9' diff --git a/eng/scripts/Install-Latest-JDK.ps1 b/eng/scripts/Install-Latest-JDK.ps1 new file mode 100644 index 000000000000..d72c65be2900 --- /dev/null +++ b/eng/scripts/Install-Latest-JDK.ps1 @@ -0,0 +1,53 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory=$true)] + [string]$JdkFeatureVersion +) + +# Query Adoptium for the list of installs for the JDK feature version. +$adoptiumApiUrl = "https://api.adoptium.net" +$os + +if ($IsWindows) { + $os = "windows" +} elseif ($IsMacOS) { + $os = "mac" +} else { + $os = "linux" +} + +$getInstalls = "$adoptiumApiUrl/v3/assets/latest/$JdkFeatureVersion/hotspot?architecture=x64&image_type=jdk&os=$os&vendor=eclipse" +$jdkUnzipName = "jdk-$JdkFeatureVersion" + +Write-Host "Downloading latest JDK to" (Get-Location) + +if (!(Test-Path -Path $jdkUnzipName -PathType container)) { + # Query Adoptium for the list of installs for the JDK feature version. + Write-Host "Inkvoking web request to '$getInstalls' to find JDK $JdkFeatureVersion installs available on $os." + $installsAvailable = Invoke-WebRequest -URI $getInstalls | ConvertFrom-Json + $jdkLink = $installsAvailable.binary.package.link + $jdkZipName = $jdkLink.split("/")[-1] + + Write-Host "Downloading install from '$jdkLink' to '$jdkZipName'." + Invoke-WebRequest -URI $jdkLink -OutFile $jdkZipName + + if ($IsWindows) { + Expand-Archive -Path $jdkZipName -Destination "jdk-temp" + Move-Item -Path (Join-Path -Path "jdk-temp" -ChildPath (Get-ChildItem "jdk-temp")[0].Name) -Destination $jdkUnzipName + } else { + New-Item -Path "jdk-temp" -ItemType "directory" + tar -xvf $jdkZipName -C "jdk-temp" + Move-Item -Path (Join-Path -Path "jdk-temp" -ChildPath (Get-ChildItem "jdk-temp")[0].Name) -Destination $jdkUnzipName + } + +} + +$javaHome = (Convert-Path $jdkUnzipName) +Write-Host "Latest JDK: $javaHome" + +Write-Host "Current JAVA_HOME: $Env:JAVA_HOME" +Write-Host "##vso[task.setvariable variable=JAVA_HOME;]$javaHome" +Write-Host "Updated JAVA_HOME: $Env:JAVA_HOME" + +$jdkFeatureVersionJavaHome = "JAVA_HOME_" + $JdkFeatureVersion + "_X64" +Write-Host "##vso[task.setvariable variable=$jdkFeatureVersionJavaHome;]$javaHome" diff --git a/eng/versioning/external_dependencies.txt b/eng/versioning/external_dependencies.txt index 5776d1368a57..4278ca090af7 100644 --- a/eng/versioning/external_dependencies.txt +++ b/eng/versioning/external_dependencies.txt @@ -199,7 +199,7 @@ com.microsoft.azure:azure-mgmt-resources;1.3.0 com.microsoft.azure:azure-mgmt-search;1.24.1 com.microsoft.azure:azure-mgmt-storage;1.3.0 com.microsoft.azure:azure-storage;8.0.0 -com.microsoft.azure:msal4j;1.13.2 +com.microsoft.azure:msal4j;1.13.3 com.microsoft.azure:msal4j-persistence-extension;1.1.0 com.mysql:mysql-connector-j;8.0.31 com.sun.activation:jakarta.activation;2.0.1 diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 4484006c043d..e3a5fb499c90 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -273,7 +273,7 @@ com.azure.resourcemanager:azure-resourcemanager-datadog;1.0.0-beta.3;1.0.0-beta. com.azure.resourcemanager:azure-resourcemanager-communication;1.0.0;1.1.0-beta.4 com.azure.resourcemanager:azure-resourcemanager-apimanagement;1.0.0-beta.3;1.0.0-beta.4 com.azure.resourcemanager:azure-resourcemanager-kubernetesconfiguration;1.0.0-beta.3;1.0.0-beta.4 -com.azure.resourcemanager:azure-resourcemanager-resourcegraph;1.0.0-beta.3;1.0.0-beta.4 +com.azure.resourcemanager:azure-resourcemanager-resourcegraph;1.0.0;1.1.0-beta.1 com.azure.resourcemanager:azure-resourcemanager-changeanalysis;1.0.0;1.1.0-beta.1 com.azure.resourcemanager:azure-resourcemanager-delegatednetwork;1.0.0-beta.1;1.0.0-beta.2 com.azure.resourcemanager:azure-resourcemanager-synapse;1.0.0-beta.6;1.0.0-beta.7 @@ -397,6 +397,7 @@ unreleased_com.azure:azure-identity;1.7.0-beta.2 unreleased_com.azure:azure-identity-providers-core;1.0.0-beta.2 unreleased_com.azure:azure-identity-providers-jdbc-mysql;1.0.0-beta.2 unreleased_com.azure:azure-identity-providers-jdbc-postgresql;1.0.0-beta.2 +unreleased_com.azure:azure-core-amqp;2.8.0-beta.1 # Released Beta dependencies: Copy the entry from above, prepend "beta_", remove the current # version and set the version to the released beta. Released beta dependencies are only valid diff --git a/sdk/anomalydetector/azure-ai-anomalydetector/src/test/java/com/azure/ai/anomalydetector/AnomalyDetectorClientTestBase.java b/sdk/anomalydetector/azure-ai-anomalydetector/src/test/java/com/azure/ai/anomalydetector/AnomalyDetectorClientTestBase.java index 2abbec16ddbb..56e596d02969 100644 --- a/sdk/anomalydetector/azure-ai-anomalydetector/src/test/java/com/azure/ai/anomalydetector/AnomalyDetectorClientTestBase.java +++ b/sdk/anomalydetector/azure-ai-anomalydetector/src/test/java/com/azure/ai/anomalydetector/AnomalyDetectorClientTestBase.java @@ -27,7 +27,7 @@ * Base class for Anomaly Detector clients test. */ public class AnomalyDetectorClientTestBase extends TestBase { - private static final String FAKE_API_KEY = "1234567890"; + private static final String FAKE_API_KEY = "fakeKeyPlaceholder"; private static final String OCP_APIM_SUBSCRIPTION_KEY = "Ocp-Apim-Subscription-Key"; void testDetectEntireSeriesWithResponse(Consumer testRunner) { diff --git a/sdk/apimanagement/azure-resourcemanager-apimanagement/SAMPLE.md b/sdk/apimanagement/azure-resourcemanager-apimanagement/SAMPLE.md index 2e4234b6a5ed..3ca77c0fca00 100644 --- a/sdk/apimanagement/azure-resourcemanager-apimanagement/SAMPLE.md +++ b/sdk/apimanagement/azure-resourcemanager-apimanagement/SAMPLE.md @@ -6444,7 +6444,7 @@ public final class IdentityProviderCreateOrUpdateSamples { .define(IdentityProviderType.FACEBOOK) .withExistingService("rg1", "apimService1") .withClientId("facebookid") - .withClientSecret("facebookapplicationsecret") + .withClientSecret("fakeSecretPlaceholder") .create(); } } @@ -6597,7 +6597,7 @@ public final class IdentityProviderUpdateSamples { resource .update() .withClientId("updatedfacebookid") - .withClientSecret("updatedfacebooksecret") + .withClientSecret("fakeUpdatedSecretPlaceholder") .withIfMatch("*") .apply(); } diff --git a/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderCreateOrUpdateSamples.java b/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderCreateOrUpdateSamples.java index 87dab89156b2..f3aed7984189 100644 --- a/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderCreateOrUpdateSamples.java +++ b/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderCreateOrUpdateSamples.java @@ -23,7 +23,7 @@ public static void apiManagementCreateIdentityProvider( .define(IdentityProviderType.FACEBOOK) .withExistingService("rg1", "apimService1") .withClientId("facebookid") - .withClientSecret("facebookapplicationsecret") + .withClientSecret("fakeSecretPlaceholder") .create(); } } diff --git a/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderUpdateSamples.java b/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderUpdateSamples.java index d5fec39c1a90..929663d8fbde 100644 --- a/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderUpdateSamples.java +++ b/sdk/apimanagement/azure-resourcemanager-apimanagement/src/samples/java/com/azure/resourcemanager/apimanagement/generated/IdentityProviderUpdateSamples.java @@ -28,7 +28,7 @@ public static void apiManagementUpdateIdentityProvider( resource .update() .withClientId("updatedfacebookid") - .withClientSecret("updatedfacebooksecret") + .withClientSecret("fakeUpdatedSecretPlaceholder") .withIfMatch("*") .apply(); } diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/ConfigurationClientCredentials.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/ConfigurationClientCredentials.java index 74a8d44bb1ab..c8b0562b8694 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/ConfigurationClientCredentials.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/ConfigurationClientCredentials.java @@ -27,6 +27,8 @@ import java.util.Map; import java.util.stream.Collectors; +import static com.azure.data.appconfiguration.implementation.FakeCredentialConstants.SECRET_PLACEHOLDER; + /** * Credentials that authorizes requests to Azure App Configuration. It uses content within the HTTP request to * generate the correct "Authorization" header value. {@link ConfigurationCredentialsPolicy} ensures that the content @@ -156,7 +158,7 @@ private void addSignatureHeader(final URL url, final String httpMethod, final Ma private static class CredentialInformation { private static final String ENDPOINT = "endpoint="; private static final String ID = "id="; - private static final String SECRET = "secret="; + private static final String SECRET = SECRET_PLACEHOLDER; private final URL baseUri; private final String id; diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/FakeCredentialConstants.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/FakeCredentialConstants.java new file mode 100644 index 000000000000..02a51850740c --- /dev/null +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/FakeCredentialConstants.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.data.appconfiguration.implementation; + +/** + * Never explore this class publicly. It should be only use in internal to gather the fake credential or keyword that + * failed the CredScan. + */ +public final class FakeCredentialConstants { + /** + * 'secret=' keyword placeholder. + */ + public static final String SECRET_PLACEHOLDER = "secret="; +} diff --git a/sdk/appcontainers/azure-resourcemanager-appcontainers/src/test/java/com/azure/resourcemanager/appcontainers/generated/RegistryInfoTests.java b/sdk/appcontainers/azure-resourcemanager-appcontainers/src/test/java/com/azure/resourcemanager/appcontainers/generated/RegistryInfoTests.java index 7154ef4e094c..d17152ba628e 100644 --- a/sdk/appcontainers/azure-resourcemanager-appcontainers/src/test/java/com/azure/resourcemanager/appcontainers/generated/RegistryInfoTests.java +++ b/sdk/appcontainers/azure-resourcemanager-appcontainers/src/test/java/com/azure/resourcemanager/appcontainers/generated/RegistryInfoTests.java @@ -15,23 +15,23 @@ public void testDeserialize() { RegistryInfo model = BinaryData .fromString( - "{\"registryUrl\":\"klnsrmffey\",\"registryUserName\":\"ckt\",\"registryPassword\":\"ymerteeammxq\"}") + "{\"registryUrl\":\"fakeUrlPlaceholder\",\"registryUserName\":\"fakeNamePlaceholder\",\"registryPassword\":\"fakePasswordPlaceholder\"}") .toObject(RegistryInfo.class); - Assertions.assertEquals("klnsrmffey", model.registryUrl()); - Assertions.assertEquals("ckt", model.registryUsername()); - Assertions.assertEquals("ymerteeammxq", model.registryPassword()); + Assertions.assertEquals("fakeUrlPlaceholder", model.registryUrl()); + Assertions.assertEquals("fakeNamePlaceholder", model.registryUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.registryPassword()); } @Test public void testSerialize() { RegistryInfo model = new RegistryInfo() - .withRegistryUrl("klnsrmffey") - .withRegistryUsername("ckt") - .withRegistryPassword("ymerteeammxq"); + .withRegistryUrl("fakeUrlPlaceholder") + .withRegistryUsername("fakeNamePlaceholder") + .withRegistryPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(RegistryInfo.class); - Assertions.assertEquals("klnsrmffey", model.registryUrl()); - Assertions.assertEquals("ckt", model.registryUsername()); - Assertions.assertEquals("ymerteeammxq", model.registryPassword()); + Assertions.assertEquals("fakeUrlPlaceholder", model.registryUrl()); + Assertions.assertEquals("fakeNamePlaceholder", model.registryUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.registryPassword()); } } diff --git a/sdk/automation/azure-resourcemanager-automation/SAMPLE.md b/sdk/automation/azure-resourcemanager-automation/SAMPLE.md index ea776e4a70ed..4439ab587de3 100644 --- a/sdk/automation/azure-resourcemanager-automation/SAMPLE.md +++ b/sdk/automation/azure-resourcemanager-automation/SAMPLE.md @@ -3938,7 +3938,7 @@ public final class SourceControlCreateOrUpdateSamples { .withSourceType(SourceType.VSO_GIT) .withSecurityToken( new SourceControlSecurityTokenProperties() - .withAccessToken("3a326f7a0dcd343ea58fee21f2fd5fb4c1234567") + .withAccessToken("fakeTokenPlaceholder") .withTokenType(TokenType.PERSONAL_ACCESS_TOKEN)) .withDescription("my description") .create(); @@ -4041,7 +4041,7 @@ public final class SourceControlUpdateSamples { .withPublishRunbook(true) .withSecurityToken( new SourceControlSecurityTokenProperties() - .withAccessToken("3a326f7a0dcd343ea58fee21f2fd5fb4c1234567") + .withAccessToken("fakeTokenPlaceholder") .withTokenType(TokenType.PERSONAL_ACCESS_TOKEN)) .withDescription("my description") .apply(); diff --git a/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlCreateOrUpdateSamples.java b/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlCreateOrUpdateSamples.java index 6279ea170b6d..43d72adfc74a 100644 --- a/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlCreateOrUpdateSamples.java +++ b/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlCreateOrUpdateSamples.java @@ -31,7 +31,7 @@ public static void createOrUpdateASourceControl(com.azure.resourcemanager.automa .withSourceType(SourceType.VSO_GIT) .withSecurityToken( new SourceControlSecurityTokenProperties() - .withAccessToken("3a326f7a0dcd343ea58fee21f2fd5fb4c1234567") + .withAccessToken("fakeTokenPlaceholder") .withTokenType(TokenType.PERSONAL_ACCESS_TOKEN)) .withDescription("my description") .create(); diff --git a/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlUpdateSamples.java b/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlUpdateSamples.java index 3a137b89dfe2..d63ad8535b1d 100644 --- a/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlUpdateSamples.java +++ b/sdk/automation/azure-resourcemanager-automation/src/samples/java/com/azure/resourcemanager/automation/generated/SourceControlUpdateSamples.java @@ -33,7 +33,7 @@ public static void updateASourceControl(com.azure.resourcemanager.automation.Aut .withPublishRunbook(true) .withSecurityToken( new SourceControlSecurityTokenProperties() - .withAccessToken("3a326f7a0dcd343ea58fee21f2fd5fb4c1234567") + .withAccessToken("fakeTokenPlaceholder") .withTokenType(TokenType.PERSONAL_ACCESS_TOKEN)) .withDescription("my description") .apply(); diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallAutomationAsyncClient.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallAutomationAsyncClient.java index b589f9b62152..870da779d948 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallAutomationAsyncClient.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallAutomationAsyncClient.java @@ -125,14 +125,12 @@ Mono> createCallWithResponseInternal(CreateCallOption try { context = context == null ? Context.NONE : context; CreateCallRequestInternal request = getCreateCallRequestInternal(createCallOptions); - if (createCallOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - createCallOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + + createCallOptions.setRepeatabilityHeaders(handleApiIdempotency(createCallOptions.getRepeatabilityHeaders())); return serverCallingInternal.createCallWithResponseAsync(request, - createCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - createCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + createCallOptions.getRepeatabilityHeaders() != null ? createCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + createCallOptions.getRepeatabilityHeaders() != null ? createCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> { @@ -227,10 +225,7 @@ Mono> answerCallWithResponseInternal(AnswerCallOption .setIncomingCallContext(answerCallOptions.getIncomingCallContext()) .setCallbackUri(answerCallOptions.getCallbackUrl()); - if (answerCallOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - answerCallOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + answerCallOptions.setRepeatabilityHeaders(handleApiIdempotency(answerCallOptions.getRepeatabilityHeaders())); if (answerCallOptions.getMediaStreamingConfiguration() != null) { MediaStreamingConfigurationInternal mediaStreamingConfigurationInternal = @@ -241,8 +236,8 @@ Mono> answerCallWithResponseInternal(AnswerCallOption return serverCallingInternal.answerCallWithResponseAsync(request, - answerCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - answerCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + answerCallOptions.getRepeatabilityHeaders() != null ? answerCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + answerCallOptions.getRepeatabilityHeaders() != null ? answerCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> { @@ -296,14 +291,11 @@ Mono> redirectCallWithResponseInternal(RedirectCallOptions redire .setIncomingCallContext(redirectCallOptions.getIncomingCallContext()) .setTarget(CommunicationIdentifierConverter.convert(redirectCallOptions.getTarget())); - if (redirectCallOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - redirectCallOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + redirectCallOptions.setRepeatabilityHeaders(handleApiIdempotency(redirectCallOptions.getRepeatabilityHeaders())); return serverCallingInternal.redirectCallWithResponseAsync(request, - redirectCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - redirectCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + redirectCallOptions.getRepeatabilityHeaders() != null ? redirectCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + redirectCallOptions.getRepeatabilityHeaders() != null ? redirectCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create); } catch (RuntimeException ex) { @@ -348,14 +340,11 @@ Mono> rejectCallWithResponseInternal(RejectCallOptions rejectCall request.setCallRejectReason(CallRejectReasonInternal.fromString(rejectCallOptions.getCallRejectReason().toString())); } - if (rejectCallOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - rejectCallOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + rejectCallOptions.setRepeatabilityHeaders(handleApiIdempotency(rejectCallOptions.getRepeatabilityHeaders())); return serverCallingInternal.rejectCallWithResponseAsync(request, - rejectCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - rejectCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + rejectCallOptions.getRepeatabilityHeaders() != null ? rejectCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + rejectCallOptions.getRepeatabilityHeaders() != null ? rejectCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create); } catch (RuntimeException ex) { @@ -387,4 +376,24 @@ public CallRecordingAsync getCallRecordingAsync() { contentDownloader, httpPipelineInternal, resourceEndpoint); } //endregion + + //region helper functions + /*** + * Make sure repeatability headers of the request are correctly set. + * + * @return a verified RepeatabilityHeaders object. + */ + static RepeatabilityHeaders handleApiIdempotency(RepeatabilityHeaders repeatabilityHeaders) { + // This case means user did not disable idempotency + if (repeatabilityHeaders != null) { + // This means user never set the repeatability headers manually. + if (repeatabilityHeaders.getRepeatabilityRequestId().equals(UUID.fromString("0-0-0-0-0")) + && repeatabilityHeaders.getRepeatabilityFirstSent() == Instant.MIN) { + repeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); + } // Else do nothing, use the repeatability headers that user specified. + } // Else do nothing, since the user disabled idempotency. Leave it as null. + + return repeatabilityHeaders; + } + //endregion } diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallConnectionAsync.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallConnectionAsync.java index e2a07422ef2e..7de915974b71 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallConnectionAsync.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallConnectionAsync.java @@ -42,9 +42,7 @@ import reactor.core.publisher.Mono; import java.net.URISyntaxException; -import java.time.Instant; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; import static com.azure.core.util.FluxUtil.monoError; @@ -142,14 +140,11 @@ Mono> hangUpWithResponseInternal(HangUpOptions hangUpOptions, Con try { context = context == null ? Context.NONE : context; - if (hangUpOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - hangUpOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + hangUpOptions.setRepeatabilityHeaders(handleApiIdempotency(hangUpOptions.getRepeatabilityHeaders())); return (hangUpOptions.getIsForEveryone() ? callConnectionInternal.terminateCallWithResponseAsync(callConnectionId, - hangUpOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - hangUpOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + hangUpOptions.getRepeatabilityHeaders() != null ? hangUpOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + hangUpOptions.getRepeatabilityHeaders() != null ? hangUpOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) : callConnectionInternal.hangupCallWithResponseAsync(callConnectionId, context)) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create); @@ -272,14 +267,11 @@ Mono> transferToParticipantCallWithResponseInternal .setUserToUserInformation(transferToParticipantCallOptions.getUserToUserInformation()) .setOperationContext(transferToParticipantCallOptions.getOperationContext()); - if (transferToParticipantCallOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - transferToParticipantCallOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + transferToParticipantCallOptions.setRepeatabilityHeaders(handleApiIdempotency(transferToParticipantCallOptions.getRepeatabilityHeaders())); return callConnectionInternal.transferToParticipantWithResponseAsync(callConnectionId, request, - transferToParticipantCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - transferToParticipantCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + transferToParticipantCallOptions.getRepeatabilityHeaders() != null ? transferToParticipantCallOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + transferToParticipantCallOptions.getRepeatabilityHeaders() != null ? transferToParticipantCallOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> @@ -332,14 +324,11 @@ Mono> addParticipantsWithResponseInternal(AddPar request.setInvitationTimeoutInSeconds((int) addParticipantsOptions.getInvitationTimeout().getSeconds()); } - if (addParticipantsOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - addParticipantsOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + addParticipantsOptions.setRepeatabilityHeaders(handleApiIdempotency(addParticipantsOptions.getRepeatabilityHeaders())); return callConnectionInternal.addParticipantWithResponseAsync(callConnectionId, request, - addParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - addParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + addParticipantsOptions.getRepeatabilityHeaders() != null ? addParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + addParticipantsOptions.getRepeatabilityHeaders() != null ? addParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> new SimpleResponse<>(response, AddParticipantsResponseConstructorProxy.create(response.getValue()))); @@ -380,18 +369,15 @@ Mono> removeParticipantsWithResponseInternal( List participantModels = removeParticipantsOptions.getParticipants() .stream().map(CommunicationIdentifierConverter::convert).collect(Collectors.toList()); - if (removeParticipantsOptions.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - removeParticipantsOptions.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + removeParticipantsOptions.setRepeatabilityHeaders(handleApiIdempotency(removeParticipantsOptions.getRepeatabilityHeaders())); RemoveParticipantsRequestInternal request = new RemoveParticipantsRequestInternal() .setParticipantsToRemove(participantModels) .setOperationContext(removeParticipantsOptions.getOperationContext()); return callConnectionInternal.removeParticipantsWithResponseAsync(callConnectionId, request, - removeParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityRequestId(), - removeParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + removeParticipantsOptions.getRepeatabilityHeaders() != null ? removeParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + removeParticipantsOptions.getRepeatabilityHeaders() != null ? removeParticipantsOptions.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, context) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> new SimpleResponse<>(response, RemoveParticipantsResponseConstructorProxy.create(response.getValue()))); @@ -411,4 +397,15 @@ public CallMediaAsync getCallMediaAsync() { return new CallMediaAsync(callConnectionId, contentsInternal); } //endregion + + //region helper functions + /*** + * Make sure repeatability headers of the request are correctly set. + * + * @return a verified RepeatabilityHeaders object. + */ + private RepeatabilityHeaders handleApiIdempotency(RepeatabilityHeaders repeatabilityHeaders) { + return CallAutomationAsyncClient.handleApiIdempotency(repeatabilityHeaders); + } + //endregion } diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallRecordingAsync.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallRecordingAsync.java index 38793c54666f..0ce80e540fe2 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallRecordingAsync.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/CallRecordingAsync.java @@ -52,12 +52,10 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.security.InvalidParameterException; -import java.time.Instant; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.UUID; import java.util.stream.Collectors; import static com.azure.core.util.FluxUtil.monoError; @@ -123,18 +121,15 @@ Mono> startRecordingWithResponseInternal(StartRec } StartCallRecordingRequestInternal request = getStartCallRecordingRequest(options); - if (options.getRepeatabilityHeaders() == null) { - RepeatabilityHeaders autoRepeatabilityHeaders = new RepeatabilityHeaders(UUID.randomUUID(), Instant.now()); - options.setRepeatabilityHeaders(autoRepeatabilityHeaders); - } + options.setRepeatabilityHeaders(handleApiIdempotency(options.getRepeatabilityHeaders())); return withContext(contextValue -> { contextValue = context == null ? contextValue : context; return contentsInternal .recordingWithResponseAsync( request, - options.getRepeatabilityHeaders().getRepeatabilityRequestId(), - options.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat(), + options.getRepeatabilityHeaders() != null ? options.getRepeatabilityHeaders().getRepeatabilityRequestId() : null, + options.getRepeatabilityHeaders() != null ? options.getRepeatabilityHeaders().getRepeatabilityFirstSentInHttpDateFormat() : null, contextValue) .onErrorMap(HttpResponseException.class, ErrorConstructorProxy::create) .map(response -> @@ -577,4 +572,15 @@ private URL getUrlToSignRequestWith(String endpoint) { throw logger.logExceptionAsError(new IllegalArgumentException(ex)); } } + + //region helper functions + /*** + * Make sure repeatability headers of the request are correctly set. + * + * @return a verified RepeatabilityHeaders object. + */ + private RepeatabilityHeaders handleApiIdempotency(RepeatabilityHeaders repeatabilityHeaders) { + return CallAutomationAsyncClient.handleApiIdempotency(repeatabilityHeaders); + } + //endregion } diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AddParticipantsOptions.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AddParticipantsOptions.java index 445e27d0dca6..cd43cdbddae8 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AddParticipantsOptions.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AddParticipantsOptions.java @@ -9,7 +9,9 @@ import com.azure.core.annotation.Fluent; import java.time.Duration; +import java.time.Instant; import java.util.List; +import java.util.UUID; /** * The options for adding participants. @@ -50,6 +52,7 @@ public final class AddParticipantsOptions { */ public AddParticipantsOptions(List participants) { this.participants = participants; + this.repeatabilityHeaders = new RepeatabilityHeaders(UUID.fromString("0-0-0-0-0"), Instant.MIN); } /** diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AnswerCallOptions.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AnswerCallOptions.java index 51b771ab826e..5391a8b08441 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AnswerCallOptions.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/AnswerCallOptions.java @@ -5,6 +5,9 @@ import com.azure.core.annotation.Fluent; +import java.time.Instant; +import java.util.UUID; + /** * The options for creating a call. */ @@ -39,6 +42,7 @@ public class AnswerCallOptions { public AnswerCallOptions(String incomingCallContext, String callbackUrl) { this.incomingCallContext = incomingCallContext; this.callbackUrl = callbackUrl; + this.repeatabilityHeaders = new RepeatabilityHeaders(UUID.fromString("0-0-0-0-0"), Instant.MIN); } /** diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/CreateCallOptions.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/CreateCallOptions.java index 08b56230c278..113f330ee7a4 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/CreateCallOptions.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/CreateCallOptions.java @@ -6,7 +6,9 @@ import com.azure.communication.common.CommunicationIdentifier; import com.azure.core.annotation.Fluent; +import java.time.Instant; import java.util.List; +import java.util.UUID; /** * The options for creating a call. @@ -60,6 +62,7 @@ public CreateCallOptions(CommunicationIdentifier source, List participants) { this.participants = participants; + this.repeatabilityHeaders = new RepeatabilityHeaders(UUID.fromString("0-0-0-0-0"), Instant.MIN); } /** diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/RepeatabilityHeaders.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/RepeatabilityHeaders.java index 232d36f69b76..c5f47e807534 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/RepeatabilityHeaders.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/RepeatabilityHeaders.java @@ -7,7 +7,6 @@ import java.time.Instant; import java.time.ZoneId; -import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.UUID; @@ -26,7 +25,7 @@ public final class RepeatabilityHeaders { /** * The value should be the date and time at which the request was first created. */ - private final ZonedDateTime repeatabilityFirstSent; + private final Instant repeatabilityFirstSent; /** * Constructor @@ -37,7 +36,7 @@ public final class RepeatabilityHeaders { */ public RepeatabilityHeaders(UUID repeatabilityRequestId, Instant repeatabilityFirstSent) { this.repeatabilityRequestId = repeatabilityRequestId; - this.repeatabilityFirstSent = repeatabilityFirstSent.atZone(ZoneId.of("UTC")); + this.repeatabilityFirstSent = repeatabilityFirstSent; } /** @@ -55,14 +54,14 @@ public UUID getRepeatabilityRequestId() { */ public String getRepeatabilityFirstSentInHttpDateFormat() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH).withZone(ZoneId.of("GMT")); - return repeatabilityFirstSent.format(formatter); + return repeatabilityFirstSent.atZone(ZoneId.of("UTC")).format(formatter); } /** * Get the repeatabilityFirstSent : The value should be the date and time at which the request was first created. * @return the repeatabilityFirstSent. */ - public ZonedDateTime getRepeatabilityFirstSent() { + public Instant getRepeatabilityFirstSent() { return repeatabilityFirstSent; } } diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/StartRecordingOptions.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/StartRecordingOptions.java index dea9c089213f..9ef7f107bb67 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/StartRecordingOptions.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/StartRecordingOptions.java @@ -6,8 +6,10 @@ import com.azure.communication.common.CommunicationIdentifier; import com.azure.core.annotation.Fluent; +import java.time.Instant; import java.util.List; import java.util.Objects; +import java.util.UUID; /** * The options for creating a call. @@ -38,8 +40,8 @@ public class StartRecordingOptions { */ public StartRecordingOptions(CallLocator callLocator) { Objects.requireNonNull(callLocator, "'callLocator' cannot be null."); - this.callLocator = callLocator; + this.repeatabilityHeaders = new RepeatabilityHeaders(UUID.fromString("0-0-0-0-0"), Instant.MIN); } /** diff --git a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/TransferToParticipantCallOptions.java b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/TransferToParticipantCallOptions.java index abfd5fb1d5ae..49e3a182bb09 100644 --- a/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/TransferToParticipantCallOptions.java +++ b/sdk/communication/azure-communication-callautomation/src/main/java/com/azure/communication/callautomation/models/TransferToParticipantCallOptions.java @@ -7,6 +7,9 @@ import com.azure.communication.common.PhoneNumberIdentifier; import com.azure.core.annotation.Fluent; +import java.time.Instant; +import java.util.UUID; + /** * The options for adding participants. */ @@ -44,6 +47,7 @@ public class TransferToParticipantCallOptions { */ public TransferToParticipantCallOptions(CommunicationIdentifier targetParticipant) { this.targetParticipant = targetParticipant; + this.repeatabilityHeaders = new RepeatabilityHeaders(UUID.fromString("0-0-0-0-0"), Instant.MIN); } /** diff --git a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallAutomationAsyncClientAutomatedLiveTests.java b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallAutomationAsyncClientAutomatedLiveTests.java index 40c561f88d58..999b87a2896a 100644 --- a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallAutomationAsyncClientAutomatedLiveTests.java +++ b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallAutomationAsyncClientAutomatedLiveTests.java @@ -3,10 +3,11 @@ package com.azure.communication.callautomation; +import com.azure.communication.callautomation.models.AnswerCallOptions; import com.azure.communication.callautomation.models.AnswerCallResult; import com.azure.communication.callautomation.models.CreateCallOptions; import com.azure.communication.callautomation.models.CreateCallResult; -import com.azure.communication.callautomation.models.RepeatabilityHeaders; +import com.azure.communication.callautomation.models.HangUpOptions; import com.azure.communication.callautomation.models.events.CallConnected; import com.azure.communication.callautomation.models.events.CallDisconnected; import com.azure.communication.callautomation.models.events.ParticipantsUpdated; @@ -22,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; @@ -61,12 +63,8 @@ public void createVOIPCallAndAnswerThenHangupAutomatedTest(HttpClient httpClient // create a call List targets = new ArrayList<>(Collections.singletonList(target)); CreateCallOptions createCallOptions = new CreateCallOptions(caller, targets, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)); + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); Response createCallResultResponse = callAsyncClient.createCallWithResponse(createCallOptions).block(); - RepeatabilityHeaders repeatabilityHeaders = createCallOptions.getRepeatabilityHeaders(); - assertNotNull(repeatabilityHeaders); - assertNotNull(repeatabilityHeaders.getRepeatabilityRequestId()); - assertNotNull(repeatabilityHeaders.getRepeatabilityFirstSent()); assertNotNull(createCallResultResponse); CreateCallResult createCallResult = createCallResultResponse.getValue(); @@ -80,8 +78,9 @@ public void createVOIPCallAndAnswerThenHangupAutomatedTest(HttpClient httpClient assertNotNull(incomingCallContext); // answer the call - AnswerCallResult answerCallResult = callAsyncClient.answerCall(incomingCallContext, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).block(); + AnswerCallOptions answerCallOptions = new AnswerCallOptions(incomingCallContext, + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); + AnswerCallResult answerCallResult = Objects.requireNonNull(callAsyncClient.answerCallWithResponse(answerCallOptions).block()).getValue(); assertNotNull(answerCallResult); assertNotNull(answerCallResult.getCallConnectionAsync()); assertNotNull(answerCallResult.getCallConnectionProperties()); @@ -114,7 +113,7 @@ public void createVOIPCallAndAnswerThenHangupAutomatedTest(HttpClient httpClient } finally { if (!callDestructors.isEmpty()) { try { - callDestructors.forEach(callConnection -> callConnection.hangUp(true).block()); + callDestructors.forEach(callConnection -> callConnection.hangUpWithResponse(new HangUpOptions(true).setRepeatabilityHeaders(null)).block()); } catch (Exception ignored) { // Some call might have been terminated during the test, and it will cause exceptions here. // Do nothing and iterate to next call connection. diff --git a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallConnectionAsyncAutomatedLiveTests.java b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallConnectionAsyncAutomatedLiveTests.java index 7867585c5205..c17c541986cd 100644 --- a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallConnectionAsyncAutomatedLiveTests.java +++ b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallConnectionAsyncAutomatedLiveTests.java @@ -5,9 +5,11 @@ import com.azure.communication.callautomation.models.AddParticipantsOptions; import com.azure.communication.callautomation.models.AddParticipantsResult; +import com.azure.communication.callautomation.models.AnswerCallOptions; import com.azure.communication.callautomation.models.AnswerCallResult; import com.azure.communication.callautomation.models.CreateCallOptions; import com.azure.communication.callautomation.models.CreateCallResult; +import com.azure.communication.callautomation.models.HangUpOptions; import com.azure.communication.callautomation.models.ListParticipantsResult; import com.azure.communication.callautomation.models.RemoveParticipantsResult; import com.azure.communication.callautomation.models.RepeatabilityHeaders; @@ -24,6 +26,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -67,7 +70,7 @@ public void createVOIPCallAndAnswerThenAddParticipantFinallyRemoveParticipantAut // create a call List targets = new ArrayList<>(Arrays.asList(receiver)); CreateCallOptions createCallOptions = new CreateCallOptions(caller, targets, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)); + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); Response createCallResultResponse = callAsyncClient.createCallWithResponse(createCallOptions).block(); assertNotNull(createCallResultResponse); CreateCallResult createCallResult = createCallResultResponse.getValue(); @@ -81,8 +84,9 @@ public void createVOIPCallAndAnswerThenAddParticipantFinallyRemoveParticipantAut assertNotNull(incomingCallContext); // answer the call - AnswerCallResult answerCallResult = callAsyncClient.answerCall(incomingCallContext, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).block(); + AnswerCallOptions answerCallOptions = new AnswerCallOptions(incomingCallContext, + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); + AnswerCallResult answerCallResult = Objects.requireNonNull(callAsyncClient.answerCallWithResponse(answerCallOptions).block()).getValue(); assertNotNull(answerCallResult); assertNotNull(answerCallResult.getCallConnectionAsync()); assertNotNull(answerCallResult.getCallConnectionProperties()); @@ -112,8 +116,9 @@ public void createVOIPCallAndAnswerThenAddParticipantFinallyRemoveParticipantAut assertNotNull(anotherIncomingCallContext); // answer the call - AnswerCallResult anotherAnswerCallResult = callAsyncClient.answerCall(anotherIncomingCallContext, - DISPATCHER_CALLBACK + String.format("?q=%s", anotherUniqueId)).block(); + answerCallOptions = new AnswerCallOptions(anotherIncomingCallContext, + DISPATCHER_CALLBACK + String.format("?q=%s", anotherUniqueId)).setRepeatabilityHeaders(null); + AnswerCallResult anotherAnswerCallResult = Objects.requireNonNull(callAsyncClient.answerCallWithResponse(answerCallOptions).block()).getValue(); assertNotNull(anotherAnswerCallResult); assertNotNull(anotherAnswerCallResult.getCallConnectionAsync()); assertNotNull(anotherAnswerCallResult.getCallConnectionProperties()); @@ -148,7 +153,7 @@ public void createVOIPCallAndAnswerThenAddParticipantFinallyRemoveParticipantAut } finally { if (!callDestructors.isEmpty()) { try { - callDestructors.forEach(callConnection -> callConnection.hangUp(true).block()); + callDestructors.forEach(callConnection -> callConnection.hangUpWithResponse(new HangUpOptions(true).setRepeatabilityHeaders(null)).block()); } catch (Exception ignored) { // Some call might have been terminated during the test, and it will cause exceptions here. // Do nothing and iterate to next call connection. diff --git a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallMediaAsyncAutomatedLiveTests.java b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallMediaAsyncAutomatedLiveTests.java index d7d37707ad7f..070134a6b6e3 100644 --- a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallMediaAsyncAutomatedLiveTests.java +++ b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallMediaAsyncAutomatedLiveTests.java @@ -3,10 +3,12 @@ package com.azure.communication.callautomation; +import com.azure.communication.callautomation.models.AnswerCallOptions; import com.azure.communication.callautomation.models.AnswerCallResult; import com.azure.communication.callautomation.models.CreateCallOptions; import com.azure.communication.callautomation.models.CreateCallResult; import com.azure.communication.callautomation.models.FileSource; +import com.azure.communication.callautomation.models.HangUpOptions; import com.azure.communication.callautomation.models.events.CallConnected; import com.azure.communication.callautomation.models.events.PlayCompleted; import com.azure.communication.common.CommunicationIdentifier; @@ -21,6 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; @@ -60,7 +63,7 @@ public void playMediaInACallAutomatedTest(HttpClient httpClient) { // create a call List targets = new ArrayList<>(Arrays.asList(receiver)); CreateCallOptions createCallOptions = new CreateCallOptions(caller, targets, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)); + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); Response createCallResultResponse = callAsyncClient.createCallWithResponse(createCallOptions).block(); assertNotNull(createCallResultResponse); CreateCallResult createCallResult = createCallResultResponse.getValue(); @@ -74,8 +77,9 @@ public void playMediaInACallAutomatedTest(HttpClient httpClient) { assertNotNull(incomingCallContext); // answer the call - AnswerCallResult answerCallResult = callAsyncClient.answerCall(incomingCallContext, - DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).block(); + AnswerCallOptions answerCallOptions = new AnswerCallOptions(incomingCallContext, + DISPATCHER_CALLBACK + String.format("?q=%s", uniqueId)).setRepeatabilityHeaders(null); + AnswerCallResult answerCallResult = Objects.requireNonNull(callAsyncClient.answerCallWithResponse(answerCallOptions).block()).getValue(); assertNotNull(answerCallResult); assertNotNull(answerCallResult.getCallConnectionAsync()); assertNotNull(answerCallResult.getCallConnectionProperties()); @@ -96,7 +100,7 @@ public void playMediaInACallAutomatedTest(HttpClient httpClient) { } finally { if (!callDestructors.isEmpty()) { try { - callDestructors.forEach(callConnection -> callConnection.hangUp(true).block()); + callDestructors.forEach(callConnection -> callConnection.hangUpWithResponse(new HangUpOptions(true).setRepeatabilityHeaders(null)).block()); } catch (Exception ignored) { // Some call might have been terminated during the test, and it will cause exceptions here. // Do nothing and iterate to next call connection. diff --git a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallRecordingAutomatedLiveTests.java b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallRecordingAutomatedLiveTests.java index 434b20b9704e..e0293050bfbb 100644 --- a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallRecordingAutomatedLiveTests.java +++ b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/CallRecordingAutomatedLiveTests.java @@ -3,10 +3,13 @@ package com.azure.communication.callautomation; +import com.azure.communication.callautomation.models.AnswerCallOptions; import com.azure.communication.callautomation.models.AnswerCallResult; import com.azure.communication.callautomation.models.CallConnectionProperties; import com.azure.communication.callautomation.models.CallConnectionState; +import com.azure.communication.callautomation.models.CreateCallOptions; import com.azure.communication.callautomation.models.CreateCallResult; +import com.azure.communication.callautomation.models.HangUpOptions; import com.azure.communication.callautomation.models.RecordingChannel; import com.azure.communication.callautomation.models.RecordingContent; import com.azure.communication.callautomation.models.RecordingFormat; @@ -59,9 +62,9 @@ public void createACSCallAndUnmixedAudioTest(HttpClient httpClient) { String uniqueId = serviceBusWithNewCall(source, target); // create call and assert response - CreateCallResult createCallResult = client.createCall( - source, Arrays.asList(target), String.format("%s?q=%s", DISPATCHER_CALLBACK, uniqueId) - ); + CreateCallOptions createCallOptions = new CreateCallOptions(source, Arrays.asList(target), String.format("%s?q=%s", DISPATCHER_CALLBACK, uniqueId)) + .setRepeatabilityHeaders(null); + CreateCallResult createCallResult = client.createCallWithResponse(createCallOptions, null).getValue(); callConnectionId = createCallResult.getCallConnectionProperties().getCallConnectionId(); assertNotNull(callConnectionId); @@ -70,7 +73,9 @@ public void createACSCallAndUnmixedAudioTest(HttpClient httpClient) { assertNotNull(incomingCallContext); // answer the call - AnswerCallResult answerCallResult = client.answerCall(incomingCallContext, DISPATCHER_CALLBACK); + AnswerCallOptions answerCallOptions = new AnswerCallOptions(incomingCallContext, DISPATCHER_CALLBACK) + .setRepeatabilityHeaders(null); + AnswerCallResult answerCallResult = client.answerCallWithResponse(answerCallOptions, null).getValue(); assertNotNull(answerCallResult); // wait for callConnected @@ -88,6 +93,7 @@ public void createACSCallAndUnmixedAudioTest(HttpClient httpClient) { .setRecordingContent(RecordingContent.AUDIO) .setRecordingFormat(RecordingFormat.WAV) .setRecordingStateCallbackUrl(DISPATCHER_CALLBACK) + .setRepeatabilityHeaders(null) ); assertNotNull(recordingStateResult.getRecordingId()); @@ -136,9 +142,9 @@ public void createACSCallUnmixedAudioAffinityTest(HttpClient httpClient) { String uniqueId = serviceBusWithNewCall(source, target); // create call and assert response - CreateCallResult createCallResult = client.createCall( - source, Arrays.asList(target), String.format("%s?q=%s", DISPATCHER_CALLBACK, uniqueId) - ); + CreateCallOptions createCallOptions = new CreateCallOptions(source, Arrays.asList(target), String.format("%s?q=%s", DISPATCHER_CALLBACK, uniqueId)) + .setRepeatabilityHeaders(null); + CreateCallResult createCallResult = client.createCallWithResponse(createCallOptions, null).getValue(); callConnectionId = createCallResult.getCallConnectionProperties().getCallConnectionId(); assertNotNull(callConnectionId); @@ -147,7 +153,9 @@ public void createACSCallUnmixedAudioAffinityTest(HttpClient httpClient) { assertNotNull(incomingCallContext); // answer the call - AnswerCallResult answerCallResult = client.answerCall(incomingCallContext, DISPATCHER_CALLBACK); + AnswerCallOptions answerCallOptions = new AnswerCallOptions(incomingCallContext, DISPATCHER_CALLBACK) + .setRepeatabilityHeaders(null); + AnswerCallResult answerCallResult = client.answerCallWithResponse(answerCallOptions, null).getValue(); assertNotNull(answerCallResult); // wait for callConnected @@ -171,6 +179,7 @@ public void createACSCallUnmixedAudioAffinityTest(HttpClient httpClient) { add(target); } }) + .setRepeatabilityHeaders(null) ); assertNotNull(recordingStateResult.getRecordingId()); @@ -181,7 +190,7 @@ public void createACSCallUnmixedAudioAffinityTest(HttpClient httpClient) { // hangup if (!callConnectionId.isEmpty()) { CallConnection callConnection = client.getCallConnection(callConnectionId); - callConnection.hangUp(true); + callConnection.hangUpWithResponse(new HangUpOptions(true).setRepeatabilityHeaders(null), null); CallDisconnected callDisconnectedEvent = waitForEvent(CallDisconnected.class, callConnectionId, Duration.ofSeconds(10)); assertNotNull(callDisconnectedEvent); } diff --git a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/RepeatabilityHeadersUnitTests.java b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/RepeatabilityHeadersUnitTests.java index 097dcb4432cd..a6f2b13ee49e 100644 --- a/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/RepeatabilityHeadersUnitTests.java +++ b/sdk/communication/azure-communication-callautomation/src/test/java/com/azure/communication/callautomation/RepeatabilityHeadersUnitTests.java @@ -3,6 +3,7 @@ package com.azure.communication.callautomation; +import com.azure.communication.callautomation.models.HangUpOptions; import com.azure.communication.callautomation.models.RepeatabilityHeaders; import org.junit.jupiter.api.Test; @@ -11,6 +12,9 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; public class RepeatabilityHeadersUnitTests { @@ -28,4 +32,28 @@ public void repeatabilityHeadersDateValidation() { assertThrows(DateTimeException.class, () -> new RepeatabilityHeaders(UUID.randomUUID(), Instant.MAX.plusSeconds(1))); assertThrows(DateTimeException.class, () -> new RepeatabilityHeaders(UUID.randomUUID(), Instant.MIN.minusSeconds(1))); } + + @Test + public void handleApiIdempotencyHelperFunctionUnitTest() { + HangUpOptions hangUpOptions = new HangUpOptions(true); + + // Case 1: default repeatability headers, it should be altered by handleApiIdempotency. + RepeatabilityHeaders headers = CallAutomationAsyncClient.handleApiIdempotency(hangUpOptions.getRepeatabilityHeaders()); + assertNotEquals(UUID.fromString("0-0-0-0-0"), headers.getRepeatabilityRequestId()); + assertNotEquals(Instant.MIN, headers.getRepeatabilityFirstSent()); + + // Case 2: user defined repeatability headers, it should not be altered by handleApiIdempotency. + UUID uuid = UUID.randomUUID(); + Instant instant = Instant.now(); + hangUpOptions.setRepeatabilityHeaders(new RepeatabilityHeaders(uuid, instant)); + headers = CallAutomationAsyncClient.handleApiIdempotency(hangUpOptions.getRepeatabilityHeaders()); + assertEquals(uuid, headers.getRepeatabilityRequestId()); + assertEquals(instant, headers.getRepeatabilityFirstSent()); + + // Case 3: user disabled repeatability headers. + hangUpOptions = new HangUpOptions(true); + hangUpOptions.setRepeatabilityHeaders(null); + headers = CallAutomationAsyncClient.handleApiIdempotency(hangUpOptions.getRepeatabilityHeaders()); + assertNull(headers); + } } diff --git a/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/FakeCredentialInTest.java b/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/FakeCredentialInTest.java new file mode 100644 index 000000000000..ea176b10edd3 --- /dev/null +++ b/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/FakeCredentialInTest.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.communication.common.perf; + +/** + * Fake credential list. + */ +public final class FakeCredentialInTest { + /** + * Fake Azure Key Credential for mocking. + */ + public static final String MOCK_KEY_PLACEHOLDER = + "JdppJP5eH1w/CQ0cx4RGYWoC7NmQ0nmDbYR2PYWSDTXojV9bI1ck0Eh0sUIg8xj4KYj7tv+ZPLICu3BgLt6mMz=="; +} diff --git a/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/HmacAuthenticationPolicyTest.java b/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/HmacAuthenticationPolicyTest.java index c55c4fbfe25d..8c556082df33 100644 --- a/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/HmacAuthenticationPolicyTest.java +++ b/sdk/communication/azure-communication-common-perf/src/main/java/com.azure.communication.common.perf/HmacAuthenticationPolicyTest.java @@ -10,6 +10,9 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.ConcurrentHashMap; + +import static com.azure.communication.common.perf.FakeCredentialInTest.MOCK_KEY_PLACEHOLDER; + /** * HmacAuthenticationPolicyTest is designed to verify the correctness of the calculation * of the request signature header in the HmacAuthenticationPolicy in a race condition. @@ -21,9 +24,7 @@ public class HmacAuthenticationPolicyTest extends PerfStressTest { private final static ConcurrentHashMap dateToSignature = new ConcurrentHashMap<>(); - // Do not change this otherwise CredScan will flag this. - private final static String mockedKey = "JdppJP5eH1w/CQ0cx4RGYWoC7NmQ0nmDbYR2PYWSDTXojV9bI1ck0Eh0sUIg8xj4KYj7tv+ZPLICu3BgLt6mMz=="; - private final static HmacAuthenticationPolicy hmacAuthenticationPolicy = new HmacAuthenticationPolicy(new AzureKeyCredential(mockedKey)); + private final static HmacAuthenticationPolicy hmacAuthenticationPolicy = new HmacAuthenticationPolicy(new AzureKeyCredential(MOCK_KEY_PLACEHOLDER)); private final HttpPipeline pipeline; private final HttpRequest request; diff --git a/sdk/communication/azure-communication-identity/src/test/java/com/azure/communication/identity/CteTestHelper.java b/sdk/communication/azure-communication-identity/src/test/java/com/azure/communication/identity/CteTestHelper.java index cd88f4fbb596..667ef59e50d6 100644 --- a/sdk/communication/azure-communication-identity/src/test/java/com/azure/communication/identity/CteTestHelper.java +++ b/sdk/communication/azure-communication-identity/src/test/java/com/azure/communication/identity/CteTestHelper.java @@ -35,9 +35,9 @@ public class CteTestHelper { private static final String COMMUNICATION_M365_REDIRECT_URI = Configuration.getGlobalConfiguration() .get("COMMUNICATION_M365_REDIRECT_URI", "Sanitized"); private static final String COMMUNICATION_MSAL_USERNAME = Configuration.getGlobalConfiguration() - .get("COMMUNICATION_MSAL_USERNAME", "Sanitized"); + .get("COMMUNICATION_MSAL_USERNAME", "fakeUsernamePlaceholder"); private static final String COMMUNICATION_MSAL_PASSWORD = Configuration.getGlobalConfiguration() - .get("COMMUNICATION_MSAL_PASSWORD", "Sanitized"); + .get("COMMUNICATION_MSAL_PASSWORD", "fakePasswordPlaceholder"); private static final String COMMUNICATION_EXPIRED_TEAMS_TOKEN = Configuration.getGlobalConfiguration() .get("COMMUNICATION_EXPIRED_TEAMS_TOKEN", "Sanitized"); private static final String COMMUNICATION_SKIP_INT_IDENTITY_EXCHANGE_TOKEN_TEST = Configuration.getGlobalConfiguration() diff --git a/sdk/core/azure-core-amqp/CHANGELOG.md b/sdk/core/azure-core-amqp/CHANGELOG.md index 7222af642092..317c8be2faa8 100644 --- a/sdk/core/azure-core-amqp/CHANGELOG.md +++ b/sdk/core/azure-core-amqp/CHANGELOG.md @@ -8,6 +8,9 @@ ### Bugs Fixed +- Updating the host value for the Websocket upgrade request to match with the HTTP host ([31825](https://github.com/Azure/azure-sdk-for-java/issues/31825)) +- Enabling HTTP Proxy for custom endpoint and updating Proxy CONNECT request to use the actual front-end host ([31826](https://github.com/Azure/azure-sdk-for-java/issues/31826)) + ### Other Changes ## 2.7.2 (2022-10-07) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/AmqpMetricsProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/AmqpMetricsProvider.java index 83a395728e1a..81343230340a 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/AmqpMetricsProvider.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/AmqpMetricsProvider.java @@ -146,6 +146,14 @@ public boolean isSendDeliveryEnabled() { return isEnabled && sendDuration.isEnabled(); } + /** + * Checks if request-response duration metric is enabled (for micro-optimizations). + */ + public boolean isRequestResponseDurationEnabled() { + return isEnabled && sendDuration.isEnabled(); + } + + /** * Checks if prefetched sequence number is enabled (for micro-optimizations). */ diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/ReactorHandlerProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/ReactorHandlerProvider.java index 31a659a20884..3cbebb3d5df5 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/ReactorHandlerProvider.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/ReactorHandlerProvider.java @@ -92,14 +92,6 @@ public ConnectionHandler createConnectionHandler(String connectionId, Connection final boolean isSystemProxyConfigured = WebSocketsProxyConnectionHandler.shouldUseProxy( options.getFullyQualifiedNamespace(), options.getPort()); - // TODO (conniey): See if we this is supported later on. - if (isCustomEndpointConfigured && (isUserProxyConfigured || isSystemProxyConfigured)) { - throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format( - "Unable to proxy connection to custom endpoint. Custom endpoint: %s. Proxy settings: %s. " - + "Namespace: %s", options.getHostname(), options.getProxyOptions().getProxyAddress(), - options.getFullyQualifiedNamespace()))); - } - if (isUserProxyConfigured) { LOGGER.info("Using user configured proxy to connect to: '{}:{}'. Proxy: {}", options.getFullyQualifiedNamespace(), options.getPort(), options.getProxyOptions().getProxyAddress()); diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/RequestResponseChannel.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/RequestResponseChannel.java index ca062ec23ce8..830e691c525b 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/RequestResponseChannel.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/RequestResponseChannel.java @@ -504,7 +504,7 @@ private void terminateUnconfirmedSends(Throwable error) { * Captures current time in mono context - used to report send metric */ private Mono captureStartTime(Message toSend, Mono publisher) { - if (metricsProvider.isSendDeliveryEnabled()) { + if (metricsProvider.isRequestResponseDurationEnabled()) { String operationName = "unknown"; if (toSend != null && toSend.getApplicationProperties() != null && toSend.getApplicationProperties().getValue() != null) { Map properties = toSend.getApplicationProperties().getValue(); @@ -532,7 +532,7 @@ private static ContextView getSinkContext(MonoSink sink) { * Records send call duration metric. **/ private void recordDelivery(ContextView context, Message response) { - if (metricsProvider.isSendDeliveryEnabled()) { + if (metricsProvider.isRequestResponseDurationEnabled()) { Object startTimestamp = context.getOrDefault(START_SEND_TIME_CONTEXT_KEY, null); Object operationName = context.getOrDefault(OPERATION_CONTEXT_KEY, null); AmqpResponseCode responseCode = response == null ? null : RequestResponseUtils.getStatusCode(response); diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java index d697d3f08351..18ef80818900 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java @@ -11,6 +11,10 @@ import java.util.Objects; +@Deprecated +/** + * @deprecated use EventHubs*Tracer and ServiceBus*Tracer instead. + */ public class TracerProvider { private static final ClientLogger LOGGER = new ClientLogger(TracerProvider.class); private Tracer tracer; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandler.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandler.java index f26271aaed8c..ef111dcd5a67 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandler.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandler.java @@ -24,6 +24,16 @@ public class WebSocketsConnectionHandler extends ConnectionHandler { private static final String SOCKET_PATH = "/$servicebus/websocket"; private static final String PROTOCOL = "AMQPWSB10"; + /** + * Once there is an HTTP Connection to the host addressable by https://hostname + * (connection the client 'directly' established or established by tunneling through + * Proxy etc..), the WebSocket layer has to send an Upgrade request (GET https://hostname) + * with upgrade-specific headers to switch from HTTP to WebSocket protocol. + * The hostname is the FQDN of the Event Hubs or Service Bus or host part of + * CustomEndpointAddress when a custom endpoint frontends the Event Hubs or Service Bus. + * The upgrade request will have an HTTP 'Host' header with value as hostname. + */ + private final String hostname; /** * Creates a handler that handles proton-j's connection events using web sockets. @@ -31,9 +41,9 @@ public class WebSocketsConnectionHandler extends ConnectionHandler { * @param connectionId Identifier for this connection. * @param connectionOptions Options used when creating the connection. */ - public WebSocketsConnectionHandler(String connectionId, ConnectionOptions connectionOptions, - SslPeerDetails peerDetails, AmqpMetricsProvider metricsProvider) { + public WebSocketsConnectionHandler(String connectionId, ConnectionOptions connectionOptions, SslPeerDetails peerDetails, AmqpMetricsProvider metricsProvider) { super(connectionId, connectionOptions, peerDetails, metricsProvider); + this.hostname = connectionOptions.getHostname(); } /** @@ -44,11 +54,10 @@ public WebSocketsConnectionHandler(String connectionId, ConnectionOptions connec */ @Override protected void addTransportLayers(final Event event, final TransportInternal transport) { - final String hostName = event.getConnection().getHostname(); logger.info("Adding web socket layer"); final WebSocketImpl webSocket = new WebSocketImpl(); webSocket.configure( - hostName, + hostname, SOCKET_PATH, "", 0, @@ -59,7 +68,7 @@ protected void addTransportLayers(final Event event, final TransportInternal tra transport.addTransportLayer(webSocket); logger.atVerbose() - .addKeyValue(HOSTNAME_KEY, hostName) + .addKeyValue(HOSTNAME_KEY, hostname) .log("Adding web sockets transport layer."); super.addTransportLayers(event, transport); diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandler.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandler.java index 8a0dcd27096e..9b6709a0d942 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandler.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandler.java @@ -39,10 +39,23 @@ public class WebSocketsProxyConnectionHandler extends WebSocketsConnectionHandler { private static final String HTTPS_URI_FORMAT = "https://%s:%s"; - private final InetSocketAddress connectionHostname; + private final InetSocketAddress proxyHostAddress; private final ProxyOptions proxyOptions; private final String fullyQualifiedNamespace; - private final String amqpBrokerHostname; + /** + * The value of 'hostname:port' field for the 'HTTP CONNECT hostname:port HTTP/1.1' + * request to the Proxy. + * e.g. + * CONNECT <eventubs-namespace>.servicebus.windows.net:443 HTTP/1.1
+ * CONNECT order-events.contoso.com:443 HTTP/1.1
+ * CONNECT shipping-events.contoso.com:200 HTTP/1.1
+ * + * The 'hostname' addresses the target host to which the HTTP Proxy server should forward + * the connection. It is usually the FQDN of the Event Hubs or Service Bus, or the host + * part of CustomEndpointAddress when a custom endpoint frontends the Event Hubs + * or Service Bus. + */ + private final String connectHostnameAndPort; /** * Creates a handler that handles proton-j's connection through a proxy using web sockets. @@ -61,9 +74,10 @@ public WebSocketsProxyConnectionHandler(String connectionId, ConnectionOptions c this.proxyOptions = Objects.requireNonNull(proxyOptions, "'proxyConfiguration' cannot be null."); this.fullyQualifiedNamespace = connectionOptions.getFullyQualifiedNamespace(); - this.amqpBrokerHostname = connectionOptions.getFullyQualifiedNamespace() + ":" + connectionOptions.getPort(); + this.connectHostnameAndPort = connectionOptions.getHostname() + ":" + connectionOptions.getPort(); + if (proxyOptions.isProxyAddressConfigured()) { - this.connectionHostname = (InetSocketAddress) proxyOptions.getProxyAddress().address(); + this.proxyHostAddress = (InetSocketAddress) proxyOptions.getProxyAddress().address(); } else { final URI serviceUri = createURI(connectionOptions.getHostname(), connectionOptions.getPort()); final ProxySelector proxySelector = ProxySelector.getDefault(); @@ -80,7 +94,7 @@ public WebSocketsProxyConnectionHandler(String connectionId, ConnectionOptions c } final Proxy proxy = proxies.get(0); - this.connectionHostname = (InetSocketAddress) proxy.address(); + this.proxyHostAddress = (InetSocketAddress) proxy.address(); } } @@ -112,7 +126,7 @@ public static boolean shouldUseProxy(final String hostname, final int port) { */ @Override public String getHostname() { - return connectionHostname.getHostString(); + return proxyHostAddress.getHostString(); } /** @@ -122,7 +136,7 @@ public String getHostname() { */ @Override public int getProtocolPort() { - return connectionHostname.getPort(); + return proxyHostAddress.getPort(); } @Override @@ -192,15 +206,13 @@ protected void addTransportLayers(final Event event, final TransportInternal tra ? new ProxyImpl(getProtonConfiguration()) : new ProxyImpl(); - // host name used to create proxy connect request must contain a port number. - // after creating the socket to proxy final ProxyHandler proxyHandler = new ProxyHandlerImpl(); - proxy.configure(amqpBrokerHostname, null, proxyHandler, transport); + proxy.configure(connectHostnameAndPort, null, proxyHandler, transport); transport.addTransportLayer(proxy); logger.atInfo() - .addKeyValue(HOSTNAME_KEY, amqpBrokerHostname) + .addKeyValue(HOSTNAME_KEY, connectHostnameAndPort) .log("addProxyHandshake"); } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/CbsAuthorizationType.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/CbsAuthorizationType.java index 7e6828f43e53..f1c6f2d4d80e 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/CbsAuthorizationType.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/CbsAuthorizationType.java @@ -10,6 +10,18 @@ * An enumeration of supported authorization methods with the {@link ClaimsBasedSecurityNode}. */ public final class CbsAuthorizationType extends ExpandableStringEnum { + /** + * Creates a new instance of {@link CbsAuthorizationType} without a {@link #toString()} value. + *

+ * This constructor shouldn't be called as it will produce a {@link CbsAuthorizationType} which doesn't have a + * String enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String, Class)} factory method. + */ + @Deprecated + public CbsAuthorizationType() { + } + /** * Authorize with CBS through a shared access signature. */ @@ -18,7 +30,7 @@ public final class CbsAuthorizationType extends ExpandableStringEnum * This is used in the case where Azure Active Directory is used for authentication and the authenticated user * wants to authorize with Azure Event Hubs. */ diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/DeliveryState.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/DeliveryState.java index 8b2933701eeb..9f7567812b04 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/DeliveryState.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/DeliveryState.java @@ -41,6 +41,18 @@ public final class DeliveryState extends ExpandableStringEnum { */ public static final DeliveryState TRANSACTIONAL = fromString("TRANSACTIONAL", DeliveryState.class); + /** + * Creates a new instance of {@link DeliveryState} without a {@link #toString()} value. + *

+ * This constructor shouldn't be called as it will produce a {@link DeliveryState} which doesn't have a String + * enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String, Class)} factory method. + */ + @Deprecated + public DeliveryState() { + } + /** * Gets the corresponding delivery state from its string representation. * diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java index bf3c6882553d..bf83b1ac227e 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@SuppressWarnings("deprecation") public class TracerProviderTest { private static final String SERVICE_BASE_NAME = "serviceBaseName"; private static final String METHOD_NAME = SERVICE_BASE_NAME + "send"; diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandlerTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandlerTest.java index dab9a04e460c..0dd519348e05 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandlerTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsConnectionHandlerTest.java @@ -15,6 +15,7 @@ import com.azure.core.test.utils.metrics.TestMeasurement; import com.azure.core.test.utils.metrics.TestMeter; import com.azure.core.util.ClientOptions; +import com.microsoft.azure.proton.transport.ws.impl.WebSocketImpl; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Symbol; import org.apache.qpid.proton.amqp.transport.ErrorCondition; @@ -23,6 +24,7 @@ import org.apache.qpid.proton.engine.Event; import org.apache.qpid.proton.engine.SslDomain; import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.impl.TransportImpl; import org.apache.qpid.proton.engine.impl.TransportInternal; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -31,6 +33,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.MockedConstruction; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import reactor.core.scheduler.Scheduler; @@ -46,7 +49,9 @@ import static com.azure.core.amqp.implementation.handler.WebSocketsConnectionHandler.MAX_FRAME_SIZE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -54,7 +59,7 @@ public class WebSocketsConnectionHandlerTest { private static final ClientOptions CLIENT_OPTIONS = new ClientOptions(); private static final String CONNECTION_ID = "some-random-id"; private static final String HOSTNAME = "hostname-random"; - + private static final String CUSTOM_ENDPOINT_HOSTNAME = "custom-hostname-random"; private static final SslDomain.VerifyMode VERIFY_MODE = SslDomain.VerifyMode.VERIFY_PEER_NAME; private static final String PRODUCT = "my-product"; private static final String CLIENT_VERSION = "1.5.1-alpha"; @@ -224,6 +229,57 @@ AmqpTransportType.AMQP_WEB_SOCKETS, new AmqpRetryOptions(), ProxyOptions.SYSTEM_ } } + @Test + public void websocketConfigureUsesFqdnAsHostname() { + try (MockedConstruction mockConstruction = mockConstruction(WebSocketImpl.class)) { + handler.addTransportLayers(mock(Event.class, Mockito.CALLS_REAL_METHODS), + mock(TransportImpl.class, Mockito.CALLS_REAL_METHODS)); + + final List constructed = mockConstruction.constructed(); + assertEquals(1, constructed.size()); + // The WebSocketImpl object constructed inside addTransportLayer method. + final WebSocketImpl webSocketImpl = constructed.get(0); + final String expectedHostName = HOSTNAME; + verify(webSocketImpl).configure(eq(expectedHostName), + eq("/$servicebus/websocket"), + eq(""), + eq(0), + eq("AMQPWSB10"), + eq(null), + eq(null)); + } + } + + @Test + public void websocketConfigureUsesCustomEndpointHostnameAsHostname() { + final String customEndpointHostname = "order-events.contoso.com"; + final ConnectionOptions connectionOptionsWithCustomEndpoint = new ConnectionOptions(HOSTNAME, tokenCredential, + CbsAuthorizationType.SHARED_ACCESS_SIGNATURE, "scope", AmqpTransportType.AMQP_WEB_SOCKETS, + new AmqpRetryOptions(), ProxyOptions.SYSTEM_DEFAULTS, scheduler, CLIENT_OPTIONS, VERIFY_MODE, PRODUCT, + CLIENT_VERSION, customEndpointHostname, 200); + + try (WebSocketsConnectionHandler handler = new WebSocketsConnectionHandler(CONNECTION_ID, + connectionOptionsWithCustomEndpoint, + peerDetails, AmqpMetricsProvider.noop())) { + try (MockedConstruction mockConstruction = mockConstruction(WebSocketImpl.class)) { + handler.addTransportLayers(mock(Event.class, Mockito.CALLS_REAL_METHODS), + mock(TransportImpl.class, Mockito.CALLS_REAL_METHODS)); + + final List constructed = mockConstruction.constructed(); + assertEquals(1, constructed.size()); + // The WebSocketImpl object constructed inside addTransportLayer method. + final WebSocketImpl webSocketImpl = constructed.get(0); + verify(webSocketImpl).configure(eq(customEndpointHostname), + eq("/$servicebus/websocket"), + eq(""), + eq(0), + eq("AMQPWSB10"), + eq(null), + eq(null)); + } + } + } + @Test void onConnectionCloseMetrics() { // Arrange diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandlerTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandlerTest.java index 3fda65319eab..78cfcb6c197a 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandlerTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/handler/WebSocketsProxyConnectionHandlerTest.java @@ -17,6 +17,7 @@ import com.azure.core.test.utils.metrics.TestMeter; import com.azure.core.util.ClientOptions; import com.azure.core.util.Header; +import com.microsoft.azure.proton.transport.proxy.impl.ProxyImpl; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Symbol; import org.apache.qpid.proton.amqp.transport.ErrorCondition; @@ -25,6 +26,7 @@ import org.apache.qpid.proton.engine.Event; import org.apache.qpid.proton.engine.SslDomain; import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.impl.TransportImpl; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -33,6 +35,7 @@ import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.api.parallel.Isolated; import org.mockito.Mock; +import org.mockito.MockedConstruction; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import reactor.core.scheduler.Scheduler; @@ -47,7 +50,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @@ -57,6 +62,7 @@ public class WebSocketsProxyConnectionHandlerTest { private static final String CONNECTION_ID = "some-connection-id"; private static final String HOSTNAME = "event-hubs.windows.core.net"; + private static final int AMQP_PORT = 5671; private static final InetSocketAddress PROXY_ADDRESS = InetSocketAddress.createUnresolved("foo.proxy.com", 3138); private static final Proxy PROXY = new Proxy(Proxy.Type.HTTP, PROXY_ADDRESS); private static final String USERNAME = "test-user"; @@ -188,6 +194,71 @@ public void proxyConfigurationSelected() { verifyNoInteractions(proxySelector); } + /** + * Verifies that the hostname:port for Proxy CONNECT created from + * the FQDN host field in {@link ConnectionOptions}. + */ + @Test + public void proxyConfigureConnectHostnameAndPortDerivesFromFqdn() { + // Arrange + final InetSocketAddress address = InetSocketAddress.createUnresolved("my-new.proxy.com", 8888); + final Proxy newProxy = new Proxy(Proxy.Type.HTTP, address); + final ProxyOptions proxyOptions = new ProxyOptions(ProxyAuthenticationType.BASIC, newProxy, USERNAME, + PASSWORD); + + this.handler = new WebSocketsProxyConnectionHandler(CONNECTION_ID, connectionOptions, + proxyOptions, peerDetails, AmqpMetricsProvider.noop()); + + // Act and Assert + try (MockedConstruction mockConstruction = mockConstruction(ProxyImpl.class)) { + this.handler.addTransportLayers(mock(Event.class, Mockito.CALLS_REAL_METHODS), + mock(TransportImpl.class, Mockito.CALLS_REAL_METHODS)); + + final List constructed = mockConstruction.constructed(); + assertEquals(1, constructed.size()); + // The ProxyImpl object constructed inside addTransportLayer method. + final ProxyImpl proxyImpl = constructed.get(0); + final String expectedConnectHostnameAndPort = HOSTNAME + ":" + AMQP_PORT; + verify(proxyImpl).configure(eq(expectedConnectHostnameAndPort), any(), any(), any()); + } + } + + /** + * Verifies that the hostname:port for Proxy CONNECT created from + * the Custom host fields in {@link ConnectionOptions}. + */ + @Test + public void proxyConfigureConnectHostnameAndPortDerivesFromCustomEndpoint() { + // Arrange + final InetSocketAddress address = InetSocketAddress.createUnresolved("my-new.proxy.com", 8888); + final Proxy newProxy = new Proxy(Proxy.Type.HTTP, address); + final ProxyOptions proxyOptions = new ProxyOptions(ProxyAuthenticationType.BASIC, newProxy, USERNAME, + PASSWORD); + final String customEndpointHostname = "order-events.contoso.com"; + final int customEndpointPort = 200; + + final ConnectionOptions connectionOptionsWithCustomEndpoint = new ConnectionOptions(HOSTNAME, tokenCredential, + CbsAuthorizationType.SHARED_ACCESS_SIGNATURE, "scope", AmqpTransportType.AMQP_WEB_SOCKETS, + new AmqpRetryOptions(), ProxyOptions.SYSTEM_DEFAULTS, scheduler, CLIENT_OPTIONS, VERIFY_MODE, PRODUCT, + CLIENT_VERSION, customEndpointHostname, customEndpointPort); + + this.handler = new WebSocketsProxyConnectionHandler(CONNECTION_ID, connectionOptionsWithCustomEndpoint, + proxyOptions, peerDetails, AmqpMetricsProvider.noop()); + + // Act and Assert + try (MockedConstruction mockConstruction = mockConstruction(ProxyImpl.class)) { + this.handler.addTransportLayers(mock(Event.class, Mockito.CALLS_REAL_METHODS), + mock(TransportImpl.class, Mockito.CALLS_REAL_METHODS)); + + final List constructed = mockConstruction.constructed(); + assertEquals(1, constructed.size()); + // The ProxyImpl object constructed inside addTransportLayer method. + final ProxyImpl proxyImpl = constructed.get(0); + final String expectedConnectHostnameAndPort = customEndpointHostname + ":" + customEndpointPort; + verify(proxyImpl).configure(eq(expectedConnectHostnameAndPort), any(), any(), any()); + } + } + @Test public void shouldUseProxyNoLegalProxyAddress() { // Arrange diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClient.java b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClient.java index 65b710343bea..45581015ae83 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClient.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClient.java @@ -8,6 +8,7 @@ import com.azure.core.http.HttpHeaders; import com.azure.core.http.HttpRequest; import com.azure.core.http.HttpResponse; +import com.azure.core.http.jdk.httpclient.implementation.BodyIgnoringSubscriber; import com.azure.core.util.Context; import com.azure.core.util.Contexts; import com.azure.core.util.CoreUtils; @@ -20,7 +21,6 @@ import reactor.core.publisher.Mono; import java.io.IOException; -import java.io.InputStream; import java.io.UncheckedIOException; import java.net.URISyntaxException; import java.util.List; @@ -37,6 +37,9 @@ */ class JdkHttpClient implements HttpClient { private static final ClientLogger LOGGER = new ClientLogger(JdkHttpClient.class); + private static final String AZURE_EAGERLY_READ_RESPONSE = "azure-eagerly-read-response"; + private static final String AZURE_IGNORE_RESPONSE_BODY = "azure-ignore-response-body"; + private static final byte[] IGNORED_BODY = new byte[0]; private final java.net.http.HttpClient jdkHttpClient; @@ -61,11 +64,24 @@ public Mono send(HttpRequest request) { @Override public Mono send(HttpRequest request, Context context) { - boolean eagerlyReadResponse = (boolean) context.getData("azure-eagerly-read-response").orElse(false); + boolean eagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); + boolean ignoreResponseBody = (boolean) context.getData(AZURE_IGNORE_RESPONSE_BODY).orElse(false); return Mono.fromCallable(() -> toJdkHttpRequest(request, context)) .flatMap(jdkRequest -> Mono.fromCompletionStage(jdkHttpClient.sendAsync(jdkRequest, ofPublisher())) .flatMap(jdKResponse -> { + // Ignoring the response body takes precedent over eagerly reading the response body. + // Both should never be true at the same time but this is acts as a safeguard. + if (ignoreResponseBody) { + HttpHeaders headers = fromJdkHttpHeaders(jdKResponse.headers()); + int statusCode = jdKResponse.statusCode(); + + return JdkFlowAdapter.flowPublisherToFlux(jdKResponse.body()) + .ignoreElements() + .then(Mono.fromSupplier(() -> + new JdkHttpResponseSync(request, statusCode, headers, IGNORED_BODY))); + } + if (eagerlyReadResponse) { HttpHeaders headers = fromJdkHttpHeaders(jdKResponse.headers()); int statusCode = jdKResponse.statusCode(); @@ -82,16 +98,24 @@ public Mono send(HttpRequest request, Context context) { @Override public HttpResponse sendSync(HttpRequest request, Context context) { - boolean eagerlyReadResponse = (boolean) context.getData("azure-eagerly-read-response").orElse(false); + boolean eagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); + boolean ignoreResponseBody = (boolean) context.getData(AZURE_IGNORE_RESPONSE_BODY).orElse(false); java.net.http.HttpRequest jdkRequest = toJdkHttpRequest(request, context); try { - if (eagerlyReadResponse) { + // Ignoring the response body takes precedent over eagerly reading the response body. + // Both should never be true at the same time but this is acts as a safeguard. + if (ignoreResponseBody) { + java.net.http.HttpResponse jdKResponse = jdkHttpClient.send(jdkRequest, + responseInfo -> new BodyIgnoringSubscriber(LOGGER)); + return new JdkHttpResponseSync(request, jdKResponse.statusCode(), + fromJdkHttpHeaders(jdKResponse.headers()), IGNORED_BODY); + } else if (eagerlyReadResponse) { java.net.http.HttpResponse jdKResponse = jdkHttpClient.send(jdkRequest, ofByteArray()); - return new JdkHttpResponseSync(request, jdKResponse.statusCode(), fromJdkHttpHeaders(jdKResponse.headers()), jdKResponse.body()); + return new JdkHttpResponseSync(request, jdKResponse.statusCode(), + fromJdkHttpHeaders(jdKResponse.headers()), jdKResponse.body()); } else { - java.net.http.HttpResponse jdKResponse = jdkHttpClient.send(jdkRequest, ofInputStream()); - return new JdkHttpResponseSync(request, jdKResponse); + return new JdkHttpResponseSync(request, jdkHttpClient.send(jdkRequest, ofInputStream())); } } catch (IOException e) { throw LOGGER.logExceptionAsError(new UncheckedIOException(e)); diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/implementation/BodyIgnoringSubscriber.java b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/implementation/BodyIgnoringSubscriber.java new file mode 100644 index 000000000000..876e631d994a --- /dev/null +++ b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/implementation/BodyIgnoringSubscriber.java @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.http.jdk.httpclient.implementation; + +import com.azure.core.http.HttpClient; +import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.logging.LogLevel; + +import java.net.http.HttpResponse; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Flow; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Implementation of a {@link HttpResponse.BodySubscriber} that ignores the response body. + *

+ * This is used when the {@link HttpClient} is told to ignore the response body, used when the returned body value is + * {@code void} or {@code Void}. + *

+ * This will log a warning message if a response body is received to indicate that there was a bug either in determining + * that the response body should be ignored, the Swagger indicated no response body would be received but was, or that + * the server sent a response body when it shouldn't. + */ +public final class BodyIgnoringSubscriber implements HttpResponse.BodySubscriber { + private final CompletableFuture completableFuture; + private final ClientLogger logger; + private final AtomicBoolean subscribed = new AtomicBoolean(); + + public BodyIgnoringSubscriber(ClientLogger logger) { + this.completableFuture = new CompletableFuture<>(); + this.logger = logger; + } + + @Override + public CompletionStage getBody() { + return completableFuture; + } + + @Override + public void onSubscribe(Flow.Subscription subscription) { + if (!subscribed.compareAndSet(false, true)) { + // Only can have one subscription. + subscription.cancel(); + } else { + subscription.request(Long.MAX_VALUE); + } + } + + @Override + public void onNext(List item) { + logger.log(LogLevel.WARNING, () -> "Received HTTP response body when one wasn't expected. " + + "Response body will be ignored as directed."); + } + + @Override + public void onError(Throwable throwable) { + completableFuture.completeExceptionally(throwable); + } + + @Override + public void onComplete() { + completableFuture.complete(null); + } +} diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java index 8c9b0506b55b..4935bcd6f022 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java @@ -213,7 +213,7 @@ public void testFlowableBackpressure() { public void testRequestBodyIsErrorShouldPropagateToResponse() { HttpClient client = new JdkHttpClientProvider().createInstance(); HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", "123") + .setHeader("Content-Length", "132") .setBody(Flux.error(new RuntimeException("boo"))); StepVerifier.create(client.send(request)) @@ -318,7 +318,7 @@ public void testStreamUploadAsync() throws IOException { public void testRequestBodyIsErrorShouldPropagateToResponseSync() { HttpClient client = new JdkHttpClientProvider().createInstance(); HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", "123") + .setHeader("Content-Length", "132") .setBody(Flux.error(new RuntimeException("boo"))); UncheckedIOException thrown = assertThrows(UncheckedIOException.class, () -> client.sendSync(request, Context.NONE)); diff --git a/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java b/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java index 836b52f7ca75..70699134c66c 100644 --- a/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java +++ b/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClient.java @@ -26,6 +26,7 @@ import com.azure.core.util.Contexts; import com.azure.core.util.ProgressReporter; import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.logging.LogLevel; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.EventLoopGroup; @@ -51,6 +52,7 @@ import java.nio.file.StandardOpenOption; import java.time.Duration; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiFunction; import static com.azure.core.http.netty.implementation.Utility.closeConnection; @@ -58,9 +60,9 @@ /** * This class provides a Netty-based implementation for the {@link HttpClient} interface. Creating an instance of this * class can be achieved by using the {@link NettyAsyncHttpClientBuilder} class, which offers Netty-specific API for - * features such as {@link NettyAsyncHttpClientBuilder#eventLoopGroup(EventLoopGroup) thread pooling}, {@link - * NettyAsyncHttpClientBuilder#wiretap(boolean) wiretapping}, {@link NettyAsyncHttpClientBuilder#proxy(ProxyOptions) - * setProxy configuration}, and much more. + * features such as {@link NettyAsyncHttpClientBuilder#eventLoopGroup(EventLoopGroup) thread pooling}, + * {@link NettyAsyncHttpClientBuilder#wiretap(boolean) wiretapping}, + * {@link NettyAsyncHttpClientBuilder#proxy(ProxyOptions) setProxy configuration}, and much more. * * @see HttpClient * @see NettyAsyncHttpClientBuilder @@ -70,6 +72,7 @@ class NettyAsyncHttpClient implements HttpClient { private static final byte[] EMPTY_BYTES = new byte[0]; private static final String AZURE_EAGERLY_READ_RESPONSE = "azure-eagerly-read-response"; + private static final String AZURE_IGNORE_RESPONSE_BODY = "azure-ignore-response-body"; private static final String AZURE_RESPONSE_TIMEOUT = "azure-response-timeout"; private static final String AZURE_EAGERLY_CONVERT_HEADERS = "azure-eagerly-convert-headers"; @@ -109,24 +112,24 @@ public Mono send(HttpRequest request, Context context) { Objects.requireNonNull(request.getUrl(), "'request.getUrl()' cannot be null."); Objects.requireNonNull(request.getUrl().getProtocol(), "'request.getUrl().getProtocol()' cannot be null."); - boolean effectiveEagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); - long effectiveResponseTimeout = context.getData(AZURE_RESPONSE_TIMEOUT) + boolean eagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); + boolean ignoreResponseBody = (boolean) context.getData(AZURE_IGNORE_RESPONSE_BODY).orElse(false); + boolean headersEagerlyConverted = (boolean) context.getData(AZURE_EAGERLY_CONVERT_HEADERS).orElse(false); + long responseTimeout = context.getData(AZURE_RESPONSE_TIMEOUT) .filter(timeoutDuration -> timeoutDuration instanceof Duration) .map(timeoutDuration -> ((Duration) timeoutDuration).toMillis()) .orElse(this.responseTimeout); - boolean effectiveHeadersEagerlyConverted = (boolean) context.getData(AZURE_EAGERLY_CONVERT_HEADERS) - .orElse(false); return nettyClient .doOnRequest((r, connection) -> addRequestHandlers(connection, context)) - .doAfterRequest((r, connection) -> doAfterRequest(connection, effectiveResponseTimeout)) + .doAfterRequest((r, connection) -> doAfterRequest(connection, responseTimeout)) .doOnResponse((response, connection) -> addReadTimeoutHandler(connection, readTimeout)) .doAfterResponseSuccess((response, connection) -> removeReadTimeoutHandler(connection)) .request(HttpMethod.valueOf(request.getHttpMethod().toString())) .uri(request.getUrl().toString()) .send(bodySendDelegate(request)) - .responseConnection(responseDelegate(request, disableBufferCopy, effectiveEagerlyReadResponse, - effectiveHeadersEagerlyConverted)) + .responseConnection(responseDelegate(request, disableBufferCopy, eagerlyReadResponse, ignoreResponseBody, + headersEagerlyConverted)) .single() .onErrorMap(throwable -> { // The exception was an SSLException that was caused by a failure to connect to a proxy. @@ -247,14 +250,32 @@ private static NettyOutbound sendInputStream(NettyOutbound reactorNettyOutbound, * @param restRequest the Rest request whose response this delegate handles * @param disableBufferCopy Flag indicating if the network response shouldn't be buffered. * @param eagerlyReadResponse Flag indicating if the network response should be eagerly read into memory. + * @param ignoreResponseBody Flag indicating if the network response should be ignored. * @param headersEagerlyConverted Flag indicating if the Netty HttpHeaders should be eagerly converted to Azure Core * HttpHeaders. * @return a delegate upon invocation setup Rest response object */ private static BiFunction> responseDelegate( - HttpRequest restRequest, boolean disableBufferCopy, boolean eagerlyReadResponse, + HttpRequest restRequest, boolean disableBufferCopy, boolean eagerlyReadResponse, boolean ignoreResponseBody, boolean headersEagerlyConverted) { return (reactorNettyResponse, reactorNettyConnection) -> { + // Ignoring the response body takes precedent over eagerly reading the response body. + // Both should never be true at the same time but this is acts as a safeguard. + if (ignoreResponseBody) { + AtomicBoolean firstNext = new AtomicBoolean(true); + return reactorNettyConnection.inbound().receive() + .doOnNext(ignored -> { + if (!firstNext.compareAndSet(true, false)) { + LOGGER.log(LogLevel.WARNING, () -> "Received HTTP response body when one wasn't expected. " + + "Response body will be ignored as directed."); + } + }) + .ignoreElements() + .doFinally(ignored -> closeConnection(reactorNettyConnection)) + .then(Mono.fromSupplier(() -> new NettyAsyncHttpBufferedResponse(reactorNettyResponse, restRequest, + EMPTY_BYTES, headersEagerlyConverted))); + } + /* * If the response is being eagerly read into memory the flag for buffer copying can be ignored as the * response MUST be deeply copied to ensure it can safely be used downstream. diff --git a/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientTests.java b/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientTests.java index 7738675f611b..ee94c440eeaf 100644 --- a/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientTests.java +++ b/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientTests.java @@ -209,7 +209,7 @@ public void testFlowableBackpressure() { public void testRequestBodyIsErrorShouldPropagateToResponse() { HttpClient client = new NettyAsyncHttpClientProvider().createInstance(); HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, SHORT_POST_BODY_PATH)) - .setHeader("Content-Length", "123") + .setHeader("Content-Length", "132") .setBody(Flux.error(new RuntimeException("boo"))); StepVerifier.create(client.send(request)) diff --git a/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClient.java b/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClient.java index 5cdccc181d4d..2a28c7454752 100644 --- a/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClient.java +++ b/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClient.java @@ -27,6 +27,7 @@ import com.azure.core.util.Contexts; import com.azure.core.util.ProgressReporter; import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.logging.LogLevel; import okhttp3.Call; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -39,7 +40,6 @@ import java.io.IOException; import java.io.UncheckedIOException; -import java.util.Objects; /** * HttpClient implementation for OkHttp. @@ -47,9 +47,11 @@ class OkHttpAsyncHttpClient implements HttpClient { private static final ClientLogger LOGGER = new ClientLogger(OkHttpAsyncHttpClient.class); - private static final RequestBody EMPTY_REQUEST_BODY = RequestBody.create(new byte[0]); + private static final byte[] EMPTY_BODY = new byte[0]; + private static final RequestBody EMPTY_REQUEST_BODY = RequestBody.create(EMPTY_BODY); private static final String AZURE_EAGERLY_READ_RESPONSE = "azure-eagerly-read-response"; + private static final String AZURE_IGNORE_RESPONSE_BODY = "azure-ignore-response-body"; private static final String AZURE_EAGERLY_CONVERT_HEADERS = "azure-eagerly-convert-headers"; final OkHttpClient httpClient; @@ -66,6 +68,7 @@ public Mono send(HttpRequest request) { @Override public Mono send(HttpRequest request, Context context) { boolean eagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); + boolean ignoreResponseBody = (boolean) context.getData(AZURE_IGNORE_RESPONSE_BODY).orElse(false); boolean eagerlyConvertHeaders = (boolean) context.getData(AZURE_EAGERLY_CONVERT_HEADERS).orElse(false); ProgressReporter progressReporter = Contexts.with(context).getHttpRequestProgressReporter(); @@ -87,7 +90,8 @@ public Mono send(HttpRequest request, Context context) { .subscribe(okHttpRequest -> { try { Call call = httpClient.newCall(okHttpRequest); - call.enqueue(new OkHttpCallback(sink, request, eagerlyReadResponse, eagerlyConvertHeaders)); + call.enqueue(new OkHttpCallback(sink, request, eagerlyReadResponse, ignoreResponseBody, + eagerlyConvertHeaders)); sink.onCancel(call::cancel); } catch (Exception ex) { sink.error(ex); @@ -99,6 +103,7 @@ public Mono send(HttpRequest request, Context context) { @Override public HttpResponse sendSync(HttpRequest request, Context context) { boolean eagerlyReadResponse = (boolean) context.getData(AZURE_EAGERLY_READ_RESPONSE).orElse(false); + boolean ignoreResponseBody = (boolean) context.getData(AZURE_IGNORE_RESPONSE_BODY).orElse(false); boolean eagerlyConvertHeaders = (boolean) context.getData(AZURE_EAGERLY_CONVERT_HEADERS).orElse(false); ProgressReporter progressReporter = Contexts.with(context).getHttpRequestProgressReporter(); @@ -106,7 +111,8 @@ public HttpResponse sendSync(HttpRequest request, Context context) { Request okHttpRequest = toOkHttpRequest(request, progressReporter); try { Response okHttpResponse = httpClient.newCall(okHttpRequest).execute(); - return toHttpResponse(request, okHttpResponse, eagerlyReadResponse, eagerlyConvertHeaders); + return toHttpResponse(request, okHttpResponse, eagerlyReadResponse, ignoreResponseBody, + eagerlyConvertHeaders); } catch (IOException e) { throw LOGGER.logExceptionAsError(new UncheckedIOException(e)); } @@ -198,20 +204,30 @@ private static long getRequestContentLength(BinaryDataContent content, HttpHeade } private static HttpResponse toHttpResponse(HttpRequest request, okhttp3.Response response, - boolean eagerlyReadResponse, boolean eagerlyConvertHeaders) throws IOException { + boolean eagerlyReadResponse, boolean ignoreResponseBody, boolean eagerlyConvertHeaders) throws IOException { + // Ignoring the response body takes precedent over eagerly reading the response body. + // Both should never be true at the same time but this is acts as a safeguard. + if (ignoreResponseBody) { + ResponseBody body = response.body(); + if (body != null) { + if (body.contentLength() > 0) { + LOGGER.log(LogLevel.WARNING, () -> "Received HTTP response body when one wasn't expected. " + + "Response body will be ignored as directed."); + } + body.close(); + } + + return new OkHttpAsyncBufferedResponse(response, request, EMPTY_BODY, eagerlyConvertHeaders); + } + /* * Use a buffered response when we are eagerly reading the response from the network and the body isn't * empty. */ if (eagerlyReadResponse) { try (ResponseBody body = response.body()) { - if (Objects.nonNull(body)) { - byte[] bytes = body.bytes(); - return new OkHttpAsyncBufferedResponse(response, request, bytes, eagerlyConvertHeaders); - } else { - // Body is null, use the non-buffering response. - return new OkHttpAsyncResponse(response, request, eagerlyConvertHeaders); - } + byte[] bytes = (body != null) ? body.bytes() : EMPTY_BODY; + return new OkHttpAsyncBufferedResponse(response, request, bytes, eagerlyConvertHeaders); } } else { return new OkHttpAsyncResponse(response, request, eagerlyConvertHeaders); @@ -222,13 +238,15 @@ private static class OkHttpCallback implements okhttp3.Callback { private final MonoSink sink; private final HttpRequest request; private final boolean eagerlyReadResponse; + private final boolean ignoreResponseBody; private final boolean eagerlyConvertHeaders; OkHttpCallback(MonoSink sink, HttpRequest request, boolean eagerlyReadResponse, - boolean eagerlyConvertHeaders) { + boolean ignoreResponseBody, boolean eagerlyConvertHeaders) { this.sink = sink; this.request = request; this.eagerlyReadResponse = eagerlyReadResponse; + this.ignoreResponseBody = ignoreResponseBody; this.eagerlyConvertHeaders = eagerlyConvertHeaders; } @@ -248,7 +266,8 @@ public void onFailure(okhttp3.Call call, IOException e) { @Override public void onResponse(okhttp3.Call call, okhttp3.Response response) { try { - sink.success(toHttpResponse(request, response, eagerlyReadResponse, eagerlyConvertHeaders)); + sink.success(toHttpResponse(request, response, eagerlyReadResponse, ignoreResponseBody, + eagerlyConvertHeaders)); } catch (IOException ex) { // Reading the body bytes may cause an IOException, if it happens propagate it. sink.error(ex); diff --git a/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClientTests.java b/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClientTests.java index 1b8bdd4c7ea1..d4fa90498c19 100644 --- a/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClientTests.java +++ b/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncHttpClientTests.java @@ -139,7 +139,7 @@ public void testRequestBodyIsErrorShouldPropagateToResponse() { .build(); HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", "123") + .setHeader("Content-Length", "132") .setBody(Flux.error(new RuntimeException("boo"))); StepVerifier.create(client.send(request)) diff --git a/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java b/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java index 09a6df299b0a..b49a8de559e7 100644 --- a/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java +++ b/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java @@ -280,7 +280,8 @@ public void buildWithCustomVertx() throws Exception { CountDownLatch latch = new CountDownLatch(1); vertx.close(event -> latch.countDown()); - assertTrue(latch.await(5, TimeUnit.SECONDS)); + // Wait 60 seconds, same as production code. + assertTrue(latch.await(60, TimeUnit.SECONDS)); } } diff --git a/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientTests.java b/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientTests.java index e9ac46199650..b929bc322b44 100644 --- a/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientTests.java +++ b/sdk/core/azure-core-http-vertx/src/test/java/com/azure/core/http/vertx/VertxAsyncHttpClientTests.java @@ -121,7 +121,7 @@ public void testFlowableBackpressure() { public void testRequestBodyIsErrorShouldPropagateToResponse() { HttpClient client = new VertxAsyncHttpClientProvider().createInstance(); HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", "123") + .setHeader("Content-Length", "132") .setBody(Flux.error(new RuntimeException("boo"))); StepVerifier.create(client.send(request)) diff --git a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/ResourceAuthorIdentityType.java b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/ResourceAuthorIdentityType.java index 4c1cf695dfc1..73080a73de9e 100644 --- a/sdk/core/azure-core-management/src/main/java/com/azure/core/management/ResourceAuthorIdentityType.java +++ b/sdk/core/azure-core-management/src/main/java/com/azure/core/management/ResourceAuthorIdentityType.java @@ -22,6 +22,18 @@ public final class ResourceAuthorIdentityType extends ExpandableStringEnum + * This constructor shouldn't be called as it will produce a {@link ResourceAuthorIdentityType} which doesn't have a + * String enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String, Class)} factory method. + */ + @Deprecated + public ResourceAuthorIdentityType() { + } + /** * Creates or finds a ResourceAuthorIdentityType from its string representation. * diff --git a/sdk/core/azure-core-metrics-opentelemetry/src/main/java/com/azure/core/metrics/opentelemetry/OpenTelemetryUtils.java b/sdk/core/azure-core-metrics-opentelemetry/src/main/java/com/azure/core/metrics/opentelemetry/OpenTelemetryUtils.java index 4ab175916d02..c654f52b39e9 100644 --- a/sdk/core/azure-core-metrics-opentelemetry/src/main/java/com/azure/core/metrics/opentelemetry/OpenTelemetryUtils.java +++ b/sdk/core/azure-core-metrics-opentelemetry/src/main/java/com/azure/core/metrics/opentelemetry/OpenTelemetryUtils.java @@ -14,6 +14,8 @@ import static com.azure.core.util.tracing.Tracer.PARENT_TRACE_CONTEXT_KEY; class OpenTelemetryUtils { + private static boolean warnedOnContextType = false; + private static boolean warnedOnBuilderType = false; private static final ClientLogger LOGGER = new ClientLogger(OpenTelemetryUtils.class); /** @@ -55,11 +57,14 @@ static io.opentelemetry.context.Context getTraceContextOrCurrent(Context azConte if (traceContextObj instanceof io.opentelemetry.context.Context) { return (io.opentelemetry.context.Context) traceContextObj; } else if (traceContextObj != null) { - LOGGER.warning("Expected instance of `io.opentelemetry.context.Context` under `PARENT_TRACE_CONTEXT_KEY`, but got {}, ignoring it.", traceContextObj.getClass().getName()); + // TODO (limolkova) somehow we can get shaded otel agent context here + if (!warnedOnContextType) { + LOGGER.warning("Expected instance of `io.opentelemetry.context.Context` under `PARENT_TRACE_CONTEXT_KEY`, but got {}, ignoring it.", traceContextObj.getClass().getName()); + warnedOnContextType = true; + } } } - LOGGER.verbose("No context is found under `PARENT_TRACE_CONTEXT_KEY`, getting current context"); return io.opentelemetry.context.Context.current(); } @@ -68,8 +73,9 @@ static Attributes getAttributes(TelemetryAttributes attributesBuilder) { return ((OpenTelemetryAttributes) attributesBuilder).get(); } - if (attributesBuilder != null) { + if (attributesBuilder != null && !warnedOnBuilderType) { LOGGER.warning("Expected instance of `OpenTelemetryAttributeBuilder` in `attributeCollection`, but got {}, ignoring it.", attributesBuilder.getClass().getName()); + warnedOnBuilderType = true; } return Attributes.empty(); diff --git a/sdk/core/azure-core-test/src/main/java/com/azure/core/test/http/MockHttpClient.java b/sdk/core/azure-core-test/src/main/java/com/azure/core/test/http/MockHttpClient.java index 32b09ced5536..e2ce5b37b8ea 100644 --- a/sdk/core/azure-core-test/src/main/java/com/azure/core/test/http/MockHttpClient.java +++ b/sdk/core/azure-core-test/src/main/java/com/azure/core/test/http/MockHttpClient.java @@ -181,6 +181,8 @@ public Mono send(HttpRequest request) { final String statusCodeString = requestPathLower.substring("/status/".length()); final int statusCode = Integer.parseInt(statusCodeString); response = new MockHttpResponse(request, statusCode); + } else if (requestPathLower.startsWith("/voideagerreadoom")) { + response = new MockHttpResponse(request, 200); } } else if ("echo.org".equalsIgnoreCase(requestHost)) { return FluxUtil.collectBytesInByteBufferStream(request.getBody()) diff --git a/sdk/core/azure-core-test/src/main/java/com/azure/core/test/implementation/RestProxyTests.java b/sdk/core/azure-core-test/src/main/java/com/azure/core/test/implementation/RestProxyTests.java index 686c847b0ff3..97b1de142812 100644 --- a/sdk/core/azure-core-test/src/main/java/com/azure/core/test/implementation/RestProxyTests.java +++ b/sdk/core/azure-core-test/src/main/java/com/azure/core/test/implementation/RestProxyTests.java @@ -76,6 +76,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertArrayEquals; @@ -2035,6 +2036,61 @@ public void requestOptionsSetsAHeader() { assertEquals("randomValue2", response.getHeaderValue("randomHeader")); } + @Host("http://localhost") + @ServiceInterface(name = "Service28") + interface Service28 { + @Head("voideagerreadoom") + @ExpectedResponses({200}) + void headvoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Void headVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Response headResponseVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + ResponseBase headResponseBaseVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Mono headMonoVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Mono> headMonoResponseVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Mono> headMonoResponseBaseVoid(); + + @Head("voideagerreadoom") + @ExpectedResponses({200}) + Flux headFluxVoid(); + } + + @ParameterizedTest + @MethodSource("voidDoesNotEagerlyReadResponseSupplier") + public void voidDoesNotEagerlyReadResponse(Consumer executable) { + assertDoesNotThrow(() -> executable.accept(createService(Service28.class))); + } + + private static Stream> voidDoesNotEagerlyReadResponseSupplier() { + return Stream.of( + Service28::headvoid, + Service28::headVoid, + Service28::headResponseVoid, + Service28::headResponseBaseVoid, + Service28::headMonoVoid, + Service28::headMonoResponseVoid, + Service28::headMonoResponseBaseVoid, + Service28::headFluxVoid + ); + } + // Helpers protected T createService(Class serviceClass) { final HttpClient httpClient = createHttpClient(); diff --git a/sdk/core/azure-core-test/src/test/java/com/azure/core/test/RestProxyTestsWireMockServer.java b/sdk/core/azure-core-test/src/test/java/com/azure/core/test/RestProxyTestsWireMockServer.java index ae44b3ca223f..b3802238c7de 100644 --- a/sdk/core/azure-core-test/src/test/java/com/azure/core/test/RestProxyTestsWireMockServer.java +++ b/sdk/core/azure-core-test/src/test/java/com/azure/core/test/RestProxyTestsWireMockServer.java @@ -33,6 +33,7 @@ import java.util.Random; import java.util.stream.Collectors; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.delete; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.head; @@ -69,6 +70,16 @@ public static WireMockServer getRestProxyTestsServer() { server.stubFor(patch(urlPathMatching("/patch"))); server.stubFor(get("/get")); + // Validates a bug where a void, or Void, response type would previously attempt to eagerly read the response + // body. This resulted in OutOfMemoryErrors or high memory usage in APIs such as the getProperties on Blobs, + // Datalake, and Files where the size of the resource is the Content-Length header value. So, there could be + // an attempt to create a byte[] large enough to hold the response. + // + // This uses a size too large for a byte[], so if the incorrect handling is used an OutOfMemoryError will be + // thrown. + server.stubFor(head(urlPathMatching("/voideagerreadoom")).willReturn(aResponse() + .withHeader("Content-Length", "10737418240"))); + return server; } diff --git a/sdk/core/azure-core-tracing-opentelemetry/README.md b/sdk/core/azure-core-tracing-opentelemetry/README.md index a83f28d577ee..392836e7ff55 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/README.md +++ b/sdk/core/azure-core-tracing-opentelemetry/README.md @@ -122,9 +122,13 @@ try { Send a single event/message using [azure-messaging-eventhubs][azure-messaging-eventhubs] with tracing enabled. -Users can additionally pass the value of the current tracing span to the EventData object with key **PARENT_TRACE_CONTEXT_KEY** on the [Context][context] object: +Users can additionally pass custom value of the trace context to the EventData object with key **PARENT_TRACE_CONTEXT_KEY** on the [Context][context] object. + +Please refer to [Event Hubs samples][event_hubs_samples] +for more information. + +```java -```java readme-sample-context-manual-propagation-amqp Flux events = Flux.just( new EventData("EventData Sample 1"), new EventData("EventData Sample 2")); @@ -151,6 +155,7 @@ events.collect(batchRef::get, (b, e) -> return ctx.put(PARENT_TRACE_CONTEXT_KEY, traceContextRef.updateAndGet(traceContext -> traceContext.with(span))); }) .block(); + ``` ## Troubleshooting @@ -203,9 +208,9 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope [OpenTelemetry]: https://github.com/open-telemetry/opentelemetry-java#opentelemetry-for-java [sample_app_config]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/CreateConfigurationSettingLoggingExporterSample.java [sample_async_key_vault]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/ListKeyVaultSecretsAutoConfigurationSample.java -[sample_eventhubs]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/PublishEventsJaegerExporterSample.java [sample_key_vault]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/ListKeyVaultSecretsJaegerExporterSample.java [samples]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src/samples/ [source_code]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-tracing-opentelemetry/src +[event_hubs_samples](https://github.com/Azure/azure-sdk-for-java/blob/10a18ccc2f20cad6004ae90d64f22009d65e9ef7/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsTracingWithCustomContextSample.java) ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Fcore%2Fazure-core-tracing-opentelemetry%2FREADME.png) diff --git a/sdk/core/azure-core-tracing-opentelemetry/pom.xml b/sdk/core/azure-core-tracing-opentelemetry/pom.xml index 04025b10101c..8ed7f191c169 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/pom.xml +++ b/sdk/core/azure-core-tracing-opentelemetry/pom.xml @@ -134,12 +134,6 @@ 1.6.1 test - - com.azure - azure-messaging-eventhubs - 5.14.0 - test - io.opentelemetry opentelemetry-sdk-extension-autoconfigure diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java index 0587e5e32008..daab2c7b12b4 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java @@ -22,6 +22,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; +import java.time.Instant; import java.time.OffsetDateTime; import java.util.Map; import java.util.Objects; @@ -36,6 +37,8 @@ */ public class OpenTelemetryTracer implements com.azure.core.util.tracing.Tracer { private static final StartSpanOptions DEFAULT_OPTIONS = new StartSpanOptions(com.azure.core.util.tracing.SpanKind.INTERNAL); + private static final String SPAN_KIND_KEY = "span-kind"; + private static final String START_TIME_KEY = "span-start-time"; private final Tracer tracer; /** @@ -65,7 +68,7 @@ public OpenTelemetryTracer() { private static final ClientLogger LOGGER = new ClientLogger(OpenTelemetryTracer.class); private static final AutoCloseable NOOP_CLOSEABLE = () -> { }; - private static final SpanKind SHARED_SPAN_BUILDER_KIND = SpanKind.CLIENT; + private static final SpanKind DEFAULT_SHARED_SPAN_BUILDER_KIND = SpanKind.CLIENT; private static final String SUPPRESSED_SPAN_FLAG = "suppressed-span-flag"; private static final String CLIENT_METHOD_CALL_FLAG = "client-method-call-flag"; @@ -114,7 +117,7 @@ public Context start(String spanName, Context context, ProcessKind processKind) context = unsuppress(context); switch (processKind) { case SEND: - // use previously created span builder from the LINK process. + // use previously created span builder with the links spanBuilder = getOrNull(context, SPAN_BUILDER_KEY, SpanBuilder.class); if (spanBuilder == null) { // we can't return context here, because caller would not know that span was not created. @@ -123,17 +126,23 @@ public Context start(String spanName, Context context, ProcessKind processKind) .addKeyValue("spanName", spanName) .addKeyValue("processKind", processKind) .log("Start span is called without builder on the context, creating default builder."); - spanBuilder = createSpanBuilder(spanName, null, SHARED_SPAN_BUILDER_KIND, null, context); + spanBuilder = createSpanBuilder(spanName, null, SpanKind.CLIENT, null, context); } - return startSpanInternal(spanBuilder, isClientCall(SHARED_SPAN_BUILDER_KIND), this::addMessagingAttributes, context); + return startSpanInternal(spanBuilder, true, this::addMessagingAttributes, context); case MESSAGE: spanBuilder = createSpanBuilder(spanName, null, SpanKind.PRODUCER, null, context); context = startSpanInternal(spanBuilder, false, this::addMessagingAttributes, context); return setDiagnosticId(context); case PROCESS: - SpanContext remoteParentContext = getOrNull(context, SPAN_CONTEXT_KEY, SpanContext.class); - spanBuilder = createSpanBuilder(spanName, remoteParentContext, SpanKind.CONSUMER, null, context); + // use previously created span builder with the links + spanBuilder = getOrNull(context, SPAN_BUILDER_KEY, SpanBuilder.class); + if (spanBuilder == null) { + // if there is no builder, create new one from parent in context + SpanContext remoteParentContext = getOrNull(context, SPAN_CONTEXT_KEY, SpanContext.class); + spanBuilder = createSpanBuilder(spanName, remoteParentContext, SpanKind.CONSUMER, null, context); + } + context = startSpanInternal(spanBuilder, false, this::addMessagingAttributes, context); // TODO (limolkova) we should do this in the EventHub/ServiceBus SDK instead to make sure scope is @@ -227,7 +236,14 @@ public void addLink(Context context) { if (spanContext == null) { return; } - spanBuilder.addLink(spanContext); + + Attributes linkAttributes = Attributes.empty(); + Long messageEnqueuedTime = getOrNull(context, MESSAGE_ENQUEUED_TIME, Long.class); + if (messageEnqueuedTime != null) { + linkAttributes = Attributes.of(AttributeKey.longKey(MESSAGE_ENQUEUED_TIME), messageEnqueuedTime); + } + + spanBuilder.addLink(spanContext, linkAttributes); } /** @@ -243,8 +259,18 @@ public Context extractContext(String diagnosticId, Context context) { */ @Override public Context getSharedSpanBuilder(String spanName, Context context) { - // this is used to create messaging send spanBuilder, and it's a CLIENT span - return context.addData(SPAN_BUILDER_KEY, createSpanBuilder(spanName, null, SHARED_SPAN_BUILDER_KIND, null, context)); + com.azure.core.util.tracing.SpanKind spanKind = getOrNull(context, SPAN_KIND_KEY, com.azure.core.util.tracing.SpanKind.class); + if (spanKind == null) { + spanKind = com.azure.core.util.tracing.SpanKind.CLIENT; + } + + SpanBuilder builder = createSpanBuilder(spanName, null, convertToOtelKind(spanKind), null, context); + Instant startTime = getOrNull(context, START_TIME_KEY, Instant.class); + if (startTime != null) { + builder.setStartTimestamp(startTime); + } + + return context.addData(SPAN_BUILDER_KEY, builder); } /** @@ -258,7 +284,6 @@ public AutoCloseable makeSpanCurrent(Context context) { io.opentelemetry.context.Context traceContext = getTraceContextOrDefault(context, null); if (traceContext == null) { - LOGGER.verbose("There is no OpenTelemetry Context on the context, cannot make it current"); return NOOP_CLOSEABLE; } return traceContext.makeCurrent(); @@ -506,10 +531,7 @@ private void addMessagingAttributes(Span span, Context context) { @SuppressWarnings("unchecked") private static T getOrNull(Context context, String key, Class clazz) { final Optional optional = context.getData(key); - final Object result = optional.filter(value -> clazz.isAssignableFrom(value.getClass())).orElseGet(() -> { - LOGGER.verbose("Could not extract key '{}' of type '{}' from context.", key, clazz); - return null; - }); + final Object result = optional.filter(value -> clazz.isAssignableFrom(value.getClass())).orElse(null); return (T) result; } @@ -567,7 +589,7 @@ private Span getSpanOrNull(Context azContext) { private SpanKind processKindToSpanKind(ProcessKind processKind) { switch (processKind) { case SEND: - return SHARED_SPAN_BUILDER_KIND; + return SpanKind.CLIENT; case MESSAGE: return SpanKind.PRODUCER; case PROCESS: diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java index acc2abb97bc4..16c51a5557a0 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java @@ -323,6 +323,58 @@ public void startProcessSpanWithRemoteParent() { assertTrue(updatedContext.getData(SCOPE_KEY).isPresent()); } + @Test + public void startProcessSpanWithLinks() { + // Arrange + final Context spanBuilder = openTelemetryTracer.getSharedSpanBuilder("span", Context.NONE); + + Span link1 = tracer.spanBuilder("link1").startSpan(); + Span link2 = tracer.spanBuilder("link2").startSpan(); + + openTelemetryTracer.addLink(spanBuilder.addData(SPAN_CONTEXT_KEY, link1.getSpanContext())); + openTelemetryTracer.addLink(spanBuilder + .addData(SPAN_CONTEXT_KEY, link2.getSpanContext()) + .addData(MESSAGE_ENQUEUED_TIME, MESSAGE_ENQUEUED_VALUE)); + + // Act + final Context spanCtx = openTelemetryTracer.start(METHOD_NAME, spanBuilder, ProcessKind.PROCESS); + openTelemetryTracer.end(null, null, spanCtx); + + // Assert + ReadableSpan span = getSpan(spanCtx); + List links = span.toSpanData().getLinks(); + assertEquals(2, links.size()); + assertEquals(link1.getSpanContext().getTraceId(), links.get(0).getSpanContext().getTraceId()); + assertEquals(link1.getSpanContext().getSpanId(), links.get(0).getSpanContext().getSpanId()); + assertEquals(0, links.get(0).getAttributes().size()); + + assertEquals(link2.getSpanContext().getTraceId(), links.get(1).getSpanContext().getTraceId()); + assertEquals(link2.getSpanContext().getSpanId(), links.get(1).getSpanContext().getSpanId()); + Attributes linkAttributes = links.get(1).getAttributes(); + assertEquals(1, linkAttributes.size()); + assertEquals(MESSAGE_ENQUEUED_VALUE, linkAttributes.get(AttributeKey.longKey(MESSAGE_ENQUEUED_TIME))); + } + + @Test + public void startConsumeSpanWitStartTimeInContext() { + // Arrange + final Context spanBuilder = openTelemetryTracer.getSharedSpanBuilder("span", + new Context("span-start-time", Instant.now().minusSeconds(1000))); + + Span link = tracer.spanBuilder("link1").startSpan(); + + openTelemetryTracer.addLink(spanBuilder.addData(SPAN_CONTEXT_KEY, link.getSpanContext())); + + // Act + final Context spanCtx = openTelemetryTracer.start(METHOD_NAME, spanBuilder, ProcessKind.PROCESS); + openTelemetryTracer.end(null, null, spanCtx); + + // Assert + ReadableSpan span = getSpan(spanCtx); + assertEquals(1, span.toSpanData().getLinks().size()); + assertEquals(span.getLatencyNanos() / 1000_000_000d, 1000d, 10); + } + @Test public void startSpanOverloadNullPointerException() { @@ -930,7 +982,6 @@ private static Stream spanKinds() { Arguments.of(com.azure.core.util.tracing.SpanKind.SERVER, com.azure.core.util.tracing.SpanKind.PRODUCER, false), Arguments.of(com.azure.core.util.tracing.SpanKind.SERVER, com.azure.core.util.tracing.SpanKind.CONSUMER, false), Arguments.of(com.azure.core.util.tracing.SpanKind.SERVER, com.azure.core.util.tracing.SpanKind.SERVER, false)); - } @Test diff --git a/sdk/core/azure-core/README.md b/sdk/core/azure-core/README.md index 836367d0dda2..a23153cc1844 100644 --- a/sdk/core/azure-core/README.md +++ b/sdk/core/azure-core/README.md @@ -117,7 +117,35 @@ or checkout [StackOverflow for Azure Java SDK](https://stackoverflow.com/questio Azure SDKs for Java provide a consistent logging story to help aid in troubleshooting application errors and expedite their resolution. The logs produced will capture the flow of an application before reaching the terminal state to help -locate the root issue. View the [logging][logging] wiki for guidance about enabling logging. +locate the root issue. View the [logging][logging] documentation for guidance about enabling logging. + +#### HTTP Request and Response Logging + +HTTP request and response logging can be enabled by setting `HttpLogDetailLevel` in the `HttpLogOptions` used to create +an HTTP-based service client or by setting the environment variable or system property `AZURE_HTTP_LOG_DETAIL_LEVEL`. +The following table displays the valid options for `AZURE_HTTP_LOG_DETAIL_LEVEL` and the `HttpLogDetailLevel` it +correlates to (valid options are case-insensitive): + +| `AZURE_HTTP_LOG_DETAIL_LEVEL` value | `HttpLogDetailLevel` enum | +| ----------------------------------- | ------------------------- | +| `basic` | `HttpLogDetailLevel.BASIC` | +| `headers` | `HttpLogDetailLevel.HEADERS` | +| `body` | `HttpLogDetailLevel.BODY` | +| `body_and_headers` | `HttpLogDetailLevel.BODY_AND_HEADERS` | +| `bodyandheaders` | `HttpLogDetailLevel.BODY_AND_HEADERS` | + +All other values, or unsupported values, result in `HttpLogDetailLevel.NONE`, or disabled HTTP request and response +logging. Logging [must be enabled](#enabling-logging) to log HTTP requests and responses. Logging of HTTP headers requires `verbose` +logging to be enabled. The following table explains what logging is enabled for each `HttpLogDetailLevel`: + +| `HttpLogDetailLevel` value | Logging enabled | +| -------------------------- |-------------------------------------------------------------------------| +| `HttpLogDetailLevel.NONE` | No HTTP request or response logging | +| `HttpLogDetailLevel.BASIC` | HTTP request method, response status code, and request and response URL | +| `HttpLogDetailLevel.HEADERS` | All of `HttpLogDetailLevel.BASIC` and request and response headers if the log level is `verbose` | +| `HttpLogDetailLevel.BODY` | All of `HttpLogDetailLevel.BASIC` and request and response body if it's under 10KB in size | +| `HttpLogDetailLevel.BODY_AND_HEADERS` | All of `HttpLogDetailLevel.HEADERS` and `HttpLogDetailLevel.BODY` | + ## Contributing @@ -130,7 +158,7 @@ For details on contributing to this repository, see the [contributing guide](htt 5. Create new Pull Request -[logging]: https://github.com/Azure/azure-sdk-for-java/wiki/Logging-with-Azure-SDK +[logging]: https://learn.microsoft.com/azure/developer/java/sdk/logging-overview [jdk_link]: https://docs.microsoft.com/java/azure/jdk/?view=azure-java-stable ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Fcore%2Fazure-core%2FREADME.png) diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/BodyParam.java b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/BodyParam.java index bcdcb534c89e..5cc0bad8f5a4 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/BodyParam.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/BodyParam.java @@ -43,7 +43,9 @@ @Target(PARAMETER) public @interface BodyParam { /** - * @return the Content-Type that the body should be treated as + * Gets the Content-Type for the body. + * + * @return The Content-Type for the body. */ String value(); } diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/FormParam.java b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/FormParam.java index b4f57b875f9f..b8f12b1b59aa 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/FormParam.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/FormParam.java @@ -29,6 +29,8 @@ @Target(PARAMETER) public @interface FormParam { /** + * Gets the name of the key in a key-value pair as part of the form data. + * * @return The name of the key in a key value pair as part of the form data. */ String value(); @@ -36,7 +38,6 @@ /** * Whether the form parameter is already form encoded. *

- * * A value true for this argument indicates that value of {@link FormParam#value()} is already encoded hence engine * should not encode it, by default value will be encoded. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/UnexpectedResponseExceptionTypes.java b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/UnexpectedResponseExceptionTypes.java index db5d2bc8ef60..bbececfe2577 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/annotation/UnexpectedResponseExceptionTypes.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/annotation/UnexpectedResponseExceptionTypes.java @@ -18,6 +18,8 @@ @Target(METHOD) public @interface UnexpectedResponseExceptionTypes { /** + * Gets an array of {@link UnexpectedResponseExceptionType} that annotate a method. + * * @return array of {@link UnexpectedResponseExceptionType} that annotate a method. */ UnexpectedResponseExceptionType[] value(); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/credential/AccessToken.java b/sdk/core/azure-core/src/main/java/com/azure/core/credential/AccessToken.java index b12996a55f37..ab16bc6a0801 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/credential/AccessToken.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/credential/AccessToken.java @@ -14,6 +14,7 @@ public class AccessToken { /** * Creates an access token instance. + * * @param token the token string. * @param expiresAt the expiration time. */ @@ -23,21 +24,27 @@ public AccessToken(String token, OffsetDateTime expiresAt) { } /** - * @return the token string. + * Gets the token. + * + * @return The token. */ public String getToken() { return token; } /** - * @return the time when the token expires, in UTC. + * Gets the time when the token expires, in UTC. + * + * @return The time when the token expires, in UTC. */ public OffsetDateTime getExpiresAt() { return expiresAt; } /** - * @return if the token has expired. + * Whether the token has expired. + * + * @return Whether the token has expired. */ public boolean isExpired() { return OffsetDateTime.now().isAfter(expiresAt); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpRequestException.java b/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpRequestException.java index 6ff7064a3d8e..d30e8c99a3fc 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpRequestException.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpRequestException.java @@ -77,6 +77,8 @@ public HttpRequestException(final String message, final HttpRequest request, fin } /** + * Gets the {@link HttpRequest} being sent when the exception occurred. + * * @return The {@link HttpRequest} being sent when the exception occurred. */ public HttpRequest getRequest() { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpResponseException.java b/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpResponseException.java index 223d0e4d04a9..d042c7090e3a 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpResponseException.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpResponseException.java @@ -99,6 +99,8 @@ public HttpResponseException(final String message, final HttpResponse response, } /** + * Gets the {@link HttpResponse} received that is associated to the exception. + * * @return The {@link HttpResponse} received that is associated to the exception. */ public HttpResponse getResponse() { @@ -106,6 +108,8 @@ public HttpResponse getResponse() { } /** + * Gets the deserialized HTTP response value. + * * @return The deserialized HTTP response value. */ public Object getValue() { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/HttpAuthorization.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/HttpAuthorization.java index 9e76924b2a18..306aa599e3d4 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/HttpAuthorization.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/HttpAuthorization.java @@ -42,6 +42,8 @@ public HttpAuthorization(String scheme, String parameter) { } /** + * Gets the scheme of the authorization header. + * * @return Scheme of the authorization header. */ public String getScheme() { @@ -49,6 +51,8 @@ public String getScheme() { } /** + * Gets the credential of the authorization header. + * * @return Credential of the authorization header. */ public String getParameter() { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/MatchConditions.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/MatchConditions.java index 442cb2a53cca..ed79be868319 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/MatchConditions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/MatchConditions.java @@ -13,6 +13,12 @@ public class MatchConditions { private String ifMatch; private String ifNoneMatch; + /** + * Creates a new instance of {@link MatchConditions}. + */ + public MatchConditions() { + } + /** * Gets the ETag that resources must match. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/ProxyOptions.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/ProxyOptions.java index 3121bb5742b1..40bb16682954 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/ProxyOptions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/ProxyOptions.java @@ -127,6 +127,8 @@ public ProxyOptions setNonProxyHosts(String nonProxyHosts) { } /** + * Gets the address of the proxy. + * * @return the address of the proxy. */ public InetSocketAddress getAddress() { @@ -134,6 +136,8 @@ public InetSocketAddress getAddress() { } /** + * Gets the type of the prxoy. + * * @return the type of the proxy. */ public Type getType() { @@ -141,13 +145,17 @@ public Type getType() { } /** - * @return the proxy user name. + * Gets the proxy username. + * + * @return the proxy username. */ public String getUsername() { return this.username; } /** + * Gets the proxy password. + * * @return the proxy password. */ public String getPassword() { @@ -155,6 +163,8 @@ public String getPassword() { } /** + * Gets the host that bypass the proxy. + * * @return the hosts that bypass the proxy. */ public String getNonProxyHosts() { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/RequestConditions.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/RequestConditions.java index 392813a8d3b5..f8e3430b7aad 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/RequestConditions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/RequestConditions.java @@ -15,6 +15,12 @@ public class RequestConditions extends MatchConditions { private OffsetDateTime ifModifiedSince; private OffsetDateTime ifUnmodifiedSince; + /** + * Creates a new instance of {@link RequestConditions}. + */ + public RequestConditions() { + } + /** * Optionally limit requests to resources that match the passed ETag. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddDatePolicy.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddDatePolicy.java index a3184967ed2a..9b6f2ddb39d9 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddDatePolicy.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddDatePolicy.java @@ -39,6 +39,12 @@ protected void beforeSendingRequest(HttpPipelineCallContext context) { } }; + /** + * Creates a new instance of {@link AddDatePolicy}. + */ + public AddDatePolicy() { + } + @Override public Mono process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) { return INNER.process(context, next); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddHeadersFromContextPolicy.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddHeadersFromContextPolicy.java index 716118f6123c..c3b174ac04c1 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddHeadersFromContextPolicy.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddHeadersFromContextPolicy.java @@ -60,6 +60,12 @@ protected void beforeSendingRequest(HttpPipelineCallContext context) { } }; + /** + * Creates a new instance of {@link AddHeadersFromContextPolicy}. + */ + public AddHeadersFromContextPolicy() { + } + @Override public Mono process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) { return INNER.process(context, next); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/CookiePolicy.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/CookiePolicy.java index 502fcb165882..2164f7fc5f21 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/CookiePolicy.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/CookiePolicy.java @@ -66,6 +66,12 @@ protected HttpResponse afterReceivedResponse(HttpPipelineCallContext context, Ht } }; + /** + * Creates a new instance of {@link CookiePolicy}. + */ + public CookiePolicy() { + } + @Override public Mono process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) { return inner.process(context, next); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/ExponentialBackoffOptions.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/ExponentialBackoffOptions.java index c19f184c8b77..d7affaf5a168 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/ExponentialBackoffOptions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/ExponentialBackoffOptions.java @@ -19,6 +19,12 @@ public class ExponentialBackoffOptions { private Duration baseDelay; private Duration maxDelay; + /** + * Creates a new instance of {@link ExponentialBackoffOptions}. + */ + public ExponentialBackoffOptions() { + } + /** * Gets the max retry attempts that can be made. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogDetailLevel.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogDetailLevel.java index ca21730a8869..7bbfbc3d2b80 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogDetailLevel.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogDetailLevel.java @@ -67,21 +67,27 @@ static HttpLogDetailLevel fromConfiguration(Configuration configuration) { } /** - * @return a value indicating whether a request's URL should be logged. + * Whether a URL should be logged. + * + * @return Whether a URL should be logged. */ public boolean shouldLogUrl() { return this != NONE; } /** - * @return a value indicating whether HTTP message headers should be logged. + * Whether headers should be logged. + * + * @return Whether headers should be logged. */ public boolean shouldLogHeaders() { return this == HEADERS || this == BODY_AND_HEADERS; } /** - * @return a value indicating whether HTTP message bodies should be logged. + * Whether a body should be logged. + * + * @return Whether a body should be logged. */ public boolean shouldLogBody() { return this == BODY || this == BODY_AND_HEADERS; diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpPipelineSyncPolicy.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpPipelineSyncPolicy.java index 0f43b5aa032f..00875ee0938c 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpPipelineSyncPolicy.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpPipelineSyncPolicy.java @@ -13,6 +13,11 @@ * Represents a {@link HttpPipelinePolicy} that doesn't do any asynchronous or synchronously blocking operations. */ public class HttpPipelineSyncPolicy implements HttpPipelinePolicy { + /** + * Creates a new instance of {@link HttpPipelineSyncPolicy}. + */ + public HttpPipelineSyncPolicy() { + } /** * {@inheritDoc} @@ -40,6 +45,7 @@ public final HttpResponse processSync(HttpPipelineCallContext context, HttpPipel /** * Method is invoked before the request is sent. + * * @param context The request context. */ protected void beforeSendingRequest(HttpPipelineCallContext context) { @@ -48,6 +54,7 @@ protected void beforeSendingRequest(HttpPipelineCallContext context) { /** * Method is invoked after the response is received. + * * @param context The request context. * @param response The response received. * @return The transformed response. diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/http/rest/RequestOptions.java b/sdk/core/azure-core/src/main/java/com/azure/core/http/rest/RequestOptions.java index 5a1dec2cfe2a..5486361e80b1 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/http/rest/RequestOptions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/http/rest/RequestOptions.java @@ -125,6 +125,12 @@ public final class RequestOptions { private EnumSet errorOptions = DEFAULT; private Context context; + /** + * Creates a new instance of {@link RequestOptions}. + */ + public RequestOptions() { + } + /** * Gets the request callback, applying all the configurations set on this RequestOptions. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/AsyncRestProxy.java b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/AsyncRestProxy.java index 8c15b2c1adfd..00c353055b22 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/AsyncRestProxy.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/AsyncRestProxy.java @@ -22,7 +22,6 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Signal; -import reactor.core.scheduler.Schedulers; import reactor.util.context.ContextView; import java.io.IOException; @@ -72,7 +71,6 @@ public Object invoke(Object proxy, Method method, RequestOptions options, EnumSe Context finalContext = context; final Mono asyncResponse = RestProxyUtils.validateLengthAsync(request) - .publishOn(Schedulers.boundedElastic()) .flatMap(r -> send(r, finalContext)); Mono asyncDecodedResponse = this.decoder diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/RestProxyBase.java b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/RestProxyBase.java index 3c5a173d857e..aeb963d5fb0a 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/RestProxyBase.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/RestProxyBase.java @@ -94,6 +94,10 @@ public final Object invoke(Object proxy, final Method method, RequestOptions opt context = context.addData("azure-eagerly-read-response", true); } + if (methodParser.isResponseBodyIgnored()) { + context = context.addData("azure-ignore-response-body", true); + } + if (methodParser.isHeadersEagerlyConverted()) { context = context.addData("azure-eagerly-convert-headers", true); } diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/SwaggerMethodParser.java b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/SwaggerMethodParser.java index 4ee08e5672e2..9b5223235254 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/SwaggerMethodParser.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/http/rest/SwaggerMethodParser.java @@ -102,6 +102,7 @@ public class SwaggerMethodParser implements HttpResponseDecodeData { private final boolean isStreamResponse; private final boolean returnTypeDecodeable; private final boolean responseEagerlyRead; + private final boolean ignoreResponseBody; private final boolean headersEagerlyConverted; private final String spanName; @@ -278,6 +279,7 @@ public SwaggerMethodParser(Method swaggerMethod) { Type unwrappedReturnType = unwrapReturnType(returnType); this.returnTypeDecodeable = isReturnTypeDecodeable(unwrappedReturnType); this.responseEagerlyRead = isResponseEagerlyRead(unwrappedReturnType); + this.ignoreResponseBody = isResponseBodyIgnored(unwrappedReturnType); this.spanName = interfaceParser.getServiceName() + "." + swaggerMethod.getName(); } @@ -708,6 +710,11 @@ public boolean isResponseEagerlyRead() { return responseEagerlyRead; } + @Override + public boolean isResponseBodyIgnored() { + return ignoreResponseBody; + } + @Override public boolean isHeadersEagerlyConverted() { return headersEagerlyConverted; @@ -722,7 +729,7 @@ public String getSpanName() { return spanName; } - static boolean isReturnTypeDecodeable(Type unwrappedReturnType) { + public static boolean isReturnTypeDecodeable(Type unwrappedReturnType) { if (unwrappedReturnType == null) { return false; } @@ -735,17 +742,24 @@ static boolean isReturnTypeDecodeable(Type unwrappedReturnType) { && !TypeUtil.isTypeOrSubTypeOf(unwrappedReturnType, Void.class); } - static boolean isResponseEagerlyRead(Type unwrappedReturnType) { + public static boolean isResponseBodyIgnored(Type unwrappedReturnType) { if (unwrappedReturnType == null) { return false; } - return isReturnTypeDecodeable(unwrappedReturnType) - || TypeUtil.isTypeOrSubTypeOf(unwrappedReturnType, Void.TYPE) + return TypeUtil.isTypeOrSubTypeOf(unwrappedReturnType, Void.TYPE) || TypeUtil.isTypeOrSubTypeOf(unwrappedReturnType, Void.class); } - static Type unwrapReturnType(Type returnType) { + public static boolean isResponseEagerlyRead(Type unwrappedReturnType) { + if (unwrappedReturnType == null) { + return false; + } + + return isReturnTypeDecodeable(unwrappedReturnType); + } + + public static Type unwrapReturnType(Type returnType) { if (returnType == null) { return null; } diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/serializer/HttpResponseDecodeData.java b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/serializer/HttpResponseDecodeData.java index f18d4ca86d5c..76b4bfe1ce67 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/implementation/serializer/HttpResponseDecodeData.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/implementation/serializer/HttpResponseDecodeData.java @@ -9,6 +9,7 @@ import com.azure.core.http.rest.ResponseBase; import com.azure.core.implementation.TypeUtil; import com.azure.core.implementation.http.UnexpectedExceptionInformation; +import com.azure.core.implementation.http.rest.SwaggerMethodParser; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -104,7 +105,9 @@ default UnexpectedExceptionInformation getUnexpectedException(int code) { * * @return Whether the return type is decode-able. */ - boolean isReturnTypeDecodeable(); + default boolean isReturnTypeDecodeable() { + return SwaggerMethodParser.isReturnTypeDecodeable(SwaggerMethodParser.unwrapReturnType(getReturnType())); + } /** * Whether the network response body should be eagerly read based on its {@link #getReturnType() returnType}. @@ -115,6 +118,8 @@ default UnexpectedExceptionInformation getUnexpectedException(int code) { *

  • byte[]
  • *
  • ByteBuffer
  • *
  • InputStream
  • + *
  • Void
  • + *
  • void
  • * * * Reactive, {@link Mono} and {@link Flux}, and Response, {@link Response} and {@link ResponseBase}, generics are @@ -122,7 +127,28 @@ default UnexpectedExceptionInformation getUnexpectedException(int code) { * * @return Whether the network response body should be eagerly read. */ - boolean isResponseEagerlyRead(); + default boolean isResponseEagerlyRead() { + return SwaggerMethodParser.isResponseEagerlyRead(SwaggerMethodParser.unwrapReturnType(getReturnType())); + } + + /** + * Whether the network response body will be ignored based on its {@link #getReturnType() returnType}. + *

    + * The following types, including subtypes, ignored the network response body: + *

      + *
    • Void
    • + *
    • void
    • + *
    + * + * Reactive, {@link Mono} and {@link Flux}, and Response, {@link Response} and {@link ResponseBase}, generics are + * cracked open and their generic types are inspected for being one of the types above. + * + * @return Whether the network response body will be ignored. + */ + default boolean isResponseBodyIgnored() { + return SwaggerMethodParser.isResponseBodyIgnored(SwaggerMethodParser.unwrapReturnType(getReturnType())); + + } /** * Whether the return type contains strongly-typed headers. diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/models/CloudEventDataFormat.java b/sdk/core/azure-core/src/main/java/com/azure/core/models/CloudEventDataFormat.java index a2e64e5075d3..2a9c765eb202 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/models/CloudEventDataFormat.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/models/CloudEventDataFormat.java @@ -5,6 +5,7 @@ import com.azure.core.util.BinaryData; import com.azure.core.util.ExpandableStringEnum; +import com.fasterxml.jackson.annotation.JsonCreator; /** * Representation of the data format for a {@link CloudEvent}. @@ -15,6 +16,18 @@ * @see CloudEvent#CloudEvent(String, String, BinaryData, com.azure.core.models.CloudEventDataFormat, String) */ public final class CloudEventDataFormat extends ExpandableStringEnum { + /** + * Creates a new instance of {@link CloudEventDataFormat} without a {@link #toString()} value. + *

    + * This constructor shouldn't be called as it will produce a {@link CloudEventDataFormat} which doesn't + * have a String enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String)} factory method. + */ + @Deprecated + public CloudEventDataFormat() { + } + /** * Bytes format. */ @@ -24,4 +37,15 @@ public final class CloudEventDataFormat extends ExpandableStringEnum { + /** + * Creates a new instance of {@link GeoObjectType} without a {@link #toString()} value. + *

    + * This constructor shouldn't be called as it will produce a {@link GeoObjectType} which doesn't + * have a String enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String)} factory method. + */ + @Deprecated + public GeoObjectType() { + } + /** * GeoJSON point. */ diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/models/MessageContent.java b/sdk/core/azure-core/src/main/java/com/azure/core/models/MessageContent.java index 5f0093dd225d..3bd2206ab88f 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/models/MessageContent.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/models/MessageContent.java @@ -14,6 +14,12 @@ public class MessageContent { private BinaryData binaryData; private String contentType; + /** + * Creates a new instance of {@link MessageContent}. + */ + public MessageContent() { + } + /** * Gets the message body. * @@ -27,7 +33,6 @@ public BinaryData getBodyAsBinaryData() { * Sets the message body. * * @param binaryData The message body. - * * @return The updated {@link MessageContent} object. */ public MessageContent setBodyAsBinaryData(BinaryData binaryData) { @@ -48,7 +53,6 @@ public String getContentType() { * Sets the content type. * * @param contentType The content type. - * * @return The updated {@link MessageContent} object. */ public MessageContent setContentType(String contentType) { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/ClientOptions.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/ClientOptions.java index c824701878c7..2c468dab74ae 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/ClientOptions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/ClientOptions.java @@ -27,6 +27,12 @@ public class ClientOptions { private MetricsOptions metricsOptions; + /** + * Creates a new instance of {@link ClientOptions}. + */ + public ClientOptions() { + } + /** * Gets the application ID. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/ExpandableStringEnum.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/ExpandableStringEnum.java index 3b9b2b1ad165..b70d5b352e39 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/ExpandableStringEnum.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/ExpandableStringEnum.java @@ -23,6 +23,18 @@ public abstract class ExpandableStringEnum> { private String name; private Class clazz; + /** + * Creates a new instance of {@link ExpandableStringEnum} without a {@link #toString()} value. + *

    + * This constructor shouldn't be called as it will produce a {@link ExpandableStringEnum} which doesn't + * have a String enum value. + * + * @deprecated Use the {@link #fromString(String, Class)} factory method. + */ + @Deprecated + public ExpandableStringEnum() { + } + /** * Creates an instance of the specific expandable string enum from a String. * diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/HttpClientOptions.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/HttpClientOptions.java index 415f599157c3..6fb1942c1401 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/HttpClientOptions.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/HttpClientOptions.java @@ -57,6 +57,12 @@ public final class HttpClientOptions extends ClientOptions { private Duration connectionIdleTimeout; private Class httpClientProvider; + /** + * Creates a new instance of {@link HttpClientOptions}. + */ + public HttpClientOptions() { + } + @Override public HttpClientOptions setApplicationId(String applicationId) { super.setApplicationId(applicationId); diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/AsyncPollResponse.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/AsyncPollResponse.java index 9ae1d1c6437b..a8c471606dc7 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/AsyncPollResponse.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/AsyncPollResponse.java @@ -54,6 +54,7 @@ public final class AsyncPollResponse { /** * Represents the status of the long-running operation at the time the last polling operation finished successfully. + * * @return A {@link LongRunningOperationStatus} representing the result of the poll operation. */ public LongRunningOperationStatus getStatus() { @@ -71,7 +72,10 @@ public T getValue() { } /** - * @return a Mono, upon subscription it cancels the remote long-running operation if cancellation + * Gets a {@link Mono} whereupon subscription it cancels the remote long-running operation if cancellation is + * supported by the service. + * + * @return A {@link Mono} whereupon subscription it cancels the remote long-running operation if cancellation * is supported by the service. */ public Mono cancelOperation() { @@ -86,9 +90,14 @@ public Mono cancelOperation() { } /** - * @return a Mono, upon subscription it fetches the final result of long-running operation if it - * is supported by the service. If the long-running operation is not completed, then an empty - * Mono will be returned. + * Gets a {@link Mono} whereupon subscription it fetches the final result of the long-running operation if it is + * supported by the service. + *

    + * If the long-running operation isn't complete an empty {@link Mono} will be returned. + * + * @return A {@link Mono} whereupon subscription it fetches the final result of the long-running operation if it is + * supported by the service. If the long-running operation is not completed, then an empty {@link Mono} will be + * returned. */ public Mono getFinalResult() { return Mono.defer(() -> { diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/LongRunningOperationStatus.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/LongRunningOperationStatus.java index 1e63ba9c5750..3246b671ed8b 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/LongRunningOperationStatus.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/LongRunningOperationStatus.java @@ -18,6 +18,18 @@ public final class LongRunningOperationStatus extends ExpandableStringEnum + * This constructor shouldn't be called as it will produce a {@link LongRunningOperationStatus} which doesn't + * have a String enum value. + * + * @deprecated Use one of the constants or the {@link #fromString(String, boolean)} factory method. + */ + @Deprecated + public LongRunningOperationStatus() { + } + /** Represents that polling has not yet started for this long-running operation. */ public static final LongRunningOperationStatus NOT_STARTED = fromString("NOT_STARTED", false); @@ -41,7 +53,7 @@ public final class LongRunningOperationStatus extends ExpandableStringEnum operationStatusMap; + private static final Map OPERATION_STATUS_MAP; static { Map opStatusMap = new HashMap<>(); opStatusMap.put(NOT_STARTED.toString(), NOT_STARTED); @@ -49,7 +61,7 @@ public final class LongRunningOperationStatus extends ExpandableStringEnum> actual) { } /** + * Gets a synchronous blocking poller. + * * @return a synchronous blocking poller. */ public SyncPoller getSyncPoller() { @@ -521,11 +523,11 @@ private Duration getDelay(PollResponse pollResponse) { /** * A utility to get One-Time-Executable-Mono that execute an activation function at most once. - * + *

    * When subscribed to such a Mono it internally subscribes to a Mono that perform an activation * function. The One-Time-Executable-Mono caches the result of activation function as a PollResponse * in {@code rootContext}, this cached response will be used by any future subscriptions. - * + *

    * Note: The standard cache() operator can't be used to achieve one time execution, because it caches * error terminal signal and forward it to any future subscriptions. If there is an error while executing * activation function then error should not be cached but it should be forward it to subscription that @@ -533,7 +535,7 @@ private Duration getDelay(PollResponse pollResponse) { * instead activation function should again invoked. Once a subscription result in successful execution * of activation function then it will be cached in {@code rootContext} and will be used by any future * subscriptions. - * + *

    * The One-Time-Executable-Mono handles concurrent calls to activation. Only one of them will be able * to execute the activation function and other subscriptions will keep resubscribing until it sees * a activation happened or get a chance to call activation as the one previously entered the critical diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/PollingContext.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/PollingContext.java index 6cd090f1fa64..f282f141b4d8 100644 --- a/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/PollingContext.java +++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/polling/PollingContext.java @@ -46,14 +46,18 @@ public PollingContext setData(String name, String value) { } /** - * @return the activation {@link PollResponse} holding result of activation operation call. + * Gets the activation {@link PollResponse} holding the result of an activation operation call. + * + * @return The activation {@link PollResponse} holding the result of an activation operation call. */ public PollResponse getActivationResponse() { return this.activationResponse; } /** - * @return the latest {@link PollResponse} from pollOperation. + * Gets the latest {@link PollResponse} in the polling operation. + * + * @return The latest {@link PollResponse} in the polling operation. */ public PollResponse getLatestResponse() { return this.latestResponse; @@ -62,20 +66,15 @@ public PollResponse getLatestResponse() { /** * Sets latest {@link PollResponse} from pollOperation. * - * PACKAGE INTERNAL METHOD - * * @param latestResponse the poll response */ void setLatestResponse(PollResponse latestResponse) { - this.latestResponse = Objects.requireNonNull(latestResponse, - "'latestResponse' is required."); + this.latestResponse = Objects.requireNonNull(latestResponse, "'latestResponse' is required."); } /** * Sets activation {@link PollResponse} holding result of activation operation call. * - * PACKAGE INTERNAL METHOD - * * @param activationResponse the activation response */ void setOnetimeActivationResponse(PollResponse activationResponse) { @@ -89,15 +88,11 @@ void setOnetimeActivationResponse(PollResponse activationResponse) { } PollingContext copy() { - return new PollingContext<>(this.activationResponse, - this.latestResponse, - new HashMap<>(this.map)); + return new PollingContext<>(this.activationResponse, this.latestResponse, new HashMap<>(this.map)); } /** * Creates PollingContext. - * - * Package internal default constructor. */ PollingContext() { this.map = new HashMap<>(); @@ -110,14 +105,10 @@ PollingContext copy() { * @param latestResponse latest poll response from pollOperation. * @param map the map to store context */ - private PollingContext(PollResponse activationResponse, - PollResponse latestResponse, - Map map) { - this.activationResponse = Objects.requireNonNull(activationResponse, - "'activationResponse' cannot be null."); - this.latestResponse = Objects.requireNonNull(latestResponse, - "'latestResponse' cannot be null."); - this.map = Objects.requireNonNull(map, - "'map' cannot be null."); + private PollingContext(PollResponse activationResponse, PollResponse latestResponse, + Map map) { + this.activationResponse = Objects.requireNonNull(activationResponse, "'activationResponse' cannot be null."); + this.latestResponse = Objects.requireNonNull(latestResponse, "'latestResponse' cannot be null."); + this.map = Objects.requireNonNull(map, "'map' cannot be null."); } } diff --git a/sdk/core/azure-core/src/samples/java/com/azure/core/util/ConfigurationJavaDocCodeSnippet.java b/sdk/core/azure-core/src/samples/java/com/azure/core/util/ConfigurationJavaDocCodeSnippet.java index 105bb9625d69..cd0139c1940a 100644 --- a/sdk/core/azure-core/src/samples/java/com/azure/core/util/ConfigurationJavaDocCodeSnippet.java +++ b/sdk/core/azure-core/src/samples/java/com/azure/core/util/ConfigurationJavaDocCodeSnippet.java @@ -153,6 +153,10 @@ public static final class SampleEnumProperty extends ExpandableStringEnum { String headerValue = context.getHttpRequest().getHeaders().getValue("Authorization"); - Assertions.assertEquals("Basic dXNlcjpwYXNz", headerValue); + Assertions.assertTrue(headerValue != null && headerValue.startsWith("Basic ") && headerValue.length() > 6); return next.process(); }; diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/http/ProxyOptionsTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/http/ProxyOptionsTests.java index ef0f2c141101..96a70e07a72a 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/http/ProxyOptionsTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/http/ProxyOptionsTests.java @@ -41,8 +41,8 @@ public class ProxyOptionsTests { private static final String HTTP = "http"; private static final String PROXY_HOST = "localhost"; - private static final String PROXY_USER = "user"; - private static final String PROXY_PASSWORD = "pass"; + private static final String FAKE_PROXY_USER_PLACEHOLDER = "fakeProxyUserPlaceholder"; + private static final String FAKE_PROXY_PASSWORD_PLACEHOLDER = "fakeProxyPasswordPlaceholder"; private static final String NON_PROXY_HOSTS = "notlocalhost"; private static final String JAVA_SYSTEM_PROXY_PREREQUISITE = "java.net.useSystemProxies"; @@ -61,15 +61,15 @@ public class ProxyOptionsTests { private static final String AZURE_HTTPS_PROXY_HOST_ONLY = String.format("%s://%s", HTTPS, PROXY_HOST); private static final String AZURE_HTTP_PROXY_HOST_ONLY = String.format("%s://%s", HTTP, PROXY_HOST); - private static final String AZURE_HTTPS_PROXY_WITH_USERNAME = String.format("%s://%s@%s", HTTPS, PROXY_USER, + private static final String AZURE_HTTPS_PROXY_WITH_USERNAME = String.format("%s://%s@%s", HTTPS, FAKE_PROXY_USER_PLACEHOLDER, PROXY_HOST); - private static final String AZURE_HTTP_PROXY_WITH_USERNAME = String.format("%s://%s@%s", HTTP, PROXY_USER, + private static final String AZURE_HTTP_PROXY_WITH_USERNAME = String.format("%s://%s@%s", HTTP, FAKE_PROXY_USER_PLACEHOLDER, PROXY_HOST); - private static final String AZURE_HTTPS_PROXY_WITH_USER_AND_PASS = String.format("%s://%s:%s@%s", HTTPS, PROXY_USER, - PROXY_PASSWORD, PROXY_HOST); - private static final String AZURE_HTTP_PROXY_WITH_USER_AND_PASS = String.format("%s://%s:%s@%s", HTTP, PROXY_USER, - PROXY_PASSWORD, PROXY_HOST); + private static final String AZURE_HTTPS_PROXY_WITH_USER_AND_PASS = String.format("%s://%s:%s@%s", HTTPS, FAKE_PROXY_USER_PLACEHOLDER, + FAKE_PROXY_PASSWORD_PLACEHOLDER, PROXY_HOST); + private static final String AZURE_HTTP_PROXY_WITH_USER_AND_PASS = String.format("%s://%s:%s@%s", HTTP, FAKE_PROXY_USER_PLACEHOLDER, + FAKE_PROXY_PASSWORD_PLACEHOLDER, PROXY_HOST); private static final ConfigurationSource EMPTY_SOURCE = new TestConfigurationSource(); /** * Tests that loading a basic configuration from the environment works. @@ -145,8 +145,8 @@ public void mixedExplicitAndEnvironmentConfigurationIsNotSupported() { .put("https.proxyPort", "42"); Configuration configuration = new ConfigurationBuilder(EMPTY_SOURCE, systemProps, EMPTY_SOURCE) - .putProperty("foo.http.proxy.username", PROXY_USER) - .putProperty("http.proxy.password", PROXY_PASSWORD) + .putProperty("foo.http.proxy.username", FAKE_PROXY_USER_PLACEHOLDER) + .putProperty("http.proxy.password", FAKE_PROXY_PASSWORD_PLACEHOLDER) .putProperty("foo.http.proxy.hostname", PROXY_HOST) .buildSection("foo"); @@ -157,8 +157,8 @@ public void mixedExplicitAndEnvironmentConfigurationIsNotSupported() { assertEquals(Proxy.Type.HTTP, proxyOptions.getType().toProxyType()); assertEquals(PROXY_HOST, proxyOptions.getAddress().getHostName()); assertEquals(443, proxyOptions.getAddress().getPort()); - assertEquals(PROXY_USER, proxyOptions.getUsername()); - assertEquals(PROXY_PASSWORD, proxyOptions.getPassword()); + assertEquals(FAKE_PROXY_USER_PLACEHOLDER, proxyOptions.getUsername()); + assertEquals(FAKE_PROXY_PASSWORD_PLACEHOLDER, proxyOptions.getPassword()); } @Test @@ -166,8 +166,8 @@ public void envConfigurationInExplicit() { Configuration configuration = new ConfigurationBuilder() .putProperty("https.proxyHost", PROXY_HOST) .putProperty("https.proxyPort", "8080") - .putProperty("http.proxy.username", PROXY_USER) - .putProperty("http.proxy.password", PROXY_PASSWORD) + .putProperty("http.proxy.username", FAKE_PROXY_USER_PLACEHOLDER) + .putProperty("http.proxy.password", FAKE_PROXY_PASSWORD_PLACEHOLDER) .buildSection("foo"); ProxyOptions proxyOptions = fromConfiguration(configuration, true); @@ -180,8 +180,8 @@ public void envConfigurationInExplicit() { public void defaultHttpPortNull(String port) { ConfigurationBuilder configBuilder = new ConfigurationBuilder() .putProperty("http.proxy.hostname", PROXY_HOST) - .putProperty("http.proxy.username", PROXY_USER) - .putProperty("http.proxy.password", PROXY_PASSWORD); + .putProperty("http.proxy.username", FAKE_PROXY_USER_PLACEHOLDER) + .putProperty("http.proxy.password", FAKE_PROXY_PASSWORD_PLACEHOLDER); if (port != null) { configBuilder.putProperty("http.proxy.port", port); @@ -198,8 +198,8 @@ public void defaultHttpPortNull(String port) { public void invalidHttpPortExplicitConfigThrows(String port) { Configuration configuration = new ConfigurationBuilder() .putProperty("http.proxy.hostname", PROXY_HOST) - .putProperty("http.proxy.username", PROXY_USER) - .putProperty("http.proxy.password", PROXY_PASSWORD) + .putProperty("http.proxy.username", FAKE_PROXY_USER_PLACEHOLDER) + .putProperty("http.proxy.password", FAKE_PROXY_PASSWORD_PLACEHOLDER) .putProperty("http.proxy.port", port) .build(); @@ -252,7 +252,7 @@ private static Stream loadFromEnvironmentSupplier() { // Complete Azure HTTPS proxy. Arguments.of(setJavaSystemProxyPrerequisiteToTrue( new TestConfigurationSource().put(Configuration.PROPERTY_HTTPS_PROXY, AZURE_HTTPS_PROXY_WITH_USER_AND_PASS)), - PROXY_HOST, 443, PROXY_USER, PROXY_PASSWORD, null), + PROXY_HOST, 443, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), // Azure HTTPS proxy with non-proxying hosts. Arguments.of(setJavaSystemProxyPrerequisiteToTrue( @@ -274,7 +274,7 @@ private static Stream loadFromEnvironmentSupplier() { // Complete Azure HTTP proxy. Arguments.of(setJavaSystemProxyPrerequisiteToTrue( new TestConfigurationSource().put(Configuration.PROPERTY_HTTP_PROXY, AZURE_HTTP_PROXY_WITH_USER_AND_PASS)), - PROXY_HOST, 80, PROXY_USER, PROXY_PASSWORD, null), + PROXY_HOST, 80, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), // Azure HTTP proxy with non-proxying hosts. Arguments.of(setJavaSystemProxyPrerequisiteToTrue( @@ -295,12 +295,12 @@ private static Stream loadFromEnvironmentSupplier() { PROXY_HOST, 443, null, null, null), // Username only Java HTTPS proxy. - Arguments.of(createJavaEnvConfiguration(443, PROXY_USER, null, null, true), + Arguments.of(createJavaEnvConfiguration(443, FAKE_PROXY_USER_PLACEHOLDER, null, null, true), PROXY_HOST, 443, null, null, null), // Complete Java HTTPS proxy. - Arguments.of(createJavaEnvConfiguration(443, PROXY_USER, PROXY_PASSWORD, null, true), - PROXY_HOST, 443, PROXY_USER, PROXY_PASSWORD, null), + Arguments.of(createJavaEnvConfiguration(443, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null, true), + PROXY_HOST, 443, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), // Java HTTPS proxy with non-proxying hosts. Arguments.of(createJavaEnvConfiguration(443, null, null, NON_PROXY_HOSTS, true), @@ -311,12 +311,12 @@ private static Stream loadFromEnvironmentSupplier() { PROXY_HOST, 80, null, null, null), // Username only Java HTTP proxy. - Arguments.of(createJavaEnvConfiguration(80, PROXY_USER, null, null, false), + Arguments.of(createJavaEnvConfiguration(80, FAKE_PROXY_USER_PLACEHOLDER, null, null, false), PROXY_HOST, 80, null, null, null), // Complete Java HTTP proxy. - Arguments.of(createJavaEnvConfiguration(80, PROXY_USER, PROXY_PASSWORD, null, false), - PROXY_HOST, 80, PROXY_USER, PROXY_PASSWORD, null), + Arguments.of(createJavaEnvConfiguration(80, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null, false), + PROXY_HOST, 80, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), // Java HTTP proxy with non-proxying hosts. Arguments.of(createJavaEnvConfiguration(80, null, null, NON_PROXY_HOSTS, false), @@ -338,12 +338,12 @@ private static Stream loadFromExplicitConfigurationSupplier() { PROXY_HOST, 443, null, null, null), // Username only Java HTTPS proxy. - Arguments.of(createExplicitConfiguration(443, PROXY_USER, null, null), + Arguments.of(createExplicitConfiguration(443, FAKE_PROXY_USER_PLACEHOLDER, null, null), PROXY_HOST, 443, null, null, null), // Complete Java HTTPS proxy. - Arguments.of(createExplicitConfiguration(443, PROXY_USER, PROXY_PASSWORD, null), - PROXY_HOST, 443, PROXY_USER, PROXY_PASSWORD, null), + Arguments.of(createExplicitConfiguration(443, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), + PROXY_HOST, 443, FAKE_PROXY_USER_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER, null), // Java HTTPS proxy with non-proxying hosts. Arguments.of(createExplicitConfiguration(443, null, null, NON_PROXY_HOSTS), diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/EncodedParameterTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/EncodedParameterTests.java index 83f5e3006adb..922824049871 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/EncodedParameterTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/EncodedParameterTests.java @@ -10,8 +10,8 @@ public class EncodedParameterTests { @Test public void constructor() { - final EncodedParameter ep = new EncodedParameter("ABC", "123"); + final EncodedParameter ep = new EncodedParameter("ABC", "132"); assertEquals("ABC", ep.getName()); - assertEquals("123", ep.getEncodedValue()); + assertEquals("132", ep.getEncodedValue()); } } diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/RestProxyTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/RestProxyTests.java index 9f201a6a1933..5994389ba98e 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/RestProxyTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/http/rest/RestProxyTests.java @@ -227,7 +227,7 @@ public void voidReturningApiClosesResponse() { } @Test - public void voidReturningApiEagerlyReadsResponse() { + public void voidReturningApiIgnoresResponseBody() { LocalHttpClient client = new LocalHttpClient(); HttpPipeline pipeline = new HttpPipelineBuilder() .httpClient(client) @@ -237,12 +237,13 @@ public void voidReturningApiEagerlyReadsResponse() { testInterface.testVoidMethod(); - assertTrue(client.lastContext.getData("azure-eagerly-read-response").isPresent()); - assertTrue((Boolean) client.lastContext.getData("azure-eagerly-read-response").get()); + assertFalse(client.lastContext.getData("azure-eagerly-read-response").isPresent()); + assertTrue(client.lastContext.getData("azure-ignore-response-body").isPresent()); + assertTrue((boolean) client.lastContext.getData("azure-ignore-response-body").get()); } @Test - public void monoVoidReturningApiEagerlyReadsResponse() { + public void monoVoidReturningApiIgnoresResponseBody() { LocalHttpClient client = new LocalHttpClient(); HttpPipeline pipeline = new HttpPipelineBuilder() .httpClient(client) @@ -253,12 +254,13 @@ public void monoVoidReturningApiEagerlyReadsResponse() { testInterface.testMethodReturnsMonoVoid()) .verifyComplete(); - assertTrue(client.lastContext.getData("azure-eagerly-read-response").isPresent()); - assertTrue((Boolean) client.lastContext.getData("azure-eagerly-read-response").get()); + assertFalse(client.lastContext.getData("azure-eagerly-read-response").isPresent()); + assertTrue(client.lastContext.getData("azure-ignore-response-body").isPresent()); + assertTrue((boolean) client.lastContext.getData("azure-ignore-response-body").get()); } @Test - public void monoResponseVoidReturningApiEagerlyReadsResponse() { + public void monoResponseVoidReturningApiIgnoresResponseBody() { LocalHttpClient client = new LocalHttpClient(); HttpPipeline pipeline = new HttpPipelineBuilder() .httpClient(client) @@ -270,12 +272,13 @@ public void monoResponseVoidReturningApiEagerlyReadsResponse() { .expectNextCount(1) .verifyComplete(); - assertTrue(client.lastContext.getData("azure-eagerly-read-response").isPresent()); - assertTrue((Boolean) client.lastContext.getData("azure-eagerly-read-response").get()); + assertFalse(client.lastContext.getData("azure-eagerly-read-response").isPresent()); + assertTrue(client.lastContext.getData("azure-ignore-response-body").isPresent()); + assertTrue((boolean) client.lastContext.getData("azure-ignore-response-body").get()); } @Test - public void responseVoidReturningApiEagerlyReadsResponse() { + public void responseVoidReturningApiIgnoresResponseBody() { LocalHttpClient client = new LocalHttpClient(); HttpPipeline pipeline = new HttpPipelineBuilder() .httpClient(client) @@ -285,8 +288,9 @@ public void responseVoidReturningApiEagerlyReadsResponse() { TestInterface testInterface = RestProxy.create(TestInterface.class, pipeline); testInterface.testMethodReturnsResponseVoid(); - assertTrue(client.lastContext.getData("azure-eagerly-read-response").isPresent()); - assertTrue((Boolean) client.lastContext.getData("azure-eagerly-read-response").get()); + assertFalse(client.lastContext.getData("azure-eagerly-read-response").isPresent()); + assertTrue(client.lastContext.getData("azure-ignore-response-body").isPresent()); + assertTrue((boolean) client.lastContext.getData("azure-ignore-response-body").get()); } @Test diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/ResponseConstructorsCacheBenchMarkTestData.java b/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/ResponseConstructorsCacheBenchMarkTestData.java index 8b996350a8bc..845161f3e633 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/ResponseConstructorsCacheBenchMarkTestData.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/ResponseConstructorsCacheBenchMarkTestData.java @@ -267,8 +267,6 @@ private static byte[] asJsonByteArray(Object object) { class Input { private final Type returnType; - private final boolean returnTypeDecodeable; - private final boolean responseEagerlyRead; private final HttpResponseDecoder.HttpDecodedResponse decodedResponse; private final Object bodyAsObject; @@ -278,9 +276,6 @@ class Input { Mono httpResponse, Object bodyAsObject) { this.returnType = findMethod(serviceClass, methodName).getGenericReturnType(); - Type unwrappedReturnType = SwaggerMethodParser.unwrapReturnType(returnType); - this.returnTypeDecodeable = SwaggerMethodParser.isReturnTypeDecodeable(unwrappedReturnType); - this.responseEagerlyRead = SwaggerMethodParser.isResponseEagerlyRead(unwrappedReturnType); this.decodedResponse = decoder.decode(httpResponse, new HttpResponseDecodeData() { @Override public Type getReturnType() { @@ -292,16 +287,6 @@ public boolean isExpectedResponseStatusCode(int statusCode) { return false; } - @Override - public boolean isReturnTypeDecodeable() { - return returnTypeDecodeable; - } - - @Override - public boolean isResponseEagerlyRead() { - return responseEagerlyRead; - } - @Override public boolean isHeadersEagerlyConverted() { return false; diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/SwaggerMethodParserTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/SwaggerMethodParserTests.java index 5a810bd8856b..121ccf9e2c7e 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/SwaggerMethodParserTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/implementation/http/rest/SwaggerMethodParserTests.java @@ -35,6 +35,7 @@ import com.azure.core.http.rest.Response; import com.azure.core.http.rest.ResponseBase; import com.azure.core.http.rest.SimpleResponse; +import com.azure.core.http.rest.StreamResponse; import com.azure.core.implementation.TypeUtil; import com.azure.core.models.JsonPatchDocument; import com.azure.core.util.Base64Url; @@ -692,7 +693,7 @@ public void isReturnTypeDecodable(Type returnType, boolean expected) { } private static Stream isReturnTypeDecodeableSupplier() { - return returnTypeSupplierForDecodeableAndEagerReading(false); + return returnTypeSupplierForDecodeableAndEagerReading(true, false, false); } @ParameterizedTest @@ -703,143 +704,156 @@ public void isResponseEagerlyRead(Type returnType, boolean expected) { } private static Stream isResponseEagerlyReadSupplier() { - return returnTypeSupplierForDecodeableAndEagerReading(true); + return returnTypeSupplierForDecodeableAndEagerReading(true, false, false); } - private static Stream returnTypeSupplierForDecodeableAndEagerReading(boolean voidTypeStatus) { + @ParameterizedTest + @MethodSource("isResponseBodyIgnoredSupplier") + public void isResponseBodyIgnored(Type returnType, boolean expected) { + Type unwrappedReturnType = SwaggerMethodParser.unwrapReturnType(returnType); + assertEquals(expected, SwaggerMethodParser.isResponseBodyIgnored(unwrappedReturnType)); + } + + private static Stream isResponseBodyIgnoredSupplier() { + return returnTypeSupplierForDecodeableAndEagerReading(false, false, true); + } + + private static Stream returnTypeSupplierForDecodeableAndEagerReading(boolean nonBinaryTypeStatus, + boolean binaryTypeStatus, boolean voidTypeStatus) { return Stream.of( // Unknown response type can't be determined to be decode-able. Arguments.of(null, false), // BinaryData, Byte arrays, ByteBuffers, InputStream, and voids aren't decode-able. - Arguments.of(BinaryData.class, false), + Arguments.of(BinaryData.class, binaryTypeStatus), - Arguments.of(byte[].class, false), + Arguments.of(byte[].class, binaryTypeStatus), // Both ByteBuffer and sub-types shouldn't be decode-able. - Arguments.of(ByteBuffer.class, false), - Arguments.of(MappedByteBuffer.class, false), + Arguments.of(ByteBuffer.class, binaryTypeStatus), + Arguments.of(MappedByteBuffer.class, binaryTypeStatus), // Both InputSteam and sub-types shouldn't be decode-able. - Arguments.of(InputStream.class, false), - Arguments.of(FileInputStream.class, false), + Arguments.of(InputStream.class, binaryTypeStatus), + Arguments.of(FileInputStream.class, binaryTypeStatus), Arguments.of(void.class, voidTypeStatus), Arguments.of(Void.class, voidTypeStatus), Arguments.of(Void.TYPE, voidTypeStatus), // Other POJO types are decode-able. - Arguments.of(JsonPatchDocument.class, true), + Arguments.of(JsonPatchDocument.class, nonBinaryTypeStatus), // In addition to the direct types, reactive and Response generic types should be handled. // Reactive generics. // Mono generics. - Arguments.of(createParameterizedMono(BinaryData.class), false), - Arguments.of(createParameterizedMono(byte[].class), false), - Arguments.of(createParameterizedMono(ByteBuffer.class), false), - Arguments.of(createParameterizedMono(MappedByteBuffer.class), false), - Arguments.of(createParameterizedMono(InputStream.class), false), - Arguments.of(createParameterizedMono(FileInputStream.class), false), + Arguments.of(createParameterizedMono(BinaryData.class), binaryTypeStatus), + Arguments.of(createParameterizedMono(byte[].class), binaryTypeStatus), + Arguments.of(createParameterizedMono(ByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedMono(MappedByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedMono(InputStream.class), binaryTypeStatus), + Arguments.of(createParameterizedMono(FileInputStream.class), binaryTypeStatus), Arguments.of(createParameterizedMono(void.class), voidTypeStatus), Arguments.of(createParameterizedMono(Void.class), voidTypeStatus), Arguments.of(createParameterizedMono(Void.TYPE), voidTypeStatus), - Arguments.of(createParameterizedMono(JsonPatchDocument.class), true), + Arguments.of(createParameterizedMono(JsonPatchDocument.class), nonBinaryTypeStatus), // Flux generics. - Arguments.of(createParameterizedFlux(BinaryData.class), false), - Arguments.of(createParameterizedFlux(byte[].class), false), - Arguments.of(createParameterizedFlux(ByteBuffer.class), false), - Arguments.of(createParameterizedFlux(MappedByteBuffer.class), false), - Arguments.of(createParameterizedFlux(InputStream.class), false), - Arguments.of(createParameterizedFlux(FileInputStream.class), false), + Arguments.of(createParameterizedFlux(BinaryData.class), binaryTypeStatus), + Arguments.of(createParameterizedFlux(byte[].class), binaryTypeStatus), + Arguments.of(createParameterizedFlux(ByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedFlux(MappedByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedFlux(InputStream.class), binaryTypeStatus), + Arguments.of(createParameterizedFlux(FileInputStream.class), binaryTypeStatus), Arguments.of(createParameterizedFlux(void.class), voidTypeStatus), Arguments.of(createParameterizedFlux(Void.class), voidTypeStatus), Arguments.of(createParameterizedFlux(Void.TYPE), voidTypeStatus), - Arguments.of(createParameterizedFlux(JsonPatchDocument.class), true), + Arguments.of(createParameterizedFlux(JsonPatchDocument.class), nonBinaryTypeStatus), // Response generics. // If the raw type is Response it should check the first, and only, generic type. - Arguments.of(createParameterizedResponse(BinaryData.class), false), - Arguments.of(createParameterizedResponse(byte[].class), false), - Arguments.of(createParameterizedResponse(ByteBuffer.class), false), - Arguments.of(createParameterizedResponse(MappedByteBuffer.class), false), - Arguments.of(createParameterizedResponse(InputStream.class), false), - Arguments.of(createParameterizedResponse(FileInputStream.class), false), + Arguments.of(createParameterizedResponse(BinaryData.class), binaryTypeStatus), + Arguments.of(createParameterizedResponse(byte[].class), binaryTypeStatus), + Arguments.of(createParameterizedResponse(ByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedResponse(MappedByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedResponse(InputStream.class), binaryTypeStatus), + Arguments.of(createParameterizedResponse(FileInputStream.class), binaryTypeStatus), Arguments.of(createParameterizedResponse(void.class), voidTypeStatus), Arguments.of(createParameterizedResponse(Void.class), voidTypeStatus), Arguments.of(createParameterizedResponse(Void.TYPE), voidTypeStatus), - Arguments.of(createParameterizedResponse(JsonPatchDocument.class), true), + Arguments.of(createParameterizedResponse(JsonPatchDocument.class), nonBinaryTypeStatus), // If the raw type is ResponseBase it should check the second generic type, the first is deserialized // headers. - Arguments.of(createParameterizedResponseBase(BinaryData.class), false), - Arguments.of(createParameterizedResponseBase(byte[].class), false), - Arguments.of(createParameterizedResponseBase(ByteBuffer.class), false), - Arguments.of(createParameterizedResponseBase(MappedByteBuffer.class), false), - Arguments.of(createParameterizedResponseBase(InputStream.class), false), - Arguments.of(createParameterizedResponseBase(FileInputStream.class), false), + Arguments.of(createParameterizedResponseBase(BinaryData.class), binaryTypeStatus), + Arguments.of(createParameterizedResponseBase(byte[].class), binaryTypeStatus), + Arguments.of(createParameterizedResponseBase(ByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedResponseBase(MappedByteBuffer.class), binaryTypeStatus), + Arguments.of(createParameterizedResponseBase(InputStream.class), binaryTypeStatus), + Arguments.of(createParameterizedResponseBase(FileInputStream.class), binaryTypeStatus), Arguments.of(createParameterizedResponseBase(void.class), voidTypeStatus), Arguments.of(createParameterizedResponseBase(Void.class), voidTypeStatus), Arguments.of(createParameterizedResponseBase(Void.TYPE), voidTypeStatus), - Arguments.of(createParameterizedResponseBase(JsonPatchDocument.class), true), + Arguments.of(createParameterizedResponseBase(JsonPatchDocument.class), nonBinaryTypeStatus), // Reactive generics containing response generics. // Mono of Response - Arguments.of(createParameterizedMono(createParameterizedResponse(BinaryData.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponse(byte[].class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponse(ByteBuffer.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponse(MappedByteBuffer.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponse(InputStream.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponse(FileInputStream.class)), false), + Arguments.of(createParameterizedMono(createParameterizedResponse(BinaryData.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponse(byte[].class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponse(ByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponse(MappedByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponse(InputStream.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponse(FileInputStream.class)), binaryTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponse(void.class)), voidTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponse(Void.class)), voidTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponse(Void.TYPE)), voidTypeStatus), - Arguments.of(createParameterizedMono(createParameterizedResponse(JsonPatchDocument.class)), true), + Arguments.of(createParameterizedMono(createParameterizedResponse(JsonPatchDocument.class)), nonBinaryTypeStatus), // Mono of ResponseBase - Arguments.of(createParameterizedMono(createParameterizedResponseBase(BinaryData.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(byte[].class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(ByteBuffer.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(MappedByteBuffer.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(InputStream.class)), false), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(FileInputStream.class)), false), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(BinaryData.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(byte[].class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(ByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(MappedByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(InputStream.class)), binaryTypeStatus), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(FileInputStream.class)), binaryTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponseBase(void.class)), voidTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponseBase(Void.class)), voidTypeStatus), Arguments.of(createParameterizedMono(createParameterizedResponseBase(Void.TYPE)), voidTypeStatus), - Arguments.of(createParameterizedMono(createParameterizedResponseBase(JsonPatchDocument.class)), true), + Arguments.of(createParameterizedMono(createParameterizedResponseBase(JsonPatchDocument.class)), nonBinaryTypeStatus), // Flux of Response - Arguments.of(createParameterizedFlux(createParameterizedResponse(BinaryData.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponse(byte[].class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponse(ByteBuffer.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponse(MappedByteBuffer.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponse(InputStream.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponse(FileInputStream.class)), false), + Arguments.of(createParameterizedFlux(createParameterizedResponse(BinaryData.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponse(byte[].class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponse(ByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponse(MappedByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponse(InputStream.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponse(FileInputStream.class)), binaryTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponse(void.class)), voidTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponse(Void.class)), voidTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponse(Void.TYPE)), voidTypeStatus), - Arguments.of(createParameterizedFlux(createParameterizedResponse(JsonPatchDocument.class)), true), + Arguments.of(createParameterizedFlux(createParameterizedResponse(JsonPatchDocument.class)), nonBinaryTypeStatus), // Flux of ResponseBase - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(BinaryData.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(byte[].class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(ByteBuffer.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(MappedByteBuffer.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(InputStream.class)), false), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(FileInputStream.class)), false), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(BinaryData.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(byte[].class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(ByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(MappedByteBuffer.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(InputStream.class)), binaryTypeStatus), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(FileInputStream.class)), binaryTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponseBase(void.class)), voidTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponseBase(Void.class)), voidTypeStatus), Arguments.of(createParameterizedFlux(createParameterizedResponseBase(Void.TYPE)), voidTypeStatus), - Arguments.of(createParameterizedFlux(createParameterizedResponseBase(JsonPatchDocument.class)), true), + Arguments.of(createParameterizedFlux(createParameterizedResponseBase(JsonPatchDocument.class)), nonBinaryTypeStatus), // Custom implementations of Response and ResponseBase. Arguments.of(VoidResponse.class, voidTypeStatus), - Arguments.of(StringResponse.class, true), + Arguments.of(StringResponse.class, nonBinaryTypeStatus), + Arguments.of(StreamResponse.class, binaryTypeStatus), Arguments.of(VoidResponseWithDeserializedHeaders.class, voidTypeStatus), - Arguments.of(StringResponseWithDeserializedHeaders.class, true) + Arguments.of(StringResponseWithDeserializedHeaders.class, nonBinaryTypeStatus) ); } diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/ConfigurationTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/ConfigurationTests.java index ff65244b5b4f..fbc9b216458a 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/ConfigurationTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/ConfigurationTests.java @@ -545,7 +545,7 @@ private static Stream properties() { private static Stream validIntStrings() { return Stream.of( - Arguments.of("123", 123), + Arguments.of("132", 132), Arguments.of("-321", -321), Arguments.of("0", 0), Arguments.of("2147483647", Integer.MAX_VALUE) @@ -563,7 +563,7 @@ private static Stream invalidIntStrings() { private static Stream validDurationStrings() { return Stream.of( Arguments.of("0", Duration.ofMillis(0)), - Arguments.of("123", Duration.ofMillis(123)), + Arguments.of("132", Duration.ofMillis(132)), Arguments.of("2147483648", Duration.ofMillis(2147483648L)) ); } diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/ExpandableStringEnumTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/ExpandableStringEnumTests.java index 1ff31b6329df..2435ac98f134 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/ExpandableStringEnumTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/ExpandableStringEnumTests.java @@ -88,24 +88,40 @@ private static Stream validateEqualsSupplier() { } public static final class TestStringEnum extends ExpandableStringEnum { + @Deprecated + public TestStringEnum() { + } + static TestStringEnum fromString(String name) { return fromString(name, TestStringEnum.class); } } public static final class TestStringEnum2 extends ExpandableStringEnum { + @Deprecated + public TestStringEnum2() { + } + static TestStringEnum2 fromString(String name) { return fromString(name, TestStringEnum2.class); } } private static final class PrivateStringEnum extends ExpandableStringEnum { + @Deprecated + private PrivateStringEnum() { + } + static PrivateStringEnum fromString(String name) { return fromString(name, PrivateStringEnum.class); } } public static final class ValuesTestStringEnum extends ExpandableStringEnum { + @Deprecated + public ValuesTestStringEnum() { + } + static ValuesTestStringEnum fromString(String name) { return fromString(name, ValuesTestStringEnum.class); } diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlBuilderTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlBuilderTests.java index 4b8fe5f4132f..1369a7d561e7 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlBuilderTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlBuilderTests.java @@ -346,8 +346,8 @@ public void portStringWhenPortIsEmpty() { public void portStringWhenPortIsNotEmpty() { final UrlBuilder builder = new UrlBuilder() .setPort(8080); - builder.setPort("123"); - assertEquals(123, builder.getPort()); + builder.setPort("132"); + assertEquals(132, builder.getPort()); } @Test diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlTokenizerTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlTokenizerTests.java index 50f657c170ca..a82bde22d991 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlTokenizerTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/UrlTokenizerTests.java @@ -85,37 +85,37 @@ public void nextWithSchemeAndHostAndPort() { @Test public void nextWithSchemeAndHostAndPortAndForwardSlash() { - nextTest("ftp://www.bing.com:123/", + nextTest("ftp://www.bing.com:132/", UrlToken.scheme("ftp"), UrlToken.host("www.bing.com"), - UrlToken.port("123"), + UrlToken.port("132"), UrlToken.path("/")); } @Test public void nextWithSchemeAndHostAndPortAndPath() { - nextTest("ftp://www.bing.com:123/a/b/c.txt", + nextTest("ftp://www.bing.com:132/a/b/c.txt", UrlToken.scheme("ftp"), UrlToken.host("www.bing.com"), - UrlToken.port("123"), + UrlToken.port("132"), UrlToken.path("/a/b/c.txt")); } @Test public void nextWithSchemeAndHostAndPortAndQuestionMark() { - nextTest("ftp://www.bing.com:123?", + nextTest("ftp://www.bing.com:132?", UrlToken.scheme("ftp"), UrlToken.host("www.bing.com"), - UrlToken.port("123"), + UrlToken.port("132"), UrlToken.query("")); } @Test public void nextWithSchemeAndHostAndPortAndQuery() { - nextTest("ftp://www.bing.com:123?a=b&c=d", + nextTest("ftp://www.bing.com:132?a=b&c=d", UrlToken.scheme("ftp"), UrlToken.host("www.bing.com"), - UrlToken.port("123"), + UrlToken.port("132"), UrlToken.query("a=b&c=d")); } diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/polling/PollingStrategyTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/polling/PollingStrategyTests.java index 98f9955ae758..35b83bd421fd 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/polling/PollingStrategyTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/polling/PollingStrategyTests.java @@ -6,9 +6,11 @@ import com.azure.core.http.HttpClient; import com.azure.core.http.HttpHeaders; import com.azure.core.http.HttpMethod; +import com.azure.core.http.HttpPipeline; import com.azure.core.http.HttpPipelineBuilder; import com.azure.core.http.HttpRequest; import com.azure.core.http.MockHttpResponse; +import com.azure.core.http.policy.RetryPolicy; import com.azure.core.http.rest.Response; import com.azure.core.http.rest.SimpleResponse; import com.azure.core.implementation.serializer.DefaultJsonSerializer; @@ -19,6 +21,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.Mock; @@ -28,7 +31,9 @@ import reactor.test.StepVerifier; import java.time.Duration; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -492,6 +497,64 @@ public void pollingStrategyPassContextToHttpClient() { assertEquals(3, activationCallCount[0]); } + @ParameterizedTest + @MethodSource("statusCodeProvider") + public void retryPollingOperationWithPostActivationOperation(int[] args) { + int[] activationCallCount = new int[1]; + activationCallCount[0] = 0; + String mockPollUrl = "http://localhost/poll"; + String finalResultUrl = "http://localhost/final"; + when(activationOperation.get()).thenReturn(Mono.defer(() -> { + activationCallCount[0]++; + SimpleResponse response = new SimpleResponse<>( + new HttpRequest(HttpMethod.POST, "http://localhost"), + 200, + new HttpHeaders().set("Operation-Location", mockPollUrl).set("Location", finalResultUrl), + new PollResult("InProgress")); + return Mono.just(response); + })); + + HttpRequest pollRequest = new HttpRequest(HttpMethod.GET, mockPollUrl); + AtomicInteger attemptCount = new AtomicInteger(); + HttpPipeline pipeline = new HttpPipelineBuilder() + .policies(new RetryPolicy()) + .httpClient(request -> { + int count = attemptCount.getAndIncrement(); + if (mockPollUrl.equals(request.getUrl().toString()) && count == 0) { + return Mono.just(new MockHttpResponse(pollRequest, args[0], + new HttpHeaders().set("Location", finalResultUrl), + new PollResult("Retry"))); + } else if (mockPollUrl.equals(request.getUrl().toString()) && count == 1) { + return Mono.just(new MockHttpResponse(pollRequest, args[1], + new HttpHeaders().set("Location", finalResultUrl), + new PollResult("Succeeded"))); + } else if (finalResultUrl.equals(request.getUrl().toString())) { + return Mono.just(new MockHttpResponse(pollRequest, args[2], new HttpHeaders(), + new PollResult("final-state"))); + } else { + return Mono.error(new IllegalArgumentException("Unknown request URL " + request.getUrl())); + } + }) + .build(); + PollerFlux pollerFlux = PollerFlux.create( + Duration.ofSeconds(1), + () -> activationOperation.get(), + new OperationResourcePollingStrategy<>(pipeline), + new TypeReference() { }, new TypeReference() { }); + + StepVerifier.create(pollerFlux.takeUntil(apr -> apr.getStatus().isComplete()).last().flatMap(AsyncPollResponse::getFinalResult)) + .expectNextMatches(pollResult -> "final-state".equals(pollResult.getStatus())) + .verifyComplete(); + assertEquals(args[3], attemptCount.get()); + assertEquals(1, activationCallCount[0]); + } + + static Stream statusCodeProvider() { + return Stream.of( + new int[]{500, 200, 200, 3}, + new int[]{200, 500, 200, 2}); + } + public static class PollResult { private String status; private String resourceLocation; diff --git a/sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityTests.java b/sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityIT.java similarity index 89% rename from sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityTests.java rename to sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityIT.java index cc5629f2ce7f..3b164a0f77fb 100644 --- a/sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityTests.java +++ b/sdk/core/azure-core/src/test/java/com/azure/core/util/serializer/JacksonAdapterSecurityIT.java @@ -13,7 +13,6 @@ import org.junit.jupiter.api.parallel.Isolated; import java.net.URISyntaxException; -import java.security.Policy; import java.security.URIParameter; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -26,18 +25,18 @@ @SuppressWarnings("removal") @Execution(ExecutionMode.SAME_THREAD) @Isolated("Mutates the global SecurityManager") -public class JacksonAdapterSecurityTests { +public class JacksonAdapterSecurityIT { private static final String A_PROPERTY_JSON = "{\"aProperty\":\"aValue\"}"; private static final SimplePojo EXPECTED_SIMPLE_POJO = new SimplePojo("aValue"); private boolean originalUseAccessHelper; private SecurityManager originalManager; - private Policy originalPolicy; + private java.security.Policy originalPolicy; public void captureDefaultConfigurations() { originalUseAccessHelper = JacksonAdapter.isUseAccessHelper(); originalManager = System.getSecurityManager(); - originalPolicy = Policy.getPolicy(); + originalPolicy = java.security.Policy.getPolicy(); // Set the System property codebase.azure-core to the location of JacksonAdapter's codebase. // This gets picked up by the policy setting to prevent needing to hardcode the code base location. @@ -56,7 +55,7 @@ public void captureDefaultConfigurations() { public void revertDefaultConfigurations() throws NoSuchMethodException, NoSuchFieldException { JacksonAdapter.setUseAccessHelper(originalUseAccessHelper); System.setSecurityManager(originalManager); - Policy.setPolicy(originalPolicy); + java.security.Policy.setPolicy(originalPolicy); // Now that the properties have been used, clear them. System.clearProperty("codebase.azure-core"); @@ -81,7 +80,8 @@ public void securityPreventsSerialization() throws Exception { try { JacksonAdapter adapter = new JacksonAdapter(); - Policy.setPolicy(Policy.getInstance("JavaPolicy", getUriParameter("basic-permissions.policy"))); + java.security.Policy.setPolicy(java.security.Policy + .getInstance("JavaPolicy", getUriParameter("basic-permissions.policy"))); System.setSecurityManager(new SecurityManager()); assertThrows(InvalidDefinitionException.class, () -> @@ -102,7 +102,8 @@ public void securityAndAccessHelperNotMatchingPreventsSerialization() throws Exc JacksonAdapter adapter = new JacksonAdapter(); JacksonAdapter.setUseAccessHelper(true); - Policy.setPolicy(Policy.getInstance("JavaPolicy", getUriParameter("basic-permissions.policy"))); + java.security.Policy.setPolicy(java.security.Policy + .getInstance("JavaPolicy", getUriParameter("basic-permissions.policy"))); System.setSecurityManager(new SecurityManager()); assertThrows(InvalidDefinitionException.class, () -> @@ -123,7 +124,8 @@ public void securityAndAccessHelperWorks() throws Exception { JacksonAdapter adapter = new JacksonAdapter(); JacksonAdapter.setUseAccessHelper(true); - Policy.setPolicy(Policy.getInstance("JavaPolicy", getUriParameter("access-helper-succeeds.policy"))); + java.security.Policy.setPolicy(java.security.Policy + .getInstance("JavaPolicy", getUriParameter("access-helper-succeeds.policy"))); System.setSecurityManager(new SecurityManager()); SimplePojo actual = assertDoesNotThrow(() -> @@ -154,7 +156,7 @@ public void noSecurityRestrictionsWorks() throws Exception { } private static URIParameter getUriParameter(String policyFile) throws URISyntaxException { - return new URIParameter(JacksonAdapterSecurityTests.class + return new URIParameter(JacksonAdapterSecurityIT.class .getResource("/JacksonAdapterSecurityPolicies/" + policyFile) .toURI()); } diff --git a/sdk/cosmos/azure-cosmos/CHANGELOG.md b/sdk/cosmos/azure-cosmos/CHANGELOG.md index c379351eec3f..81ad3b192be9 100644 --- a/sdk/cosmos/azure-cosmos/CHANGELOG.md +++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md @@ -7,6 +7,7 @@ #### Breaking Changes #### Bugs Fixed +* Fixed a rare race condition for `query plan` cache exceeding the allowed size limit - See [PR 31859](https://github.com/Azure/azure-sdk-for-java/pull/31859) #### Other Changes diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java index 99eb2f5f85fc..e58fc8721f0d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextFactory.java @@ -212,13 +212,12 @@ private static Mono>, QueryInfo>> getTargetRangesFro queryInfo)); } - private static void tryCacheQueryPlan( + synchronized private static void tryCacheQueryPlan( SqlQuerySpec query, PartitionedQueryExecutionInfo partitionedQueryExecutionInfo, Map queryPlanCache) { - QueryInfo queryInfo = partitionedQueryExecutionInfo.getQueryInfo(); - if (canCacheQuery(queryInfo) && !queryPlanCache.containsKey(query.getQueryText())) { - if (queryPlanCache.size() == Constants.QUERYPLAN_CACHE_SIZE) { + if (canCacheQuery(partitionedQueryExecutionInfo.getQueryInfo()) && !queryPlanCache.containsKey(query.getQueryText())) { + if (queryPlanCache.size() >= Constants.QUERYPLAN_CACHE_SIZE) { logger.warn("Clearing query plan cache as it has reached the maximum size : {}", queryPlanCache.size()); queryPlanCache.clear(); } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/QueryValidationTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/QueryValidationTests.java index cb81f7fc9403..d19999409dc9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/QueryValidationTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/QueryValidationTests.java @@ -44,6 +44,7 @@ import org.testng.annotations.Test; import reactor.core.publisher.Flux; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -51,6 +52,8 @@ import java.util.List; import java.util.Random; import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -242,6 +245,34 @@ private Object[][] query() { }; } + @Test(groups = {"simple"}, timeOut = TIMEOUT, enabled = false) + // To run this test, update the QUERYPLAN_CACHE_SIZE constant to 10. + // The query plan cache size should not hit more than 10 + // Without synchronization, it goes above 10 + public void queryPlanCacheSizeHit() { + + ExecutorService executorService = Executors.newFixedThreadPool(4); + + String pk = "pk"; + CosmosQueryRequestOptions options = new CosmosQueryRequestOptions(); + options.setPartitionKey(new PartitionKey(pk)); + Random random = new Random(); + for (int i = 0; i < 55; i++) { + String query = "select * from c where c.id = '" + UUID.randomUUID() + "'"; + executorService.execute(() -> { + createdContainer.queryItems(query, options, TestObject.class).delaySubscription(Duration.ofSeconds(random.nextInt(3))).subscribe(); + }); + } + + try { + logger.info("Awaiting termination"); + executorService.awaitTermination(10, TimeUnit.SECONDS); + logger.info("Terminating now"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + @Test(groups = {"simple"}, dataProvider = "query", timeOut = TIMEOUT) public void queryPlanCacheSinglePartitionCorrectness(String query) { diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionInnerTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionInnerTests.java index 8f9f62e1bce3..169d1af7f685 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionInnerTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionInnerTests.java @@ -18,7 +18,7 @@ public void testDeserialize() { NetworkConnectionInner model = BinaryData .fromString( - "{\"properties\":{\"provisioningState\":\"f\",\"healthCheckStatus\":\"Warning\",\"networkingResourceGroupName\":\"bfvoowvrv\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"jqppyostronzmy\",\"domainName\":\"fipns\",\"organizationUnit\":\"mcwaekrrjr\",\"domainUsername\":\"fxtsgum\",\"domainPassword\":\"glikkxwslolb\"},\"location\":\"vuzlm\",\"tags\":{\"noigbrnjwmwk\":\"lfktgplcrpwjxe\"},\"id\":\"nbsazejjoqkag\",\"name\":\"hsxttaugzxnf\",\"type\":\"azpxdtnkdmkqjjl\"}") + "{\"properties\":{\"provisioningState\":\"f\",\"healthCheckStatus\":\"Warning\",\"networkingResourceGroupName\":\"bfvoowvrv\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"jqppyostronzmy\",\"domainName\":\"fipns\",\"organizationUnit\":\"mcwaekrrjr\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"vuzlm\",\"tags\":{\"noigbrnjwmwk\":\"lfktgplcrpwjxe\"},\"id\":\"nbsazejjoqkag\",\"name\":\"hsxttaugzxnf\",\"type\":\"azpxdtnkdmkqjjl\"}") .toObject(NetworkConnectionInner.class); Assertions.assertEquals("vuzlm", model.location()); Assertions.assertEquals("lfktgplcrpwjxe", model.tags().get("noigbrnjwmwk")); @@ -27,8 +27,8 @@ public void testDeserialize() { Assertions.assertEquals("jqppyostronzmy", model.subnetId()); Assertions.assertEquals("fipns", model.domainName()); Assertions.assertEquals("mcwaekrrjr", model.organizationUnit()); - Assertions.assertEquals("fxtsgum", model.domainUsername()); - Assertions.assertEquals("glikkxwslolb", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); } @Test @@ -42,8 +42,8 @@ public void testSerialize() { .withSubnetId("jqppyostronzmy") .withDomainName("fipns") .withOrganizationUnit("mcwaekrrjr") - .withDomainUsername("fxtsgum") - .withDomainPassword("glikkxwslolb"); + .withDomainUsername("fakeNamePlaceholder") + .withDomainPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(NetworkConnectionInner.class); Assertions.assertEquals("vuzlm", model.location()); Assertions.assertEquals("lfktgplcrpwjxe", model.tags().get("noigbrnjwmwk")); @@ -52,8 +52,8 @@ public void testSerialize() { Assertions.assertEquals("jqppyostronzmy", model.subnetId()); Assertions.assertEquals("fipns", model.domainName()); Assertions.assertEquals("mcwaekrrjr", model.organizationUnit()); - Assertions.assertEquals("fxtsgum", model.domainUsername()); - Assertions.assertEquals("glikkxwslolb", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); } @SuppressWarnings("unchecked") diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionListResultTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionListResultTests.java index acc6ae9599c8..64826472e2f0 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionListResultTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionListResultTests.java @@ -14,7 +14,7 @@ public void testDeserialize() { NetworkConnectionListResult model = BinaryData .fromString( - "{\"value\":[{\"properties\":{\"provisioningState\":\"wkqnyhg\",\"healthCheckStatus\":\"Pending\",\"networkingResourceGroupName\":\"jivfxzsjabib\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"tawfsdjpvkvp\",\"domainName\":\"xbkzbzkdvncj\",\"organizationUnit\":\"udurgkakmokz\",\"domainUsername\":\"jk\",\"domainPassword\":\"fhmouwq\"},\"location\":\"zrfze\",\"tags\":{\"bjbsybb\":\"bizikayuhq\",\"ldgmfpgvmpip\":\"wrv\",\"x\":\"slthaq\"},\"id\":\"smwutwbdsrezpd\",\"name\":\"hneuyowqkd\",\"type\":\"ytisibir\"},{\"properties\":{\"provisioningState\":\"ikpzimejza\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"xi\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"mbzonokix\",\"domainName\":\"q\",\"organizationUnit\":\"rgz\",\"domainUsername\":\"rlazszrnw\",\"domainPassword\":\"indfpwpjyl\"},\"location\":\"tlhflsjcdhszf\",\"tags\":{\"qmqhldvriii\":\"bgofeljag\",\"vtvsexsowueluq\":\"jnalghf\",\"wws\":\"hahhxvrhmzkwpj\",\"qxujxukndxd\":\"ughftqsx\"},\"id\":\"grjguufzd\",\"name\":\"syqtfi\",\"type\":\"whbotzingamv\"},{\"properties\":{\"provisioningState\":\"o\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"udphqamvdkfwyn\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"tbvkayhmtnvyq\",\"domainName\":\"tkzwpcnpwzc\",\"organizationUnit\":\"esgvvsccyaj\",\"domainUsername\":\"qfhwyg\",\"domainPassword\":\"vdnkfxusem\"},\"location\":\"zrmuhapfcqdps\",\"tags\":{\"vezrypqlmfeo\":\"vpsvuoymgcce\",\"edkowepbqpcrfk\":\"erqwkyhkobopg\",\"tn\":\"wccsnjvcdwxlpqek\"},\"id\":\"htjsying\",\"name\":\"fq\",\"type\":\"tmtdhtmdvypgik\"},{\"properties\":{\"provisioningState\":\"zywkb\",\"healthCheckStatus\":\"Unknown\",\"networkingResourceGroupName\":\"uzhlhkjoqrv\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"atjinrvgoupmfiib\",\"domainName\":\"gjio\",\"organizationUnit\":\"vrwxkv\",\"domainUsername\":\"k\",\"domainPassword\":\"lqwjygvjayvblm\"},\"location\":\"k\",\"tags\":{\"opbyrqufegxu\":\"bxvvyhg\",\"bnhlmc\":\"wz\",\"dn\":\"l\",\"ijejvegrhbpn\":\"itvgbmhrixkwm\"},\"id\":\"ixexcc\",\"name\":\"dreaxh\",\"type\":\"exdrrvqahqkg\"}],\"nextLink\":\"pwijnhy\"}") + "{\"value\":[{\"properties\":{\"provisioningState\":\"wkqnyhg\",\"healthCheckStatus\":\"Pending\",\"networkingResourceGroupName\":\"jivfxzsjabib\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"tawfsdjpvkvp\",\"domainName\":\"xbkzbzkdvncj\",\"organizationUnit\":\"udurgkakmokz\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"zrfze\",\"tags\":{\"bjbsybb\":\"bizikayuhq\",\"ldgmfpgvmpip\":\"wrv\",\"x\":\"slthaq\"},\"id\":\"smwutwbdsrezpd\",\"name\":\"hneuyowqkd\",\"type\":\"ytisibir\"},{\"properties\":{\"provisioningState\":\"ikpzimejza\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"xi\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"mbzonokix\",\"domainName\":\"q\",\"organizationUnit\":\"rgz\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"tlhflsjcdhszf\",\"tags\":{\"qmqhldvriii\":\"bgofeljag\",\"vtvsexsowueluq\":\"jnalghf\",\"wws\":\"hahhxvrhmzkwpj\",\"qxujxukndxd\":\"ughftqsx\"},\"id\":\"grjguufzd\",\"name\":\"syqtfi\",\"type\":\"whbotzingamv\"},{\"properties\":{\"provisioningState\":\"o\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"udphqamvdkfwyn\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"tbvkayhmtnvyq\",\"domainName\":\"tkzwpcnpwzc\",\"organizationUnit\":\"esgvvsccyaj\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"zrmuhapfcqdps\",\"tags\":{\"vezrypqlmfeo\":\"vpsvuoymgcce\",\"edkowepbqpcrfk\":\"erqwkyhkobopg\",\"tn\":\"wccsnjvcdwxlpqek\"},\"id\":\"htjsying\",\"name\":\"fq\",\"type\":\"tmtdhtmdvypgik\"},{\"properties\":{\"provisioningState\":\"zywkb\",\"healthCheckStatus\":\"Unknown\",\"networkingResourceGroupName\":\"uzhlhkjoqrv\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"atjinrvgoupmfiib\",\"domainName\":\"gjio\",\"organizationUnit\":\"vrwxkv\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"k\",\"tags\":{\"opbyrqufegxu\":\"bxvvyhg\",\"bnhlmc\":\"wz\",\"dn\":\"l\",\"ijejvegrhbpn\":\"itvgbmhrixkwm\"},\"id\":\"ixexcc\",\"name\":\"dreaxh\",\"type\":\"exdrrvqahqkg\"}],\"nextLink\":\"pwijnhy\"}") .toObject(NetworkConnectionListResult.class); } diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionUpdateTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionUpdateTests.java index c34e8e63116c..8a28d6b73628 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionUpdateTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionUpdateTests.java @@ -17,15 +17,15 @@ public void testDeserialize() { NetworkConnectionUpdate model = BinaryData .fromString( - "{\"properties\":{\"subnetId\":\"o\",\"domainName\":\"ttpkiwkkbnujrywv\",\"organizationUnit\":\"lbfpncurd\",\"domainUsername\":\"wiithtywub\",\"domainPassword\":\"bihwqknfdnt\"},\"tags\":{\"dzjlu\":\"hrdgoihxumwcto\",\"wtovvtgsein\":\"dfdlwggyts\",\"knpirgnepttwq\":\"fiufx\",\"mqnrojlpijnkr\":\"sniffc\"},\"location\":\"rddh\"}") + "{\"properties\":{\"subnetId\":\"o\",\"domainName\":\"ttpkiwkkbnujrywv\",\"organizationUnit\":\"lbfpncurd\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"tags\":{\"dzjlu\":\"hrdgoihxumwcto\",\"wtovvtgsein\":\"dfdlwggyts\",\"knpirgnepttwq\":\"fiufx\",\"mqnrojlpijnkr\":\"sniffc\"},\"location\":\"rddh\"}") .toObject(NetworkConnectionUpdate.class); Assertions.assertEquals("hrdgoihxumwcto", model.tags().get("dzjlu")); Assertions.assertEquals("rddh", model.location()); Assertions.assertEquals("o", model.subnetId()); Assertions.assertEquals("ttpkiwkkbnujrywv", model.domainName()); Assertions.assertEquals("lbfpncurd", model.organizationUnit()); - Assertions.assertEquals("wiithtywub", model.domainUsername()); - Assertions.assertEquals("bihwqknfdnt", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); } @Test @@ -46,16 +46,16 @@ public void testSerialize() { .withSubnetId("o") .withDomainName("ttpkiwkkbnujrywv") .withOrganizationUnit("lbfpncurd") - .withDomainUsername("wiithtywub") - .withDomainPassword("bihwqknfdnt"); + .withDomainUsername("fakeNamePlaceholder") + .withDomainPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(NetworkConnectionUpdate.class); Assertions.assertEquals("hrdgoihxumwcto", model.tags().get("dzjlu")); Assertions.assertEquals("rddh", model.location()); Assertions.assertEquals("o", model.subnetId()); Assertions.assertEquals("ttpkiwkkbnujrywv", model.domainName()); Assertions.assertEquals("lbfpncurd", model.organizationUnit()); - Assertions.assertEquals("wiithtywub", model.domainUsername()); - Assertions.assertEquals("bihwqknfdnt", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); } @SuppressWarnings("unchecked") diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsCreateOrUpdateMockTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsCreateOrUpdateMockTests.java index 033869cd765a..474732dd4a44 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsCreateOrUpdateMockTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsCreateOrUpdateMockTests.java @@ -34,7 +34,7 @@ public void testCreateOrUpdate() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"properties\":{\"provisioningState\":\"Succeeded\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"ov\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"ashcxlpmjerbdk\",\"domainName\":\"vidizozsdb\",\"organizationUnit\":\"xjmonf\",\"domainUsername\":\"nwncypuuw\",\"domainPassword\":\"tvuqjctzenkeifzz\"},\"location\":\"kdasvflyhbxcudch\",\"tags\":{\"ldforobwj\":\"rb\",\"vacqpbtuodxesz\":\"vizbfhfo\",\"rrwoycqucwyhahn\":\"bbelawumuaslzk\"},\"id\":\"mdr\",\"name\":\"ywuhpsvfuur\",\"type\":\"tlwexxwlalniexz\"}"; + "{\"properties\":{\"provisioningState\":\"Succeeded\",\"healthCheckStatus\":\"Running\",\"networkingResourceGroupName\":\"ov\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"ashcxlpmjerbdk\",\"domainName\":\"vidizozsdb\",\"organizationUnit\":\"xjmonf\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"kdasvflyhbxcudch\",\"tags\":{\"ldforobwj\":\"rb\",\"vacqpbtuodxesz\":\"vizbfhfo\",\"rrwoycqucwyhahn\":\"bbelawumuaslzk\"},\"id\":\"mdr\",\"name\":\"ywuhpsvfuur\",\"type\":\"tlwexxwlalniexz\"}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -74,8 +74,8 @@ public void testCreateOrUpdate() throws Exception { .withSubnetId("pmzznrtffya") .withDomainName("tmhheioqa") .withOrganizationUnit("v") - .withDomainUsername("ufuqyrx") - .withDomainPassword("lcgqlsismj") + .withDomainUsername("fakeNamePlaceholder") + .withDomainPassword("fakePasswordPlaceholder") .create(); Assertions.assertEquals("kdasvflyhbxcudch", response.location()); @@ -85,8 +85,8 @@ public void testCreateOrUpdate() throws Exception { Assertions.assertEquals("ashcxlpmjerbdk", response.subnetId()); Assertions.assertEquals("vidizozsdb", response.domainName()); Assertions.assertEquals("xjmonf", response.organizationUnit()); - Assertions.assertEquals("nwncypuuw", response.domainUsername()); - Assertions.assertEquals("tvuqjctzenkeifzz", response.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", response.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", response.domainPassword()); } @SuppressWarnings("unchecked") diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListByResourceGroupMockTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListByResourceGroupMockTests.java index 60b3239dbe98..2743f2410e54 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListByResourceGroupMockTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListByResourceGroupMockTests.java @@ -34,7 +34,7 @@ public void testListByResourceGroup() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"properties\":{\"provisioningState\":\"pdvjdhttzaefedx\",\"healthCheckStatus\":\"Failed\",\"networkingResourceGroupName\":\"rphkmcrjdqnsdfz\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"tg\",\"domainName\":\"lkdghr\",\"organizationUnit\":\"uutlwxezwzhok\",\"domainUsername\":\"wnhhtqlgehgppip\",\"domainPassword\":\"hpfeoajvgcxtxjc\"},\"location\":\"eafidltugsresm\",\"tags\":{\"rhptilluc\":\"jhoiftxfkfweg\",\"cwsldri\":\"iqtgdqoh\",\"bphbqzmizakakank\":\"etpwbralll\",\"n\":\"p\"},\"id\":\"zhajoylhjlmuo\",\"name\":\"xprimrsop\",\"type\":\"eecjmeis\"}]}"; + "{\"value\":[{\"properties\":{\"provisioningState\":\"pdvjdhttzaefedx\",\"healthCheckStatus\":\"Failed\",\"networkingResourceGroupName\":\"rphkmcrjdqnsdfz\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"tg\",\"domainName\":\"lkdghr\",\"organizationUnit\":\"uutlwxezwzhok\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"eafidltugsresm\",\"tags\":{\"rhptilluc\":\"jhoiftxfkfweg\",\"cwsldri\":\"iqtgdqoh\",\"bphbqzmizakakank\":\"etpwbralll\",\"n\":\"p\"},\"id\":\"zhajoylhjlmuo\",\"name\":\"xprimrsop\",\"type\":\"eecjmeis\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -72,7 +72,7 @@ public void testListByResourceGroup() throws Exception { Assertions.assertEquals("tg", response.iterator().next().subnetId()); Assertions.assertEquals("lkdghr", response.iterator().next().domainName()); Assertions.assertEquals("uutlwxezwzhok", response.iterator().next().organizationUnit()); - Assertions.assertEquals("wnhhtqlgehgppip", response.iterator().next().domainUsername()); - Assertions.assertEquals("hpfeoajvgcxtxjc", response.iterator().next().domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", response.iterator().next().domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", response.iterator().next().domainPassword()); } } diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListMockTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListMockTests.java index 7c49c9f9f9cc..5504e5eb3e09 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListMockTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkConnectionsListMockTests.java @@ -34,7 +34,7 @@ public void testList() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"properties\":{\"provisioningState\":\"ddjib\",\"healthCheckStatus\":\"Failed\",\"networkingResourceGroupName\":\"ititvtzeexavoxt\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"ecdmdqbwpy\",\"domainName\":\"tgsfja\",\"organizationUnit\":\"slhhxudbxv\",\"domainUsername\":\"htnsi\",\"domainPassword\":\"dhzmmesckdlp\"},\"location\":\"zrcxfailcfxwmdbo\",\"tags\":{\"ckknhxkizvy\":\"gsftufqobrjlnacg\",\"nok\":\"nrzvuljraaer\",\"a\":\"gukkjqnvbroy\"},\"id\":\"xulcdisdos\",\"name\":\"jbjsvgjrwh\",\"type\":\"yvycytdclxgcckn\"}]}"; + "{\"value\":[{\"properties\":{\"provisioningState\":\"ddjib\",\"healthCheckStatus\":\"Failed\",\"networkingResourceGroupName\":\"ititvtzeexavoxt\",\"domainJoinType\":\"AzureADJoin\",\"subnetId\":\"ecdmdqbwpy\",\"domainName\":\"tgsfja\",\"organizationUnit\":\"slhhxudbxv\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"},\"location\":\"zrcxfailcfxwmdbo\",\"tags\":{\"ckknhxkizvy\":\"gsftufqobrjlnacg\",\"nok\":\"nrzvuljraaer\",\"a\":\"gukkjqnvbroy\"},\"id\":\"xulcdisdos\",\"name\":\"jbjsvgjrwh\",\"type\":\"yvycytdclxgcckn\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -71,7 +71,7 @@ public void testList() throws Exception { Assertions.assertEquals("ecdmdqbwpy", response.iterator().next().subnetId()); Assertions.assertEquals("tgsfja", response.iterator().next().domainName()); Assertions.assertEquals("slhhxudbxv", response.iterator().next().organizationUnit()); - Assertions.assertEquals("htnsi", response.iterator().next().domainUsername()); - Assertions.assertEquals("dhzmmesckdlp", response.iterator().next().domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", response.iterator().next().domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", response.iterator().next().domainPassword()); } } diff --git a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkPropertiesTests.java b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkPropertiesTests.java index 287d9763a426..c46f37a79f7a 100644 --- a/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkPropertiesTests.java +++ b/sdk/devcenter/azure-resourcemanager-devcenter/src/test/java/com/azure/resourcemanager/devcenter/generated/NetworkPropertiesTests.java @@ -16,13 +16,13 @@ public void testDeserialize() { NetworkProperties model = BinaryData .fromString( - "{\"provisioningState\":\"envrkpyouaibrebq\",\"healthCheckStatus\":\"Pending\",\"networkingResourceGroupName\":\"j\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"qtnqtt\",\"domainName\":\"lwfffi\",\"organizationUnit\":\"pjpqqmtedltmmji\",\"domainUsername\":\"eozphv\",\"domainPassword\":\"uyqncygupkvipmd\"}") + "{\"provisioningState\":\"envrkpyouaibrebq\",\"healthCheckStatus\":\"Pending\",\"networkingResourceGroupName\":\"j\",\"domainJoinType\":\"HybridAzureADJoin\",\"subnetId\":\"qtnqtt\",\"domainName\":\"lwfffi\",\"organizationUnit\":\"pjpqqmtedltmmji\",\"domainUsername\":\"fakeNamePlaceholder\",\"domainPassword\":\"fakePasswordPlaceholder\"}") .toObject(NetworkProperties.class); Assertions.assertEquals("qtnqtt", model.subnetId()); Assertions.assertEquals("lwfffi", model.domainName()); Assertions.assertEquals("pjpqqmtedltmmji", model.organizationUnit()); - Assertions.assertEquals("eozphv", model.domainUsername()); - Assertions.assertEquals("uyqncygupkvipmd", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); Assertions.assertEquals("j", model.networkingResourceGroupName()); Assertions.assertEquals(DomainJoinType.HYBRID_AZURE_ADJOIN, model.domainJoinType()); } @@ -34,16 +34,16 @@ public void testSerialize() { .withSubnetId("qtnqtt") .withDomainName("lwfffi") .withOrganizationUnit("pjpqqmtedltmmji") - .withDomainUsername("eozphv") - .withDomainPassword("uyqncygupkvipmd") + .withDomainUsername("fakeNamePlaceholder") + .withDomainPassword("fakePasswordPlaceholder") .withNetworkingResourceGroupName("j") .withDomainJoinType(DomainJoinType.HYBRID_AZURE_ADJOIN); model = BinaryData.fromObject(model).toObject(NetworkProperties.class); Assertions.assertEquals("qtnqtt", model.subnetId()); Assertions.assertEquals("lwfffi", model.domainName()); Assertions.assertEquals("pjpqqmtedltmmji", model.organizationUnit()); - Assertions.assertEquals("eozphv", model.domainUsername()); - Assertions.assertEquals("uyqncygupkvipmd", model.domainPassword()); + Assertions.assertEquals("fakeNamePlaceholder", model.domainUsername()); + Assertions.assertEquals("fakePasswordPlaceholder", model.domainPassword()); Assertions.assertEquals("j", model.networkingResourceGroupName()); Assertions.assertEquals(DomainJoinType.HYBRID_AZURE_ADJOIN, model.domainJoinType()); } diff --git a/sdk/edgeorder/azure-resourcemanager-edgeorder/SAMPLE.md b/sdk/edgeorder/azure-resourcemanager-edgeorder/SAMPLE.md index 0d8b4e43c7d6..2fa6f65b2cf2 100644 --- a/sdk/edgeorder/azure-resourcemanager-edgeorder/SAMPLE.md +++ b/sdk/edgeorder/azure-resourcemanager-edgeorder/SAMPLE.md @@ -76,7 +76,7 @@ public final class ResourceProviderCreateAddressSamples { .withContactDetails( new ContactDetails() .withContactName("Petr Cech") - .withPhone("1234567890") + .withPhone("fakePhoneNumberPlaceholder") .withPhoneExtension("") .withEmailList(Arrays.asList("testemail@microsoft.com"))) .withShippingAddress( @@ -641,7 +641,7 @@ public final class ResourceProviderUpdateAddressSamples { .withContactDetails( new ContactDetails() .withContactName("Petr Cech") - .withPhone("1234567890") + .withPhone("fakePhoneNumberPlaceholder") .withPhoneExtension("") .withEmailList(Arrays.asList("ssemcr@microsoft.com"))) .apply(); diff --git a/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderCreateAddressSamples.java b/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderCreateAddressSamples.java index d51c662a5cbc..be8dcfc4e5fd 100644 --- a/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderCreateAddressSamples.java +++ b/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderCreateAddressSamples.java @@ -28,7 +28,7 @@ public static void createAddress(com.azure.resourcemanager.edgeorder.EdgeOrderMa .withContactDetails( new ContactDetails() .withContactName("Petr Cech") - .withPhone("1234567890") + .withPhone("fakePhoneNumberPlaceholder") .withPhoneExtension("") .withEmailList(Arrays.asList("testemail@microsoft.com"))) .withShippingAddress( diff --git a/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderUpdateAddressSamples.java b/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderUpdateAddressSamples.java index 77b2a93000bf..d0362ea17bdd 100644 --- a/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderUpdateAddressSamples.java +++ b/sdk/edgeorder/azure-resourcemanager-edgeorder/src/samples/java/com/azure/resourcemanager/edgeorder/generated/ResourceProviderUpdateAddressSamples.java @@ -54,7 +54,7 @@ public static void updateAddress(com.azure.resourcemanager.edgeorder.EdgeOrderMa .withContactDetails( new ContactDetails() .withContactName("Petr Cech") - .withPhone("1234567890") + .withPhone("fakePhoneNumberPlaceholder") .withPhoneExtension("") .withEmailList(Arrays.asList("ssemcr@microsoft.com"))) .apply(); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/CHANGELOG.md b/sdk/eventhubs/azure-messaging-eventhubs/CHANGELOG.md index b6be17e5a620..e6e4d4aa12c2 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/CHANGELOG.md +++ b/sdk/eventhubs/azure-messaging-eventhubs/CHANGELOG.md @@ -7,13 +7,15 @@ ### Breaking Changes ### Bugs Fixed - +- Fixed incorrect proxy configuration using environment variables. ([24230](https://github.com/Azure/azure-sdk-for-java/issues/24230)) ### Other Changes ## 5.14.0 (2022-10-13) ### Features Added +- Enabled metrics for sent events, consumer lag, checkpointing. ([#31024](https://github.com/Azure/azure-sdk-for-java/pull/31024)) +- Enabled distributed tracing for consumer and batch processor. ([#31197](https://github.com/Azure/azure-sdk-for-java/pull/31197)) - Added algorithm for mapping partition keys to partition ids. - Added EventHubBufferedProducerAsyncClient and EventHubBufferedProducerClient diff --git a/sdk/eventhubs/azure-messaging-eventhubs/pom.xml b/sdk/eventhubs/azure-messaging-eventhubs/pom.xml index 613c9507fad4..7be2ec3132b6 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/pom.xml +++ b/sdk/eventhubs/azure-messaging-eventhubs/pom.xml @@ -42,7 +42,7 @@ com.azure azure-core-amqp - 2.7.2 + 2.8.0-beta.1 @@ -89,5 +89,27 @@ 4.8.1 test + + + + com.azure + azure-core-tracing-opentelemetry + 1.0.0-beta.29 + test + + + + io.opentelemetry + opentelemetry-api + 1.19.0 + test + + + + io.opentelemetry + opentelemetry-sdk + 1.19.0 + test + diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventDataBatch.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventDataBatch.java index 004b0383b480..bd32980557a9 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventDataBatch.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventDataBatch.java @@ -7,15 +7,13 @@ import com.azure.core.amqp.exception.AmqpException; import com.azure.core.amqp.implementation.AmqpConstants; import com.azure.core.amqp.implementation.ErrorContextProvider; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.amqp.models.AmqpAnnotatedMessage; -import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; -import com.azure.core.util.tracing.ProcessKind; +import com.azure.messaging.eventhubs.implementation.MessageUtils; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.CreateBatchOptions; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; import org.apache.qpid.proton.message.Message; -import reactor.core.publisher.Signal; import java.nio.BufferOverflowException; import java.util.HashMap; @@ -23,15 +21,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Optional; - -import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; -import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY; -import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY; -import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; -import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_NAMESPACE_VALUE; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_TRACING_SERVICE_NAME; /** * A class for aggregating {@link EventData} into a single, size-limited, batch. It is treated as a single message when @@ -53,12 +42,10 @@ public final class EventDataBatch { private final byte[] eventBytes; private final String partitionId; private int sizeInBytes; - private final TracerProvider tracerProvider; - private final String entityPath; - private final String hostname; + private final EventHubsTracer tracer; EventDataBatch(int maxMessageSize, String partitionId, String partitionKey, ErrorContextProvider contextProvider, - TracerProvider tracerProvider, String entityPath, String hostname) { + EventHubsProducerInstrumentation instrumentation) { this.maxMessageSize = maxMessageSize; this.partitionKey = partitionKey; this.partitionId = partitionId; @@ -66,9 +53,7 @@ public final class EventDataBatch { this.events = new LinkedList<>(); this.sizeInBytes = (maxMessageSize / 65536) * 1024; // reserve 1KB for every 64KB this.eventBytes = new byte[maxMessageSize]; - this.tracerProvider = tracerProvider; - this.entityPath = entityPath; - this.hostname = hostname; + this.tracer = instrumentation.getTracer(); } /** @@ -114,11 +99,12 @@ public boolean tryAdd(final EventData eventData) { if (eventData == null) { throw LOGGER.logExceptionAsWarning(new NullPointerException("eventData cannot be null")); } - EventData event = tracerProvider.isEnabled() ? traceMessageSpan(eventData) : eventData; + + tracer.reportMessageSpan(eventData, eventData.getContext()); final int size; try { - size = getSize(event, events.isEmpty()); + size = getSize(eventData, events.isEmpty()); } catch (BufferOverflowException exception) { throw LOGGER.logExceptionAsWarning(new AmqpException(false, AmqpErrorCondition.LINK_PAYLOAD_SIZE_EXCEEDED, String.format(Locale.US, "Size of the payload exceeded maximum message size: %s kb", @@ -126,52 +112,15 @@ public boolean tryAdd(final EventData eventData) { contextProvider.getErrorContext())); } - if (this.sizeInBytes + size > this.maxMessageSize) { return false; } this.sizeInBytes += size; - - - this.events.add(event); + this.events.add(eventData); return true; } - /** - * Method to start and end a "Azure.EventHubs.message" span and add the "DiagnosticId" as a property of the message. - * - * @param eventData The Event to add tracing span for. - * @return the updated event data object. - */ - private EventData traceMessageSpan(EventData eventData) { - Optional eventContextData = eventData.getContext().getData(SPAN_CONTEXT_KEY); - if (eventContextData.isPresent()) { - // if message has context (in case of retries), don't start a message span or add a new context - return eventData; - } else { - // Starting the span makes the sampling decision (nothing is logged at this time) - Context eventContext = eventData.getContext() - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_NAMESPACE_VALUE) - .addData(ENTITY_PATH_KEY, this.entityPath) - .addData(HOST_NAME_KEY, this.hostname); - eventContext = tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, eventContext, - ProcessKind.MESSAGE); - Optional eventDiagnosticIdOptional = eventContext.getData(DIAGNOSTIC_ID_KEY); - if (eventDiagnosticIdOptional.isPresent()) { - eventData.getProperties().put(DIAGNOSTIC_ID_KEY, eventDiagnosticIdOptional.get().toString()); - tracerProvider.endSpan(eventContext, Signal.complete()); - - Object spanContext = eventContext.getData(SPAN_CONTEXT_KEY).orElse(null); - if (spanContext != null) { - eventData.addContext(SPAN_CONTEXT_KEY, spanContext); - } - } - } - - return eventData; - } - List getEvents() { return events; } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java index 4e777deaa996..1d19de7f8b59 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java @@ -4,11 +4,12 @@ package com.azure.messaging.eventhubs; import com.azure.core.amqp.implementation.MessageSerializer; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.metrics.Meter; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; import com.azure.messaging.eventhubs.implementation.EventHubManagementNode; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; @@ -32,14 +33,12 @@ class EventHubAsyncClient implements Closeable { private final Scheduler scheduler; private final boolean isSharedConnection; private final Runnable onClientClose; - private final TracerProvider tracerProvider; private final String identifier; + private final Tracer tracer; private final Meter meter; - EventHubAsyncClient(EventHubConnectionProcessor connectionProcessor, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Scheduler scheduler, boolean isSharedConnection, Runnable onClientClose, - String identifier, Meter meter) { - this.tracerProvider = Objects.requireNonNull(tracerProvider, "'tracerProvider' cannot be null."); + EventHubAsyncClient(EventHubConnectionProcessor connectionProcessor, MessageSerializer messageSerializer, + Scheduler scheduler, boolean isSharedConnection, Runnable onClientClose, String identifier, Meter meter, Tracer tracer) { this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); this.connectionProcessor = Objects.requireNonNull(connectionProcessor, "'connectionProcessor' cannot be null."); @@ -48,6 +47,7 @@ class EventHubAsyncClient implements Closeable { this.isSharedConnection = isSharedConnection; this.identifier = identifier; + this.tracer = tracer; this.meter = meter; } @@ -109,9 +109,10 @@ Mono getPartitionProperties(String partitionId) { * @return A new {@link EventHubProducerAsyncClient}. */ EventHubProducerAsyncClient createProducer() { + EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer, meter, connectionProcessor.getFullyQualifiedNamespace(), connectionProcessor.getEventHubName()); return new EventHubProducerAsyncClient(connectionProcessor.getFullyQualifiedNamespace(), getEventHubName(), - connectionProcessor, connectionProcessor.getRetryOptions(), tracerProvider, messageSerializer, scheduler, - isSharedConnection, onClientClose, identifier, meter); + connectionProcessor, connectionProcessor.getRetryOptions(), messageSerializer, scheduler, + isSharedConnection, onClientClose, identifier, instrumentation); } /** @@ -126,7 +127,7 @@ EventHubProducerAsyncClient createProducer() { * @throws NullPointerException If {@code consumerGroup} is {@code null}. * @throws IllegalArgumentException If {@code consumerGroup} is an empty string. */ - EventHubConsumerAsyncClient createConsumer(String consumerGroup, int prefetchCount) { + EventHubConsumerAsyncClient createConsumer(String consumerGroup, int prefetchCount, boolean isSync) { Objects.requireNonNull(consumerGroup, "'consumerGroup' cannot be null."); if (consumerGroup.isEmpty()) { @@ -134,9 +135,12 @@ EventHubConsumerAsyncClient createConsumer(String consumerGroup, int prefetchCou new IllegalArgumentException("'consumerGroup' cannot be an empty string.")); } + EventHubsConsumerInstrumentation instrumentation = new EventHubsConsumerInstrumentation(tracer, meter, + connectionProcessor.getFullyQualifiedNamespace(), connectionProcessor.getEventHubName(), consumerGroup, isSync); + return new EventHubConsumerAsyncClient(connectionProcessor.getFullyQualifiedNamespace(), getEventHubName(), connectionProcessor, messageSerializer, consumerGroup, prefetchCount, isSharedConnection, - onClientClose, identifier, meter); + onClientClose, identifier, instrumentation); } /** diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducer.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducer.java index f99f9bd9dba5..0227ff41c78b 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducer.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducer.java @@ -7,8 +7,10 @@ import com.azure.core.amqp.exception.AmqpErrorContext; import com.azure.core.amqp.exception.AmqpException; import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.EventHubBufferedProducerAsyncClient.BufferedProducerClientOptions; import com.azure.messaging.eventhubs.implementation.UncheckedExecutionException; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.CreateBatchOptions; import com.azure.messaging.eventhubs.models.SendBatchFailedContext; import com.azure.messaging.eventhubs.models.SendBatchSucceededContext; @@ -55,10 +57,11 @@ class EventHubBufferedPartitionProducer implements Closeable { private final AtomicBoolean isFlushing = new AtomicBoolean(false); private final Semaphore flushSemaphore = new Semaphore(1); private final PublishResultSubscriber publishResultSubscriber; + private final EventHubsTracer tracer; EventHubBufferedPartitionProducer(EventHubProducerAsyncClient client, String partitionId, BufferedProducerClientOptions options, AmqpRetryOptions retryOptions, Sinks.Many eventSink, - Queue eventQueue) { + Queue eventQueue, Tracer tracer) { this.client = client; this.partitionId = partitionId; @@ -78,6 +81,8 @@ class EventHubBufferedPartitionProducer implements Closeable { this.publishSubscription = publishEvents(eventDataBatchFlux) .publishOn(Schedulers.boundedElastic(), 1) .subscribeWith(publishResultSubscriber); + + this.tracer = new EventHubsTracer(tracer, client.getFullyQualifiedNamespace(), client.getEventHubName()); } /** @@ -118,6 +123,7 @@ Mono enqueueEvent(EventData eventData) { return; } + tracer.reportMessageSpan(eventData, eventData.getContext()); final Sinks.EmitResult emitResult = eventSink.tryEmitNext(eventData); if (emitResult.isSuccess()) { sink.success(); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerAsyncClient.java index 6cae4cb421d5..4e0ba4bf2d49 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerAsyncClient.java @@ -9,6 +9,7 @@ import com.azure.core.annotation.ServiceMethod; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.models.SendBatchFailedContext; import com.azure.messaging.eventhubs.models.SendBatchSucceededContext; import com.azure.messaging.eventhubs.models.SendOptions; @@ -80,8 +81,10 @@ public final class EventHubBufferedProducerAsyncClient implements Closeable { new ConcurrentHashMap<>(); private final AmqpRetryOptions retryOptions; + private final Tracer tracer; + EventHubBufferedProducerAsyncClient(EventHubClientBuilder builder, BufferedProducerClientOptions clientOptions, - PartitionResolver partitionResolver, AmqpRetryOptions retryOptions) { + PartitionResolver partitionResolver, AmqpRetryOptions retryOptions, Tracer tracer) { this.client = builder.buildAsyncProducerClient(); this.clientOptions = clientOptions; this.partitionResolver = partitionResolver; @@ -101,6 +104,8 @@ public final class EventHubBufferedProducerAsyncClient implements Closeable { this.partitionIdsMono = initialisationMono.then(Mono.fromCallable(() -> { return new ArrayList<>(partitionProducers.keySet()).toArray(new String[0]); })).cache(); + + this.tracer = tracer; } /** @@ -368,7 +373,7 @@ private EventHubBufferedPartitionProducer createPartitionProducer(String partiti final Sinks.Many eventSink = Sinks.many().unicast().onBackpressureBuffer(eventQueue); return new EventHubBufferedPartitionProducer(client, partitionId, clientOptions, retryOptions, - eventSink, eventQueue); + eventSink, eventQueue, tracer); } /** diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerClientBuilder.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerClientBuilder.java index 940f667adc5e..4c6b4bff12ee 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerClientBuilder.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubBufferedProducerClientBuilder.java @@ -21,6 +21,7 @@ import com.azure.core.util.ClientOptions; import com.azure.core.util.Configuration; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.SendBatchFailedContext; import com.azure.messaging.eventhubs.models.SendBatchSucceededContext; @@ -477,7 +478,7 @@ public EventHubBufferedProducerAsyncClient buildAsyncClient() { ? EventHubClientBuilder.DEFAULT_RETRY : retryOptions; - return new EventHubBufferedProducerAsyncClient(builder, clientOptions, partitionResolver, options); + return new EventHubBufferedProducerAsyncClient(builder, clientOptions, partitionResolver, options, EventHubsTracer.getDefaultTracer()); } /** diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClient.java index ff2f8b038955..e281c448a8e9 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClient.java @@ -85,7 +85,7 @@ EventHubProducerClient createProducer() { * @throws IllegalArgumentException If {@code consumerGroup} is an empty string. */ EventHubConsumerClient createConsumer(String consumerGroup, int prefetchCount) { - final EventHubConsumerAsyncClient consumer = client.createConsumer(consumerGroup, prefetchCount); + final EventHubConsumerAsyncClient consumer = client.createConsumer(consumerGroup, prefetchCount, true); return new EventHubConsumerClient(consumer, retry.getTryTimeout()); } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClientBuilder.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClientBuilder.java index 7b14d777cfd1..6623c82c1245 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClientBuilder.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubClientBuilder.java @@ -6,7 +6,6 @@ import com.azure.core.amqp.AmqpClientOptions; import com.azure.core.amqp.AmqpRetryOptions; import com.azure.core.amqp.AmqpTransportType; -import com.azure.core.amqp.ProxyAuthenticationType; import com.azure.core.amqp.ProxyOptions; import com.azure.core.amqp.client.traits.AmqpTrait; import com.azure.core.amqp.implementation.AzureTokenManagerProvider; @@ -17,7 +16,6 @@ import com.azure.core.amqp.implementation.ReactorProvider; import com.azure.core.amqp.implementation.StringUtil; import com.azure.core.amqp.implementation.TokenManagerProvider; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.amqp.models.CbsAuthorizationType; import com.azure.core.annotation.ServiceClientBuilder; import com.azure.core.annotation.ServiceClientProtocol; @@ -36,25 +34,22 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.metrics.Meter; import com.azure.core.util.metrics.MeterProvider; -import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.implementation.EventHubAmqpConnection; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; import com.azure.messaging.eventhubs.implementation.EventHubReactorAmqpConnection; import com.azure.messaging.eventhubs.implementation.EventHubSharedKeyCredential; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import org.apache.qpid.proton.engine.SslDomain; import reactor.core.publisher.Flux; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import java.net.InetSocketAddress; import java.net.MalformedURLException; -import java.net.Proxy; import java.net.URL; import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.ServiceLoader; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -727,7 +722,7 @@ public EventHubConsumerAsyncClient buildAsyncConsumerClient() { + "string. using EventHubClientBuilder.consumerGroup(String)")); } - return buildAsyncClient().createConsumer(consumerGroup, prefetchCount); + return buildAsyncClient().createConsumer(consumerGroup, prefetchCount, false); } /** @@ -808,6 +803,7 @@ EventHubAsyncClient buildAsyncClient() { final Meter meter = MeterProvider.getDefaultProvider().createMeter(LIBRARY_NAME, LIBRARY_VERSION, clientOptions == null ? null : clientOptions.getMetricsOptions()); + final MessageSerializer messageSerializer = new EventHubMessageSerializer(); final EventHubConnectionProcessor processor; @@ -826,8 +822,6 @@ EventHubAsyncClient buildAsyncClient() { processor = buildConnectionProcessor(messageSerializer, meter); } - final TracerProvider tracerProvider = new TracerProvider(ServiceLoader.load(Tracer.class)); - String identifier; if (clientOptions instanceof AmqpClientOptions) { String clientOptionIdentifier = ((AmqpClientOptions) clientOptions).getIdentifier(); @@ -836,8 +830,8 @@ EventHubAsyncClient buildAsyncClient() { identifier = UUID.randomUUID().toString(); } - return new EventHubAsyncClient(processor, tracerProvider, messageSerializer, scheduler, - isSharedConnection.get(), this::onClientClose, identifier, meter); + return new EventHubAsyncClient(processor, messageSerializer, scheduler, + isSharedConnection.get(), this::onClientClose, identifier, meter, EventHubsTracer.getDefaultTracer()); } /** @@ -897,6 +891,11 @@ void onClientClose() { } } + Meter createMeter() { + return MeterProvider.getDefaultProvider().createMeter(LIBRARY_NAME, LIBRARY_VERSION, + clientOptions == null ? null : clientOptions.getMetricsOptions()); + } + private EventHubConnectionProcessor buildConnectionProcessor(MessageSerializer messageSerializer, Meter meter) { final ConnectionOptions connectionOptions = getConnectionOptions(); final Flux connectionFlux = Flux.create(sink -> { @@ -952,7 +951,7 @@ private ConnectionOptions getConnectionOptions() { } if (proxyOptions == null) { - proxyOptions = getDefaultProxyConfiguration(buildConfiguration); + proxyOptions = ProxyOptions.fromConfiguration(buildConfiguration); } // If the proxy has been configured by the user but they have overridden the TransportType with something that @@ -985,49 +984,4 @@ private ConnectionOptions getConnectionOptions() { customEndpointAddress.getPort()); } } - - private ProxyOptions getDefaultProxyConfiguration(Configuration configuration) { - ProxyAuthenticationType authentication = ProxyAuthenticationType.NONE; - if (proxyOptions != null) { - authentication = proxyOptions.getAuthentication(); - } - - String proxyAddress = configuration.get(Configuration.PROPERTY_HTTP_PROXY); - - if (CoreUtils.isNullOrEmpty(proxyAddress)) { - return ProxyOptions.SYSTEM_DEFAULTS; - } - - return getProxyOptions(authentication, proxyAddress, configuration, - Boolean.parseBoolean(configuration.get("java.net.useSystemProxies"))); - } - - private ProxyOptions getProxyOptions(ProxyAuthenticationType authentication, String proxyAddress, - Configuration configuration, boolean useSystemProxies) { - String host; - int port; - if (HOST_PORT_PATTERN.matcher(proxyAddress.trim()).find()) { - final String[] hostPort = proxyAddress.split(":"); - host = hostPort[0]; - port = Integer.parseInt(hostPort[1]); - final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); - final String username = configuration.get(ProxyOptions.PROXY_USERNAME); - final String password = configuration.get(ProxyOptions.PROXY_PASSWORD); - return new ProxyOptions(authentication, proxy, username, password); - } else if (useSystemProxies) { - // java.net.useSystemProxies needs to be set to true in this scenario. - // If it is set to false 'ProxyOptions' in azure-core will return null. - com.azure.core.http.ProxyOptions coreProxyOptions = com.azure.core.http.ProxyOptions - .fromConfiguration(configuration); - Proxy.Type proxyType = coreProxyOptions.getType().toProxyType(); - InetSocketAddress coreProxyAddress = coreProxyOptions.getAddress(); - String username = coreProxyOptions.getUsername(); - String password = coreProxyOptions.getPassword(); - return new ProxyOptions(authentication, new Proxy(proxyType, coreProxyAddress), username, password); - } else { - LOGGER.verbose("'HTTP_PROXY' was configured but ignored as 'java.net.useSystemProxies' wasn't " - + "set or was false."); - return ProxyOptions.SYSTEM_DEFAULTS; - } - } } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClient.java index ed9453b68225..05d8e61e2b85 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClient.java @@ -13,11 +13,10 @@ import com.azure.core.annotation.ServiceClient; import com.azure.core.annotation.ServiceMethod; import com.azure.core.util.logging.ClientLogger; -import com.azure.core.util.metrics.Meter; import com.azure.messaging.eventhubs.implementation.AmqpReceiveLinkProcessor; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; import com.azure.messaging.eventhubs.implementation.EventHubManagementNode; -import com.azure.messaging.eventhubs.implementation.EventHubsMetricsProvider; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.PartitionEvent; import com.azure.messaging.eventhubs.models.ReceiveOptions; @@ -157,7 +156,8 @@ public class EventHubConsumerAsyncClient implements Closeable { private final boolean isSharedConnection; private final Runnable onClientClosed; private final String identifier; - private final EventHubsMetricsProvider metricsProvider; + private final EventHubsConsumerInstrumentation instrumentation; + /** * Keeps track of the open partition consumers keyed by linkName. The link name is generated as: {@code * "partitionId_GUID"}. For receiving from all partitions, links are prefixed with {@code "all-GUID-partitionId"}. @@ -167,7 +167,8 @@ public class EventHubConsumerAsyncClient implements Closeable { EventHubConsumerAsyncClient(String fullyQualifiedNamespace, String eventHubName, EventHubConnectionProcessor connectionProcessor, MessageSerializer messageSerializer, String consumerGroup, - int prefetchCount, boolean isSharedConnection, Runnable onClientClosed, String identifier, Meter meter) { + int prefetchCount, boolean isSharedConnection, Runnable onClientClosed, String identifier, + EventHubsConsumerInstrumentation instrumentation) { this.fullyQualifiedNamespace = fullyQualifiedNamespace; this.eventHubName = eventHubName; this.connectionProcessor = connectionProcessor; @@ -177,7 +178,7 @@ public class EventHubConsumerAsyncClient implements Closeable { this.isSharedConnection = isSharedConnection; this.onClientClosed = onClientClosed; this.identifier = identifier; - this.metricsProvider = new EventHubsMetricsProvider(meter, fullyQualifiedNamespace, eventHubName, consumerGroup); + this.instrumentation = instrumentation; } /** @@ -215,8 +216,9 @@ public String getConsumerGroup() { */ @ServiceMethod(returns = ReturnType.SINGLE) public Mono getEventHubProperties() { - return connectionProcessor.flatMap(connection -> connection.getManagementNode()) - .flatMap(EventHubManagementNode::getEventHubProperties); + return instrumentation.getTracer().traceMono(connectionProcessor.flatMap(connection -> connection.getManagementNode()) + .flatMap(EventHubManagementNode::getEventHubProperties), + "EventHubs.getEventHubProperties"); } /** @@ -247,8 +249,9 @@ public Mono getPartitionProperties(String partitionId) { return monoError(LOGGER, new IllegalArgumentException("'partitionId' cannot be an empty string.")); } - return connectionProcessor.flatMap(connection -> connection.getManagementNode()) - .flatMap(node -> node.getPartitionProperties(partitionId)); + return instrumentation.getTracer().traceMono(connectionProcessor.flatMap(connection -> connection.getManagementNode()) + .flatMap(node -> node.getPartitionProperties(partitionId)), + "EventHubs.getPartitionProperties"); } /** @@ -390,7 +393,6 @@ public Flux receive(boolean startReadingAtEarliestEvent, Receive final String prefix = StringUtil.getRandomString("all"); final Flux allPartitionEvents = getPartitionIds().flatMap(partitionId -> { final String linkName = prefix + "-" + partitionId; - return createConsumer(linkName, partitionId, startingPosition, receiveOptions); }); @@ -421,7 +423,6 @@ private Flux createConsumer(String linkName, String partitionId, .computeIfAbsent(linkName, name -> createPartitionConsumer(name, partitionId, startingPosition, receiveOptions)) .receive() - .doOnNext(event -> metricsProvider.reportReceive(event)) .doFinally(signal -> removeLink(linkName, partitionId, signal)); } @@ -487,7 +488,7 @@ private EventHubPartitionAsyncConsumer createPartitionConsumer(String linkName, final Flux receiveLinkFlux = retryableReceiveLinkMono.repeat(); final AmqpReceiveLinkProcessor linkMessageProcessor = receiveLinkFlux.subscribeWith( - new AmqpReceiveLinkProcessor(entityPath, prefetchCount, connectionProcessor)); + new AmqpReceiveLinkProcessor(entityPath, prefetchCount, partitionId, connectionProcessor, instrumentation)); return new EventHubPartitionAsyncConsumer(linkMessageProcessor, messageSerializer, getFullyQualifiedNamespace(), getEventHubName(), consumerGroup, partitionId, initialPosition, @@ -498,6 +499,10 @@ boolean isConnectionClosed() { return this.connectionProcessor.isChannelClosed(); } + EventHubsConsumerInstrumentation getInstrumentation() { + return instrumentation; + } + /** * Gets the client identifier. * diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerClient.java index 0009cefc74fe..e35cacad1922 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubConsumerClient.java @@ -6,10 +6,12 @@ import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; import com.azure.core.annotation.ServiceMethod; +import com.azure.core.util.Context; import com.azure.core.util.IterableStream; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.eventhubs.implementation.SynchronousEventSubscriber; import com.azure.messaging.eventhubs.implementation.SynchronousReceiveWork; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.PartitionEvent; import com.azure.messaging.eventhubs.models.ReceiveOptions; @@ -18,6 +20,7 @@ import java.io.Closeable; import java.time.Duration; +import java.time.Instant; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -83,12 +86,14 @@ public class EventHubConsumerClient implements Closeable { private final ReceiveOptions defaultReceiveOptions = new ReceiveOptions(); private final Duration timeout; private final AtomicInteger idGenerator = new AtomicInteger(); + private final EventHubsTracer tracer; EventHubConsumerClient(EventHubConsumerAsyncClient consumer, Duration tryTimeout) { Objects.requireNonNull(tryTimeout, "'tryTimeout' cannot be null."); this.consumer = Objects.requireNonNull(consumer, "'consumer' cannot be null."); this.timeout = tryTimeout; + this.tracer = consumer.getInstrumentation().getTracer(); } /** @@ -214,11 +219,14 @@ public IterableStream receiveFromPartition(String partitionId, i new IllegalArgumentException("'maximumWaitTime' cannot be zero or less.")); } - final Flux events = Flux.create(emitter -> { + Instant startTime = tracer.isEnabled() ? Instant.now() : null; + + Flux events = Flux.create(emitter -> { queueWork(partitionId, maximumMessageCount, startingPosition, maximumWaitTime, defaultReceiveOptions, emitter); }); + events = tracer.reportSyncReceiveSpan("EventHubs.receiveFromPartition", startTime, events, Context.NONE); return new IterableStream<>(events); } @@ -264,10 +272,11 @@ public IterableStream receiveFromPartition(String partitionId, i new IllegalArgumentException("'maximumWaitTime' cannot be zero or less.")); } - final Flux events = Flux.create(emitter -> { + Instant startTime = tracer.isEnabled() ? Instant.now() : null; + Flux events = Flux.create(emitter -> { queueWork(partitionId, maximumMessageCount, startingPosition, maximumWaitTime, receiveOptions, emitter); }); - + events = tracer.reportSyncReceiveSpan("EventHubs.receiveFromPartition", startTime, events, Context.NONE); return new IterableStream<>(events); } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubMessageSerializer.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubMessageSerializer.java index 50e125fe1b99..006532af8bb1 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubMessageSerializer.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubMessageSerializer.java @@ -9,6 +9,7 @@ import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.eventhubs.implementation.ManagementChannel; +import com.azure.messaging.eventhubs.implementation.MessageUtils; import com.azure.messaging.eventhubs.models.LastEnqueuedEventProperties; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Symbol; @@ -210,17 +211,7 @@ private EventData deserializeEventData(Message message) { "enqueuedTime: %s should always be in map.", SEQUENCE_NUMBER_ANNOTATION_NAME.getValue()))); } - final Object enqueuedTimeObject = messageAnnotations.get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); - final Instant enqueuedTime; - if (enqueuedTimeObject instanceof Date) { - enqueuedTime = ((Date) enqueuedTimeObject).toInstant(); - } else if (enqueuedTimeObject instanceof Instant) { - enqueuedTime = (Instant) enqueuedTimeObject; - } else { - throw LOGGER.logExceptionAsError(new IllegalStateException(new IllegalStateException( - String.format(Locale.US, "enqueuedTime is not a known type. Value: %s. Type: %s", - enqueuedTimeObject, enqueuedTimeObject.getClass())))); - } + final Instant enqueuedTime = MessageUtils.getEnqueuedTime(messageAnnotations, ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); final String partitionKey = (String) messageAnnotations.get(PARTITION_KEY_ANNOTATION_NAME.getValue()); final long offset = getAsLong(messageAnnotations, OFFSET_ANNOTATION_NAME.getValue()); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java index 096138d537f4..4797a4580c10 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java @@ -4,26 +4,19 @@ package com.azure.messaging.eventhubs; import com.azure.core.amqp.AmqpRetryOptions; -import com.azure.core.amqp.AmqpRetryPolicy; import com.azure.core.amqp.exception.AmqpErrorCondition; import com.azure.core.amqp.exception.AmqpException; import com.azure.core.amqp.implementation.AmqpConstants; import com.azure.core.amqp.implementation.AmqpSendLink; import com.azure.core.amqp.implementation.ErrorContextProvider; import com.azure.core.amqp.implementation.MessageSerializer; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; import com.azure.core.annotation.ServiceMethod; -import com.azure.core.util.Context; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; -import com.azure.core.util.metrics.Meter; -import com.azure.core.util.tracing.ProcessKind; -import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; import com.azure.messaging.eventhubs.implementation.EventHubManagementNode; -import com.azure.messaging.eventhubs.implementation.EventHubsMetricsProvider; import com.azure.messaging.eventhubs.models.CreateBatchOptions; import com.azure.messaging.eventhubs.models.SendOptions; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; @@ -41,22 +34,14 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; -import static com.azure.core.amqp.implementation.RetryUtil.getRetryPolicy; import static com.azure.core.amqp.implementation.RetryUtil.withRetry; import static com.azure.core.util.FluxUtil.monoError; -import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; -import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY; -import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; -import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_NAMESPACE_VALUE; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_TRACING_SERVICE_NAME; import static com.azure.messaging.eventhubs.implementation.ClientConstants.MAX_MESSAGE_LENGTH_BYTES; import static com.azure.messaging.eventhubs.implementation.ClientConstants.PARTITION_ID_KEY; import static com.azure.messaging.eventhubs.implementation.ClientConstants.PARTITION_KEY_KEY; @@ -192,40 +177,35 @@ public class EventHubProducerAsyncClient implements Closeable { private final String eventHubName; private final EventHubConnectionProcessor connectionProcessor; private final AmqpRetryOptions retryOptions; - private final AmqpRetryPolicy retryPolicy; - private final TracerProvider tracerProvider; + private final EventHubsProducerInstrumentation instrumentation; private final MessageSerializer messageSerializer; private final Scheduler scheduler; private final boolean isSharedConnection; private final Runnable onClientClose; private final String identifier; - private final EventHubsMetricsProvider metricsProvider; - /** * Creates a new instance of this {@link EventHubProducerAsyncClient} that can send messages to a single partition * when {@link CreateBatchOptions#getPartitionId()} is not null or an empty string. Otherwise, allows the service to * load balance the messages amongst available partitions. */ EventHubProducerAsyncClient(String fullyQualifiedNamespace, String eventHubName, - EventHubConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Scheduler scheduler, boolean isSharedConnection, Runnable onClientClose, - String identifier, Meter meter) { + EventHubConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, MessageSerializer messageSerializer, + Scheduler scheduler, boolean isSharedConnection, Runnable onClientClose, + String identifier, EventHubsProducerInstrumentation instrumentation) { this.fullyQualifiedNamespace = Objects.requireNonNull(fullyQualifiedNamespace, "'fullyQualifiedNamespace' cannot be null."); this.eventHubName = Objects.requireNonNull(eventHubName, "'eventHubName' cannot be null."); this.connectionProcessor = Objects.requireNonNull(connectionProcessor, "'connectionProcessor' cannot be null."); this.retryOptions = Objects.requireNonNull(retryOptions, "'retryOptions' cannot be null."); - this.tracerProvider = Objects.requireNonNull(tracerProvider, "'tracerProvider' cannot be null."); this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); this.onClientClose = Objects.requireNonNull(onClientClose, "'onClientClose' cannot be null."); - this.retryPolicy = getRetryPolicy(retryOptions); this.scheduler = scheduler; this.isSharedConnection = isSharedConnection; this.identifier = identifier; - this.metricsProvider = new EventHubsMetricsProvider(meter, fullyQualifiedNamespace, eventHubName, null); + this.instrumentation = Objects.requireNonNull(instrumentation, "'instrumentation' cannot be null."); } /** @@ -254,8 +234,10 @@ public String getEventHubName() { */ @ServiceMethod(returns = ReturnType.SINGLE) public Mono getEventHubProperties() { - return connectionProcessor.flatMap(connection -> connection.getManagementNode()) - .flatMap(EventHubManagementNode::getEventHubProperties); + return instrumentation.getTracer().traceMono( + connectionProcessor.flatMap(connection -> connection.getManagementNode()) + .flatMap(EventHubManagementNode::getEventHubProperties), + "EventHubs.getEventHubProperties"); } /** @@ -278,8 +260,10 @@ public Flux getPartitionIds() { */ @ServiceMethod(returns = ReturnType.SINGLE) public Mono getPartitionProperties(String partitionId) { - return connectionProcessor.flatMap(connection -> connection.getManagementNode()) - .flatMap(node -> node.getPartitionProperties(partitionId)); + return instrumentation.getTracer().traceMono( + connectionProcessor.flatMap(connection -> connection.getManagementNode()) + .flatMap(node -> node.getPartitionProperties(partitionId)), + "EventHubs.getPartitionProperties"); } /** @@ -340,8 +324,7 @@ public Mono createBatch(CreateBatchOptions options) { ? batchMaxSize : maximumLinkSize; - return Mono.just(new EventDataBatch(batchSize, partitionId, partitionKey, link::getErrorContext, - tracerProvider, link.getEntityPath(), link.getHostname())); + return Mono.just(new EventDataBatch(batchSize, partitionId, partitionKey, link::getErrorContext, instrumentation)); })); } @@ -536,32 +519,10 @@ public Mono send(EventDataBatch batch) { } final String partitionKey = batch.getPartitionKey(); - final boolean isTracingEnabled = tracerProvider.isEnabled(); - final AtomicReference parentContext = isTracingEnabled - ? new AtomicReference<>(Context.NONE) - : null; - - Context sharedContext = null; final List messages = new ArrayList<>(); for (int i = 0; i < batch.getEvents().size(); i++) { final EventData event = batch.getEvents().get(i); - if (isTracingEnabled) { - if (i == 0) { - sharedContext = event.getContext() - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_NAMESPACE_VALUE) - .addData(ENTITY_PATH_KEY, eventHubName) - .addData(HOST_NAME_KEY, fullyQualifiedNamespace); - - sharedContext = tracerProvider.getSharedSpanBuilder(ClientConstants.AZ_TRACING_SERVICE_NAME, sharedContext); - tracerProvider.addSpanLinks(sharedContext); - } else { - // TODO (lmolkova) we need better addSpanLinks - https://github.com/Azure/azure-sdk-for-java/issues/28953 - Object eventSpanContext = event.getContext().getData(SPAN_CONTEXT_KEY).orElse(Context.NONE); - tracerProvider.addSpanLinks(sharedContext.addData(SPAN_CONTEXT_KEY, eventSpanContext)); - } - } - final Message message = messageSerializer.serialize(event); if (!CoreUtils.isNullOrEmpty(partitionKey)) { @@ -574,26 +535,17 @@ public Mono send(EventDataBatch batch) { messages.add(message); } - if (isTracingEnabled) { - // Start send span and store updated context - parentContext.set(tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, sharedContext, ProcessKind.SEND)); - } - final Mono sendMessage = getSendLink(batch.getPartitionId()) .flatMap(link -> messages.size() == 1 ? link.send(messages.get(0)) : link.send(messages)); - return withRetry(sendMessage, retryOptions, + final Mono send = withRetry(sendMessage, retryOptions, String.format("partitionId[%s]: Sending messages timed out.", batch.getPartitionId())) - .publishOn(scheduler) - .doOnEach(signal -> { - Context context = isTracingEnabled ? parentContext.get() : Context.NONE; - metricsProvider.reportBatchSend(batch, batch.getPartitionId(), signal.getThrowable(), context); - if (isTracingEnabled) { - tracerProvider.endSpan(context, signal); - } - }); + .publishOn(scheduler); + + // important to end spans after metrics are reported so metrics get relevant context for exemplars. + return instrumentation.onSendBatch(send, batch, "EventHubs.send"); } private Mono sendInternal(Flux events, SendOptions options) { @@ -617,7 +569,7 @@ private Mono sendInternal(Flux events, SendOptions options) { .setPartitionId(options.getPartitionId()) .setMaximumSizeInBytes(batchSize); return events.collect(new EventDataCollector(batchOptions, 1, link::getErrorContext, - tracerProvider, link.getEntityPath(), link.getHostname())); + instrumentation)); }) .flatMap(list -> sendInternal(Flux.fromIterable(list)))); } @@ -684,14 +636,11 @@ private static class EventDataCollector implements Collector 0 ? options.getMaximumSizeInBytes() @@ -699,12 +648,10 @@ private static class EventDataCollector implements Collector, EventData> accumulator() { contextProvider.getErrorContext()); } - currentBatch = new EventDataBatch(maxMessageSize, partitionId, partitionKey, contextProvider, - tracerProvider, entityPath, hostname); + currentBatch = new EventDataBatch(maxMessageSize, partitionId, partitionKey, contextProvider, instrumentation); currentBatch.tryAdd(event); list.add(batch); }; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerClient.java index 093fcc20f2e7..6704754405b3 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerClient.java @@ -333,4 +333,5 @@ public void close() { public String getIdentifier() { return producer.getIdentifier(); } + } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubsProducerInstrumentation.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubsProducerInstrumentation.java new file mode 100644 index 000000000000..6d2afa65ceb8 --- /dev/null +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubsProducerInstrumentation.java @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.messaging.eventhubs; + +import com.azure.core.util.Context; +import com.azure.core.util.metrics.Meter; +import com.azure.core.util.tracing.ProcessKind; +import com.azure.core.util.tracing.Tracer; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsMetricsProvider; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; +import reactor.core.publisher.Mono; + +import static com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer.REACTOR_PARENT_TRACE_CONTEXT_KEY; + +class EventHubsProducerInstrumentation { + + private final EventHubsTracer tracer; + private final EventHubsMetricsProvider meter; + EventHubsProducerInstrumentation(Tracer tracer, Meter meter, String fullyQualifiedName, String entityName) { + this.tracer = new EventHubsTracer(tracer, fullyQualifiedName, entityName); + this.meter = new EventHubsMetricsProvider(meter, fullyQualifiedName, entityName, null); + } + + Mono onSendBatch(Mono publisher, EventDataBatch batch, String spanName) { + if (!tracer.isEnabled() && !meter.isSendCountEnabled()) { + return publisher; + } + + if (tracer.isEnabled()) { + return publisher + .doOnEach(signal -> { + if (signal.isOnComplete() || signal.isOnError()) { + Context span = signal.getContextView().getOrDefault(REACTOR_PARENT_TRACE_CONTEXT_KEY, Context.NONE); + meter.reportBatchSend(batch.getCount(), batch.getPartitionId(), signal.getThrowable(), span); + tracer.endSpan(signal.getThrowable(), span, null); + } + }) + .contextWrite(reactor.util.context.Context.of(REACTOR_PARENT_TRACE_CONTEXT_KEY, startSpanWithLinks(spanName, batch, Context.NONE))); + } else { + return publisher + .doOnEach(signal -> { + if (signal.isOnComplete() || signal.isOnError()) { + meter.reportBatchSend(batch.getCount(), batch.getPartitionId(), signal.getThrowable(), Context.NONE); + } + }); + } + } + + public EventHubsTracer getTracer() { + return tracer; + } + + private Context startSpanWithLinks(String name, EventDataBatch batch, Context context) { + Context spanBuilder = tracer.getBuilder(name, context); + if (batch != null) { + for (EventData event : batch.getEvents()) { + tracer.addLink(event.getProperties(), null, spanBuilder, event.getContext()); + } + } + + return tracer.startSpan(name, spanBuilder, ProcessKind.SEND); + } +} diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClient.java index e233ae8d9de6..dce23a3bb1c4 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClient.java @@ -3,10 +3,11 @@ package com.azure.messaging.eventhubs; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.annotation.ServiceClient; import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.ErrorContext; import com.azure.messaging.eventhubs.models.EventPosition; import java.time.Duration; @@ -64,7 +65,6 @@ public class EventProcessorClient { * @param checkpointStore The store used for reading and updating partition ownership and checkpoints. information. * @param trackLastEnqueuedEventProperties If set to {@code true}, all events received by this EventProcessorClient * will also include the last enqueued event properties for it's respective partitions. - * @param tracerProvider The tracer implementation. * @param processError Error handler for any errors that occur outside the context of a partition. * @param initialPartitionEventPosition Map of initial event positions for partition ids. * @param maxBatchSize The maximum batch size to receive per users' process handler invocation. @@ -74,13 +74,14 @@ public class EventProcessorClient { * @param loadBalancerUpdateInterval The time duration between load balancing update cycles. * @param partitionOwnershipExpirationInterval The time duration after which the ownership of partition expires. * @param loadBalancingStrategy The load balancing strategy to use. + * @param tracer Tracer instance. */ EventProcessorClient(EventHubClientBuilder eventHubClientBuilder, String consumerGroup, Supplier partitionProcessorFactory, CheckpointStore checkpointStore, - boolean trackLastEnqueuedEventProperties, TracerProvider tracerProvider, Consumer processError, + boolean trackLastEnqueuedEventProperties, Consumer processError, Map initialPartitionEventPosition, int maxBatchSize, Duration maxWaitTime, boolean batchReceiveMode, Duration loadBalancerUpdateInterval, Duration partitionOwnershipExpirationInterval, - LoadBalancingStrategy loadBalancingStrategy) { + LoadBalancingStrategy loadBalancingStrategy, Tracer tracer) { Objects.requireNonNull(eventHubClientBuilder, "eventHubClientBuilder cannot be null."); Objects.requireNonNull(consumerGroup, "consumerGroup cannot be null."); @@ -100,9 +101,11 @@ public class EventProcessorClient { this.consumerGroup = consumerGroup.toLowerCase(Locale.ROOT); this.loadBalancerUpdateInterval = loadBalancerUpdateInterval; + EventHubsTracer ehTracer = new EventHubsTracer(tracer, fullyQualifiedNamespace, eventHubName); this.partitionPumpManager = new PartitionPumpManager(checkpointStore, partitionProcessorFactory, - eventHubClientBuilder, trackLastEnqueuedEventProperties, tracerProvider, initialPartitionEventPosition, + eventHubClientBuilder, trackLastEnqueuedEventProperties, ehTracer, initialPartitionEventPosition, maxBatchSize, maxWaitTime, batchReceiveMode); + this.partitionBasedLoadBalancer = new PartitionBasedLoadBalancer(this.checkpointStore, eventHubAsyncClient, this.fullyQualifiedNamespace, this.eventHubName, this.consumerGroup, this.identifier, diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClientBuilder.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClientBuilder.java index 99e837fb8f47..573f56b60363 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClientBuilder.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventProcessorClientBuilder.java @@ -7,7 +7,6 @@ import com.azure.core.amqp.AmqpTransportType; import com.azure.core.amqp.ProxyOptions; import com.azure.core.amqp.client.traits.AmqpTrait; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.annotation.ServiceClientBuilder; import com.azure.core.client.traits.AzureNamedKeyCredentialTrait; import com.azure.core.client.traits.AzureSasCredentialTrait; @@ -21,7 +20,7 @@ import com.azure.core.util.ClientOptions; import com.azure.core.util.Configuration; import com.azure.core.util.logging.ClientLogger; -import com.azure.core.util.tracing.Tracer; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; import com.azure.messaging.eventhubs.models.CloseContext; import com.azure.messaging.eventhubs.models.ErrorContext; @@ -35,7 +34,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.ServiceLoader; import java.util.function.Consumer; import java.util.function.Supplier; @@ -109,6 +107,7 @@ public class EventProcessorClientBuilder implements AzureSasCredentialTrait, AmqpTrait, ConfigurationTrait { + /** * Default load balancing update interval. Balancing interval should account for latency between the client * and the storage account. @@ -733,7 +732,6 @@ public EventProcessorClient buildEventProcessorClient() { + "cannot be set")); } - final TracerProvider tracerProvider = new TracerProvider(ServiceLoader.load(Tracer.class)); if (loadBalancingUpdateInterval == null) { loadBalancingUpdateInterval = DEFAULT_LOAD_BALANCING_UPDATE_INTERVAL; } @@ -743,9 +741,9 @@ public EventProcessorClient buildEventProcessorClient() { } return new EventProcessorClient(eventHubClientBuilder, consumerGroup, - getPartitionProcessorSupplier(), checkpointStore, trackLastEnqueuedEventProperties, tracerProvider, + getPartitionProcessorSupplier(), checkpointStore, trackLastEnqueuedEventProperties, processError, initialPartitionEventPosition, maxBatchSize, maxWaitTime, processEventBatch != null, - loadBalancingUpdateInterval, partitionOwnershipExpirationInterval, loadBalancingStrategy); + loadBalancingUpdateInterval, partitionOwnershipExpirationInterval, loadBalancingStrategy, EventHubsTracer.getDefaultTracer()); } private Supplier getPartitionProcessorSupplier() { diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/PartitionPumpManager.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/PartitionPumpManager.java index 961ac1c59936..ab012c95db9b 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/PartitionPumpManager.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/PartitionPumpManager.java @@ -3,14 +3,13 @@ package com.azure.messaging.eventhubs; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.logging.LogLevel; -import com.azure.core.util.tracing.ProcessKind; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; import com.azure.messaging.eventhubs.implementation.PartitionProcessorException; import com.azure.messaging.eventhubs.implementation.ReactorShim; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.Checkpoint; import com.azure.messaging.eventhubs.models.CloseContext; import com.azure.messaging.eventhubs.models.CloseReason; @@ -25,29 +24,17 @@ import com.azure.messaging.eventhubs.models.PartitionOwnership; import com.azure.messaging.eventhubs.models.ReceiveOptions; import reactor.core.publisher.Flux; -import reactor.core.publisher.Signal; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; import java.time.Duration; import java.util.List; -import java.util.Locale; import java.util.Map; -import java.util.Objects; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; import java.util.stream.Collectors; -import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; -import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY; import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY; -import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; -import static com.azure.core.util.tracing.Tracer.MESSAGE_ENQUEUED_TIME; -import static com.azure.core.util.tracing.Tracer.SCOPE_KEY; -import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_NAMESPACE_VALUE; -import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_TRACING_SERVICE_NAME; import static com.azure.messaging.eventhubs.implementation.ClientConstants.PARTITION_ID_KEY; import static com.azure.messaging.eventhubs.implementation.ClientConstants.SEQUENCE_NUMBER_KEY; @@ -73,13 +60,13 @@ class PartitionPumpManager { private final Map partitionPumps = new ConcurrentHashMap<>(); private final Supplier partitionProcessorFactory; private final EventHubClientBuilder eventHubClientBuilder; - private final TracerProvider tracerProvider; private final boolean trackLastEnqueuedEventProperties; private final Map initialPartitionEventPosition; private final Duration maxWaitTime; private final int maxBatchSize; private final boolean batchReceiveMode; private final int prefetch; + private final EventHubsTracer tracer; /** * Creates an instance of partition pump manager. @@ -90,8 +77,8 @@ class PartitionPumpManager { * @param eventHubClientBuilder The client builder used to create new clients (and new connections) for each * partition processed by this {@link EventProcessorClient}. * @param trackLastEnqueuedEventProperties If set to {@code true}, all events received by this EventProcessorClient - * will also include the last enqueued event properties for it's respective partitions. - * @param tracerProvider The tracer implementation. + * will also include the last enqueued event properties for its respective partitions. + * @param tracer Tracing helper. * @param initialPartitionEventPosition Map of initial event positions for partition ids. * @param maxBatchSize The maximum batch size to receive per users' process handler invocation. * @param maxWaitTime The maximum time to wait to receive a batch or a single event. @@ -100,14 +87,13 @@ class PartitionPumpManager { */ PartitionPumpManager(CheckpointStore checkpointStore, Supplier partitionProcessorFactory, EventHubClientBuilder eventHubClientBuilder, - boolean trackLastEnqueuedEventProperties, TracerProvider tracerProvider, + boolean trackLastEnqueuedEventProperties, EventHubsTracer tracer, Map initialPartitionEventPosition, int maxBatchSize, Duration maxWaitTime, boolean batchReceiveMode) { this.checkpointStore = checkpointStore; this.partitionProcessorFactory = partitionProcessorFactory; this.eventHubClientBuilder = eventHubClientBuilder; this.trackLastEnqueuedEventProperties = trackLastEnqueuedEventProperties; - this.tracerProvider = tracerProvider; this.initialPartitionEventPosition = initialPartitionEventPosition; this.maxBatchSize = maxBatchSize; this.maxWaitTime = maxWaitTime; @@ -116,6 +102,7 @@ class PartitionPumpManager { this.prefetch = eventHubClientBuilder.getPrefetchCount() == null ? EventHubClientBuilder.DEFAULT_PREFETCH_COUNT : eventHubClientBuilder.getPrefetchCount(); + this.tracer = tracer; } /** @@ -225,7 +212,7 @@ void startPartitionPump(PartitionOwnership claimedOwnership, Checkpoint checkpoi Scheduler scheduler = Schedulers.newBoundedElastic(schedulerSize, MAXIMUM_QUEUE_SIZE, "partition-pump-" + claimedOwnership.getPartitionId()); EventHubConsumerAsyncClient eventHubConsumer = eventHubClientBuilder.buildAsyncClient() - .createConsumer(claimedOwnership.getConsumerGroup(), prefetch); + .createConsumer(claimedOwnership.getConsumerGroup(), prefetch, true); PartitionPump partitionPump = new PartitionPump(claimedOwnership.getPartitionId(), eventHubConsumer, scheduler); @@ -254,7 +241,7 @@ void startPartitionPump(PartitionOwnership claimedOwnership, Checkpoint checkpoi .concatMap(Flux::collectList) .publishOn(scheduler, false, prefetch) .subscribe(partitionEventBatch -> { - processEvents(partitionContext, partitionProcessor, partitionPump, eventHubConsumer, + processEvents(partitionContext, partitionProcessor, partitionPump, partitionEventBatch); }, /* EventHubConsumer receive() returned an error */ @@ -269,7 +256,6 @@ void startPartitionPump(PartitionOwnership claimedOwnership, Checkpoint checkpoi if (partitionPumps.containsKey(claimedOwnership.getPartitionId())) { cleanup(claimedOwnership, partitionPumps.get(claimedOwnership.getPartitionId())); } - throw LOGGER.atError() .addKeyValue(PARTITION_ID_KEY, claimedOwnership.getPartitionId()) .log(new PartitionProcessorException( @@ -278,18 +264,9 @@ void startPartitionPump(PartitionOwnership claimedOwnership, Checkpoint checkpoi } } - private void processEvent(PartitionContext partitionContext, PartitionProcessor partitionProcessor, - EventHubConsumerAsyncClient eventHubConsumer, EventContext eventContext) { + private void processEvent(PartitionContext partitionContext, PartitionProcessor partitionProcessor, EventContext eventContext) { - Context processSpanContext = null; EventData eventData = eventContext.getEventData(); - if (eventData != null) { - processSpanContext = startProcessTracingSpan(eventData, eventHubConsumer.getEventHubName(), - eventHubConsumer.getFullyQualifiedNamespace()); - if (processSpanContext.getData(SPAN_CONTEXT_KEY).isPresent()) { - eventData.addContext(SPAN_CONTEXT_KEY, processSpanContext); - } - } try { if (LOGGER.canLogAtLevel(LogLevel.VERBOSE)) { @@ -306,18 +283,19 @@ private void processEvent(PartitionContext partitionContext, PartitionProcessor .addKeyValue(ENTITY_PATH_KEY, partitionContext.getEventHubName()) .log("Completed processing event."); } - endProcessTracingSpan(processSpanContext, Signal.complete()); } catch (Throwable throwable) { /* user code for event processing threw an exception - log and bubble up */ - endProcessTracingSpan(processSpanContext, Signal.error(throwable)); throw LOGGER.logExceptionAsError(new PartitionProcessorException("Error in event processing callback", throwable)); } } private void processEvents(PartitionContext partitionContext, PartitionProcessor partitionProcessor, - PartitionPump partitionPump, EventHubConsumerAsyncClient eventHubConsumer, - List partitionEventBatch) { + PartitionPump partitionPump, List partitionEventBatch) { + Throwable exception = null; + Context span = null; + AutoCloseable scope = null; + try { if (batchReceiveMode) { LastEnqueuedEventProperties[] lastEnqueuedEventProperties = new LastEnqueuedEventProperties[1]; @@ -335,6 +313,8 @@ private void processEvents(PartitionContext partitionContext, PartitionProcessor EventBatchContext eventBatchContext = new EventBatchContext(partitionContext, eventDataList, checkpointStore, enqueuedEventProperties); + span = tracer.startProcessSpan("EventHubs.process", eventDataList, Context.NONE); + scope = tracer.makeSpanCurrent(span); if (LOGGER.canLogAtLevel(LogLevel.VERBOSE)) { LOGGER.atVerbose() .addKeyValue(PARTITION_ID_KEY, partitionContext.getPartitionId()) @@ -362,13 +342,18 @@ private void processEvents(PartitionContext partitionContext, PartitionProcessor EventContext eventContext = new EventContext(partitionContext, eventData, checkpointStore, enqueuedEventProperties); + span = tracer.startProcessSpan("EventHubs.process", eventData, Context.NONE); + scope = tracer.makeSpanCurrent(span); - processEvent(partitionContext, partitionProcessor, eventHubConsumer, eventContext); + processEvent(partitionContext, partitionProcessor, eventContext); } } catch (Throwable throwable) { + exception = throwable; /* user code for event processing threw an exception - log and bubble up */ throw LOGGER.logExceptionAsError(new PartitionProcessorException("Error in event processing callback", throwable)); + } finally { + tracer.endSpan(exception, span, scope); } } @@ -415,56 +400,6 @@ private void cleanup(PartitionOwnership claimedOwnership, PartitionPump partitio } } - /* - * Starts a new process tracing span and attaches the returned context to the EventData object for users. - */ - private Context startProcessTracingSpan(EventData eventData, String eventHubName, String fullyQualifiedNamespace) { - Object diagnosticId = eventData.getProperties().get(DIAGNOSTIC_ID_KEY); - if (tracerProvider == null || !tracerProvider.isEnabled()) { - return Context.NONE; - } - - Context spanContext = Objects.isNull(diagnosticId) ? Context.NONE : tracerProvider.extractContext(diagnosticId.toString(), Context.NONE); - spanContext = spanContext - .addData(ENTITY_PATH_KEY, eventHubName) - .addData(HOST_NAME_KEY, fullyQualifiedNamespace) - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_NAMESPACE_VALUE); - spanContext = eventData.getEnqueuedTime() == null - ? spanContext - : spanContext.addData(MESSAGE_ENQUEUED_TIME, eventData.getEnqueuedTime().getEpochSecond()); - return tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, spanContext, ProcessKind.PROCESS); - } - - /* - * Ends the process tracing span and the scope of that span. - */ - private void endProcessTracingSpan(Context processSpanContext, Signal signal) { - if (processSpanContext == null) { - return; - } - - Optional spanScope = processSpanContext.getData(SCOPE_KEY); - // Disposes of the scope when the trace span closes. - if (!spanScope.isPresent() || !tracerProvider.isEnabled()) { - return; - } - - Object spanObject = spanScope.get(); - if (spanObject instanceof AutoCloseable) { - AutoCloseable close = (AutoCloseable) spanObject; - try { - close.close(); - } catch (Exception exception) { - LOGGER.error(Messages.EVENT_PROCESSOR_RUN_END, exception); - } - - } else { - LOGGER.verbose(String.format(Locale.US, Messages.PROCESS_SPAN_SCOPE_TYPE_ERROR, - spanObject != null ? spanObject.getClass() : "null")); - } - tracerProvider.endSpan(processSpanContext, signal); - } - /** * Updates the last enqueued event if it was seen and gets the most up-to-date value. * diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessor.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessor.java index 5051f149d559..4b9d92dd86d3 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessor.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessor.java @@ -12,6 +12,7 @@ import com.azure.core.amqp.implementation.StringUtil; import com.azure.core.util.AsyncCloseable; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import org.apache.qpid.proton.message.Message; import org.reactivestreams.Subscription; import reactor.core.CoreSubscriber; @@ -60,9 +61,11 @@ public class AmqpReceiveLinkProcessor extends FluxProcessor convert(Map sourceMap) { + public static Map convert(Map sourceMap) { if (sourceMap == null) { return null; } @@ -345,6 +346,27 @@ static Map convert(Map sourceMap) { (HashMap::putAll)); } + /** + * Reads and validates enqueued time from message annotations. + * + * @param messageAnnotations Message annotations: either {@code Map} from raw {@link Message} + * or {@code Map} from {@link AmqpAnnotatedMessage} + * @return {@link Instant} enqueued time. + * @throws IllegalStateException if enqueued time is not {@link Date} or {@link Instant} + */ + public static Instant getEnqueuedTime(Map messageAnnotations, T enqueuedTimeKey) { + final Object enqueuedTimeObject = messageAnnotations.get(enqueuedTimeKey); + if (enqueuedTimeObject instanceof Date) { + return ((Date) enqueuedTimeObject).toInstant(); + } else if (enqueuedTimeObject instanceof Instant) { + return (Instant) enqueuedTimeObject; + } + + throw LOGGER.logExceptionAsError(new IllegalStateException(new IllegalStateException( + String.format(Locale.US, "enqueuedTime is not a known type. Value: %s. Type: %s", + enqueuedTimeObject, enqueuedTimeObject.getClass())))); + } + private static void setValues(Map sourceMap, Map targetMap) { if (sourceMap == null) { return; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsConsumerInstrumentation.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsConsumerInstrumentation.java new file mode 100644 index 000000000000..41beacd582ab --- /dev/null +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsConsumerInstrumentation.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.messaging.eventhubs.implementation.instrumentation; + +import com.azure.core.util.Context; +import com.azure.core.util.metrics.Meter; +import com.azure.core.util.tracing.ProcessKind; +import com.azure.core.util.tracing.Tracer; +import com.azure.messaging.eventhubs.implementation.MessageUtils; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.message.Message; + +import java.time.Instant; + +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; + +public class EventHubsConsumerInstrumentation { + private static final Symbol ENQUEUED_TIME_UTC_ANNOTATION_NAME_SYMBOL = Symbol.valueOf(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); + private final EventHubsTracer tracer; + private final EventHubsMetricsProvider meter; + private final boolean isSync; + + public EventHubsConsumerInstrumentation(Tracer tracer, Meter meter, String fullyQualifiedName, String entityName, String consumerGroup, boolean isSyncConsumer) { + this.tracer = new EventHubsTracer(tracer, fullyQualifiedName, entityName); + this.meter = new EventHubsMetricsProvider(meter, fullyQualifiedName, entityName, consumerGroup); + this.isSync = isSyncConsumer; + } + + public EventHubsTracer getTracer() { + return tracer; + } + + public Context asyncConsume(String spanName, Message message, String partitionId, Context parent) { + if (!meter.isConsumerLagEnabled() && !tracer.isEnabled()) { + return parent; + } + + Instant enqueuedTime = MessageUtils.getEnqueuedTime(message.getMessageAnnotations().getValue(), ENQUEUED_TIME_UTC_ANNOTATION_NAME_SYMBOL); + Context child = parent; + if (tracer.isEnabled() && !isSync) { + child = tracer.startSpan(spanName, tracer.setParentAndAttributes(message, enqueuedTime, parent), ProcessKind.PROCESS); + } + + meter.reportReceive(enqueuedTime, partitionId, child); + + return child; + } +} diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/EventHubsMetricsProvider.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsMetricsProvider.java similarity index 86% rename from sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/EventHubsMetricsProvider.java rename to sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsMetricsProvider.java index 54638e5aaece..278058595c4a 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/EventHubsMetricsProvider.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsMetricsProvider.java @@ -1,15 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.eventhubs.implementation; +package com.azure.messaging.eventhubs.implementation.instrumentation; import com.azure.core.util.Context; import com.azure.core.util.TelemetryAttributes; import com.azure.core.util.metrics.DoubleHistogram; import com.azure.core.util.metrics.LongCounter; import com.azure.core.util.metrics.Meter; -import com.azure.messaging.eventhubs.EventDataBatch; -import com.azure.messaging.eventhubs.models.PartitionEvent; import java.time.Instant; import java.util.HashMap; @@ -57,16 +55,23 @@ public EventHubsMetricsProvider(Meter meter, String namespace, String entityName } } - public void reportBatchSend(EventDataBatch batch, String partitionId, Throwable throwable, Context context) { + public boolean isSendCountEnabled() { + return isEnabled && sentEventsCounter.isEnabled(); + } + + public void reportBatchSend(int batchSize, String partitionId, Throwable throwable, Context context) { if (isEnabled && sentEventsCounter.isEnabled()) { AttributeCache cache = throwable == null ? sendAttributeCacheSuccess : sendAttributeCacheFailure; - sentEventsCounter.add(batch.getCount(), cache.getOrCreate(partitionId), context); + sentEventsCounter.add(batchSize, cache.getOrCreate(partitionId), context); } } - public void reportReceive(PartitionEvent event) { + public boolean isConsumerLagEnabled() { + return isEnabled && consumerLag.isEnabled(); + } + + public void reportReceive(Instant enqueuedTime, String partitionId, Context context) { if (isEnabled && consumerLag.isEnabled()) { - Instant enqueuedTime = event.getData().getEnqueuedTime(); double diff = 0d; if (enqueuedTime != null) { diff = Instant.now().toEpochMilli() - enqueuedTime.toEpochMilli(); @@ -75,9 +80,7 @@ public void reportReceive(PartitionEvent event) { diff = 0; } } - consumerLag.record(diff / 1000d, - receiveAttributeCache.getOrCreate(event.getPartitionContext().getPartitionId()), - Context.NONE); + consumerLag.record(diff / 1000d, receiveAttributeCache.getOrCreate(partitionId), context); } } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsTracer.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsTracer.java new file mode 100644 index 000000000000..622971be1fee --- /dev/null +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/implementation/instrumentation/EventHubsTracer.java @@ -0,0 +1,255 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.messaging.eventhubs.implementation.instrumentation; + +import com.azure.core.amqp.exception.AmqpException; +import com.azure.core.util.Configuration; +import com.azure.core.util.Context; +import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.tracing.ProcessKind; +import com.azure.core.util.tracing.SpanKind; +import com.azure.core.util.tracing.Tracer; +import com.azure.messaging.eventhubs.EventData; +import com.azure.messaging.eventhubs.models.PartitionEvent; +import org.apache.qpid.proton.message.Message; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.time.Instant; +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.ServiceLoader; + +import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY; +import static com.azure.core.util.tracing.Tracer.MESSAGE_ENQUEUED_TIME; +import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; +import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_NAMESPACE_VALUE; + +public class EventHubsTracer { + private static final AutoCloseable NOOP_AUTOCLOSEABLE = () -> { + }; + + public static final String REACTOR_PARENT_TRACE_CONTEXT_KEY = "otel-context-key"; + public static final String TRACEPARENT_KEY = "traceparent"; + private static final ClientLogger LOGGER = new ClientLogger(EventHubsTracer.class); + private static final boolean IS_TRACING_DISABLED = Configuration.getGlobalConfiguration().get(Configuration.PROPERTY_AZURE_TRACING_DISABLED, false); + protected final Tracer tracer; + private final String fullyQualifiedName; + private final String entityName; + + public EventHubsTracer(Tracer tracer, String fullyQualifiedName, String entityName) { + this.tracer = IS_TRACING_DISABLED ? null : tracer; + this.fullyQualifiedName = Objects.requireNonNull(fullyQualifiedName, "'fullyQualifiedName' cannot be null"); + this.entityName = Objects.requireNonNull(entityName, "'entityPath' cannot be null"); + } + + public static Tracer getDefaultTracer() { + Iterable tracers = ServiceLoader.load(Tracer.class); + Iterator it = tracers.iterator(); + return it.hasNext() ? it.next() : null; + } + + public boolean isEnabled() { + return tracer != null; + } + + public Context startSpan(String spanName, Context context, ProcessKind kind) { + return tracer == null ? context : tracer.start(spanName, context, kind); + } + + public Mono traceMono(Mono publisher, String spanName) { + if (tracer != null) { + return publisher + .doOnEach(signal -> { + if (signal.isOnComplete() || signal.isOnError()) { + Context span = signal.getContextView().getOrDefault(REACTOR_PARENT_TRACE_CONTEXT_KEY, Context.NONE); + endSpan(signal.getThrowable(), span, null); + } + }) + .contextWrite(reactor.util.context.Context.of(REACTOR_PARENT_TRACE_CONTEXT_KEY, + tracer.start(spanName, setAttributes(Context.NONE), ProcessKind.SEND))); + } + + return publisher; + } + + public void endSpan(Throwable throwable, Context span, AutoCloseable scope) { + if (tracer != null) { + String errorCondition = "success"; + if (throwable instanceof AmqpException) { + AmqpException exception = (AmqpException) throwable; + errorCondition = exception.getErrorCondition().getErrorCondition(); + } + + try { + if (scope != null) { + scope.close(); + } + } catch (Exception e) { + LOGGER.warning("Can't close scope", e); + } finally { + tracer.end(errorCondition, throwable, span); + } + } + } + + /** + * Used in ServiceBusMessageBatch.tryAddMessage() to start tracing for to-be-sent out messages. + */ + public void reportMessageSpan(EventData eventData, Context eventContext) { + if (tracer == null || eventContext == null || eventContext.getData(SPAN_CONTEXT_KEY).isPresent()) { + // if message has context (in case of retries), don't start a message span or add a new context + return; + } + + String traceparent = EventHubsTracer.getTraceparent(eventData.getProperties()); + if (traceparent != null) { + // if message has context (in case of retries) or if user supplied it, don't start a message span or add a new context + return; + } + + // Starting the span makes the sampling decision (nothing is logged at this time) + Context newMessageContext = setAttributes(eventContext); + + Context eventSpanContext = tracer.start("EventHubs.message", newMessageContext, ProcessKind.MESSAGE); + Optional traceparentOpt = eventSpanContext.getData(DIAGNOSTIC_ID_KEY); + + if (traceparentOpt.isPresent()) { + eventData.getProperties().put(DIAGNOSTIC_ID_KEY, traceparentOpt.get().toString()); + eventData.getProperties().put(TRACEPARENT_KEY, traceparentOpt.get().toString()); + + endSpan(null, eventSpanContext, null); + + Optional spanContext = eventSpanContext.getData(SPAN_CONTEXT_KEY); + if (spanContext.isPresent()) { + eventData.addContext(SPAN_CONTEXT_KEY, spanContext.get()); + } + } + } + + public Context getBuilder(String spanName, Context context) { + return tracer == null ? context : setAttributes(tracer.getSharedSpanBuilder(spanName, context)); + } + + public void addLink(Map applicationProperties, Instant enqueuedTime, Context spanBuilder, Context eventContext) { + if (tracer != null) { + Optional linkContext = eventContext.getData(SPAN_CONTEXT_KEY); + if (!linkContext.isPresent()) { + String traceparent = getTraceparent(applicationProperties); + Context link = traceparent == null ? Context.NONE : tracer.extractContext(traceparent, Context.NONE); + linkContext = link.getData(SPAN_CONTEXT_KEY); + } + + if (enqueuedTime != null) { + spanBuilder = spanBuilder.addData(MESSAGE_ENQUEUED_TIME, enqueuedTime.atOffset(ZoneOffset.UTC).toEpochSecond()); + } + + if (linkContext.isPresent()) { + tracer.addLink(spanBuilder.addData(SPAN_CONTEXT_KEY, linkContext.get())); + } + } + } + + public AutoCloseable makeSpanCurrent(Context context) { + return tracer == null ? NOOP_AUTOCLOSEABLE : tracer.makeSpanCurrent(context); + } + + public Context setParentAndAttributes(Message message, Instant enqueuedTime, Context context) { + if (tracer != null) { + if (enqueuedTime != null) { + context = context.addData(MESSAGE_ENQUEUED_TIME, enqueuedTime.atOffset(ZoneOffset.UTC).toEpochSecond()); + } + + if (message.getApplicationProperties() != null) { + context = getParent(message.getApplicationProperties().getValue(), context); + } + return setAttributes(context); + } + + return context; + } + + public Context startProcessSpan(String name, EventData event, Context parent) { + if (tracer != null) { + Context context = parent; + Instant enqueuedTime = event.getEnqueuedTime(); + if (enqueuedTime != null) { + context = parent.addData(MESSAGE_ENQUEUED_TIME, enqueuedTime.atOffset(ZoneOffset.UTC).toEpochSecond()); + } + + context = getParent(event.getProperties(), context); + return tracer.start(name, setAttributes(context), ProcessKind.PROCESS); + } + + return parent; + } + + public Context startProcessSpan(String name, List events, Context parent) { + if (tracer != null) { + Context context = parent.addData("span-kind", SpanKind.CONSUMER); + Context spanBuilder = getBuilder(name, setAttributes(context)); + if (events != null) { + for (EventData event : events) { + addLink(event.getProperties(), event.getEnqueuedTime(), spanBuilder, Context.NONE); + } + } + + return tracer.start(name, spanBuilder, ProcessKind.PROCESS); + } + + return parent; + } + + public Flux reportSyncReceiveSpan(String name, Instant startTime, Flux events, Context parent) { + if (tracer != null) { + List eventsList = new ArrayList<>(); + return events.doOnEach(signal -> { + if (signal.isOnNext()) { + eventsList.add(signal.get()); + } else if (signal.isOnComplete()) { + Context spanBuilder = getBuilder(name, setAttributes(parent.addData("span-start-time", startTime))); + for (PartitionEvent event : eventsList) { + addLink(event.getData().getProperties(), event.getData().getEnqueuedTime(), spanBuilder, Context.NONE); + } + + // TODO (lmolkova) refactor tracing - ProcessKind.SEND is just a client span + Context span = tracer.start(name, spanBuilder, ProcessKind.SEND); + endSpan(null, span, null); + } + }); + } + + return events; + } + + private static String getTraceparent(Map applicationProperties) { + Object diagnosticId = applicationProperties.get(DIAGNOSTIC_ID_KEY); + if (diagnosticId == null) { + diagnosticId = applicationProperties.get(TRACEPARENT_KEY); + } + + return diagnosticId == null ? null : diagnosticId.toString(); + } + + private Context getParent(Map properties, Context context) { + if (properties == null) { + return context; + } + + String traceparent = getTraceparent(properties); + return traceparent == null ? context : tracer.extractContext(traceparent, context); + } + + private Context setAttributes(Context context) { + return context + .addData(Tracer.ENTITY_PATH_KEY, entityName) + .addData(Tracer.HOST_NAME_KEY, fullyQualifiedName) + .addData(Tracer.AZ_TRACING_NAMESPACE_KEY, AZ_NAMESPACE_VALUE); + } +} diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/PublishEventsJaegerExporterSample.java b/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsTracingWithCustomContextSample.java similarity index 68% rename from sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/PublishEventsJaegerExporterSample.java rename to sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsTracingWithCustomContextSample.java index 2f208bd6d28b..3cfd24331662 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/java/com/azure/core/tracing/opentelemetry/PublishEventsJaegerExporterSample.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsTracingWithCustomContextSample.java @@ -1,31 +1,29 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.core.tracing.opentelemetry; +package com.azure.messaging.eventhubs; -import com.azure.messaging.eventhubs.EventData; -import com.azure.messaging.eventhubs.EventDataBatch; -import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.messaging.eventhubs.EventHubProducerAsyncClient; -import com.azure.messaging.eventhubs.EventHubProducerClient; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; import reactor.core.publisher.Flux; -import java.time.Duration; +import java.util.Collection; import java.util.concurrent.atomic.AtomicReference; import static com.azure.core.util.tracing.Tracer.PARENT_TRACE_CONTEXT_KEY; /** - * Sample to demonstrate using {@link JaegerGrpcSpanExporter} to export telemetry events when publishing multiple events - * to an eventhub instance using the {@link EventHubProducerAsyncClient}. + * Demonstrates how to use OpenTelemtery to trace EventHubs calls and set trace context manually + * on {@link EventData}. Note that in most cases (when you use Reactor or write synchronous code) + * setting context manually should not be necessary. */ -public class PublishEventsJaegerExporterSample { +public class PublishEventsTracingWithCustomContextSample { private static final Tracer TRACER = configureJaegerExporter(); private static final String CONNECTION_STRING = ""; @@ -40,22 +38,16 @@ public static void main(String[] args) { } /** - * Configure the OpenTelemetry {@link JaegerGrpcSpanExporter} to enable tracing. + * Configure the OpenTelemetry {@link SampleTraceExporter} to enable tracing. * * @return The OpenTelemetry {@link Tracer} instance. */ private static Tracer configureJaegerExporter() { - // Export traces to Jaeger - JaegerGrpcSpanExporter jaegerExporter = - JaegerGrpcSpanExporter.builder() - .setEndpoint("http://localhost:14250") - .setTimeout(Duration.ofMinutes(30000)) - .build(); - - // Set to process the spans by the Jaeger Exporter + // configure exporter to your tracing backend instead. OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder() - .setTracerProvider( - SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter)).build()) + .setTracerProvider(SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new SampleTraceExporter())) + .build()) .build(); return openTelemetry.getSdkTracerProvider().get("Publish-Events-Eventhub-Sample"); } @@ -70,7 +62,7 @@ private static void doClientWork() { .connectionString(CONNECTION_STRING, "") .buildAsyncProducerClient(); - // BEGIN: readme-sample-context-manual-propagation-amqp + // BEGIN: sample-trace-context-manual-propagation Flux events = Flux.just( new EventData("EventData Sample 1"), new EventData("EventData Sample 2")); @@ -97,7 +89,25 @@ private static void doClientWork() { return ctx.put(PARENT_TRACE_CONTEXT_KEY, traceContextRef.updateAndGet(traceContext -> traceContext.with(span))); }) .block(); - // END: readme-sample-context-manual-propagation-amqp + // END: sample-trace-context-manual-propagation producer.close(); } + + private static class SampleTraceExporter implements SpanExporter { + @Override + public CompletableResultCode export(Collection collection) { + collection.stream().forEach(System.out::println); + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + } } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchIntegrationTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchIntegrationTest.java index a5529acde308..cb5e31ee8cd6 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchIntegrationTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchIntegrationTest.java @@ -4,7 +4,6 @@ package com.azure.messaging.eventhubs; import com.azure.core.amqp.implementation.ErrorContextProvider; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.models.EventPosition; @@ -19,7 +18,6 @@ import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Random; import java.util.UUID; @@ -33,7 +31,7 @@ public class EventDataBatchIntegrationTest extends IntegrationTestBase { private static final String PARTITION_KEY = "PartitionIDCopyFromProducerOption"; - private final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); + private static final EventHubsProducerInstrumentation DEFAULT_INSTRUMENTATION = new EventHubsProducerInstrumentation(null, null, "fqdn", "entity"); private EventHubProducerAsyncClient producer; private EventHubClientBuilder builder; @@ -67,7 +65,7 @@ protected void afterTest() { public void sendSmallEventsFullBatch() { // Arrange final EventDataBatch batch = new EventDataBatch(ClientConstants.MAX_MESSAGE_LENGTH_BYTES, null, null, contextProvider, - new TracerProvider(Collections.emptyList()), getFullyQualifiedDomainName(), getEventHubName()); + DEFAULT_INSTRUMENTATION); int count = 0; while (batch.tryAdd(createData())) { // We only print every 100th item or it'll be really spammy. @@ -90,7 +88,7 @@ public void sendSmallEventsFullBatch() { public void sendSmallEventsFullBatchPartitionKey() { // Arrange final EventDataBatch batch = new EventDataBatch(ClientConstants.MAX_MESSAGE_LENGTH_BYTES, null, - PARTITION_KEY, contextProvider, tracerProvider, getFullyQualifiedDomainName(), getEventHubName()); + PARTITION_KEY, contextProvider, DEFAULT_INSTRUMENTATION); int count = 0; while (batch.tryAdd(createData())) { // We only print every 100th item or it'll be really spammy. @@ -116,7 +114,7 @@ public void sendBatchPartitionKeyValidate() throws InterruptedException { final SendOptions sendOptions = new SendOptions().setPartitionKey(PARTITION_KEY); final EventDataBatch batch = new EventDataBatch(ClientConstants.MAX_MESSAGE_LENGTH_BYTES, null, - PARTITION_KEY, contextProvider, tracerProvider, getFullyQualifiedDomainName(), getEventHubName()); + PARTITION_KEY, contextProvider, DEFAULT_INSTRUMENTATION); int count = 0; while (count < 10) { final EventData data = createData(); @@ -183,7 +181,7 @@ public void sendEventsFullBatchWithPartitionKey() { // Arrange final int maxMessageSize = 1024; final EventDataBatch batch = new EventDataBatch(maxMessageSize, null, PARTITION_KEY, contextProvider, - tracerProvider, getFullyQualifiedDomainName(), getEventHubName()); + DEFAULT_INSTRUMENTATION); final Random random = new Random(); final SendOptions sendOptions = new SendOptions().setPartitionKey(PARTITION_KEY); int count = 0; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchTest.java index ce0e35d90c3b..46a97abacd24 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventDataBatchTest.java @@ -7,7 +7,6 @@ import com.azure.core.amqp.exception.AmqpErrorContext; import com.azure.core.amqp.exception.AmqpException; import com.azure.core.amqp.implementation.ErrorContextProvider; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.messaging.eventhubs.implementation.ClientConstants; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -15,14 +14,12 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.Collections; - import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; public class EventDataBatchTest { private static final String PARTITION_KEY = "PartitionIDCopyFromProducerOption"; - + private static final EventHubsProducerInstrumentation DEFAULT_INSTRUMENTATION = new EventHubsProducerInstrumentation(null, null, "fqdn", "entity"); @Mock private ErrorContextProvider errorContextProvider; @@ -34,7 +31,7 @@ public void setup() { @Test public void nullEventData() { assertThrows(NullPointerException.class, () -> { - final EventDataBatch batch = new EventDataBatch(1024, null, PARTITION_KEY, null, null, null, null); + final EventDataBatch batch = new EventDataBatch(1024, null, PARTITION_KEY, null, DEFAULT_INSTRUMENTATION); batch.tryAdd(null); }); } @@ -47,7 +44,7 @@ public void payloadExceededException() { when(errorContextProvider.getErrorContext()).thenReturn(new AmqpErrorContext("test-namespace")); final EventDataBatch batch = new EventDataBatch(1024, null, PARTITION_KEY, errorContextProvider, - new TracerProvider(Collections.emptyList()), null, null); + DEFAULT_INSTRUMENTATION); final EventData tooBig = new EventData(new byte[1024 * 1024 * 2]); try { batch.tryAdd(tooBig); @@ -65,7 +62,7 @@ public void payloadExceededException() { public void withinPayloadSize() { final int maxSize = ClientConstants.MAX_MESSAGE_LENGTH_BYTES; final EventDataBatch batch = new EventDataBatch(ClientConstants.MAX_MESSAGE_LENGTH_BYTES, null, PARTITION_KEY, - null, new TracerProvider(Collections.emptyList()), null, null); + null, DEFAULT_INSTRUMENTATION); final EventData within = new EventData(new byte[1024]); Assertions.assertEquals(maxSize, batch.getMaxSizeInBytes()); @@ -83,7 +80,7 @@ public void setsPartitionId() { // Act final EventDataBatch batch = new EventDataBatch(ClientConstants.MAX_MESSAGE_LENGTH_BYTES, partitionId, - PARTITION_KEY, null, null, null, null); + PARTITION_KEY, null, DEFAULT_INSTRUMENTATION); // Assert Assertions.assertEquals(PARTITION_KEY, batch.getPartitionKey()); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducerTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducerTest.java index db1f1719a015..5ea403598f74 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducerTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubBufferedPartitionProducerTest.java @@ -144,7 +144,7 @@ public void publishesEvents() throws InterruptedException { when(client.send(any(EventDataBatch.class))).thenReturn(Mono.empty()); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue); + options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue, null); // Act & Assert StepVerifier.create(producer.enqueueEvent(event1)) @@ -194,7 +194,7 @@ public void publishesErrors() throws InterruptedException { when(client.send(any(EventDataBatch.class))).thenReturn(Mono.empty(), Mono.error(error)); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue); + options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue, null); // Act & Assert StepVerifier.create(Mono.when(producer.enqueueEvent(event1), producer.enqueueEvent(event2))) @@ -264,7 +264,7 @@ public void canPublishAfterErrors() throws InterruptedException { }); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue); + options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue, null); // Act & Assert StepVerifier.create(Mono.when(producer.enqueueEvent(event1), producer.enqueueEvent(event2))) @@ -339,7 +339,7 @@ public void getBufferedEventCounts() throws InterruptedException { .thenAnswer(invocation -> Mono.delay(options.getMaxWaitTime()).then()); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue); + options, DEFAULT_RETRY_OPTIONS, eventSink, eventQueue, null); // Act & Assert StepVerifier.create(Mono.when(producer.enqueueEvent(event1), producer.enqueueEvent(event2), @@ -407,7 +407,7 @@ public void retryAfterEmitResultError(Sinks.EmitResult emitResult) { when(client.send(any(EventDataBatch.class))).thenAnswer(invocation -> Mono.empty()); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, DEFAULT_RETRY_OPTIONS, mockedEventSink, eventQueue); + options, DEFAULT_RETRY_OPTIONS, mockedEventSink, eventQueue, null); // Act & Assert StepVerifier.create(producer.enqueueEvent(event1)) @@ -456,7 +456,7 @@ public void exhaustsRetries() { final AmqpRetryOptions retryOptions = new AmqpRetryOptions().setMaxRetries(2).setDelay(Duration.ofSeconds(2)); final EventHubBufferedPartitionProducer producer = new EventHubBufferedPartitionProducer(client, PARTITION_ID, - options, retryOptions, mockedEventSink, eventQueue); + options, retryOptions, mockedEventSink, eventQueue, null); // Act & Assert StepVerifier.create(producer.enqueueEvent(event1)) diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubClientBuilderTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubClientBuilderTest.java index 650bc6f83e0a..781aa12e7b77 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubClientBuilderTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubClientBuilderTest.java @@ -12,7 +12,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.core.util.Configuration; import com.azure.messaging.eventhubs.implementation.ClientConstants; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -115,23 +114,18 @@ public void testConnectionStringWithSas() { @MethodSource("getProxyConfigurations") @ParameterizedTest - public void testProxyOptionsConfiguration(String proxyConfiguration, boolean expectedClientCreation) { + public void testProxyOptionsConfiguration(String proxyConfiguration) { Configuration configuration = Configuration.getGlobalConfiguration().clone(); configuration = configuration.put(Configuration.PROPERTY_HTTP_PROXY, proxyConfiguration); configuration = configuration.put(JAVA_NET_USE_SYSTEM_PROXIES, "true"); - boolean clientCreated = false; - try { - EventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder() - .connectionString(CORRECT_CONNECTION_STRING) - .configuration(configuration) - .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME) - .transportType(AmqpTransportType.AMQP_WEB_SOCKETS) - .buildAsyncConsumerClient(); - clientCreated = true; - } catch (Exception ex) { - } - Assertions.assertEquals(expectedClientCreation, clientCreated); + // Client creation should not fail with incorrect proxy configurations + EventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder() + .connectionString(CORRECT_CONNECTION_STRING) + .configuration(configuration) + .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME) + .transportType(AmqpTransportType.AMQP_WEB_SOCKETS) + .buildAsyncConsumerClient(); } @Test @@ -241,16 +235,16 @@ public void testThrowsIfAttemptsToCreateClientWithTokenCredentialWithoutEventHub private static Stream getProxyConfigurations() { return Stream.of( - Arguments.of("http://localhost:8080", true), - Arguments.of("localhost:8080", true), - Arguments.of("localhost_8080", false), - Arguments.of("http://example.com:8080", true), - Arguments.of("http://sub.example.com:8080", true), - Arguments.of(":8080", false), - Arguments.of("http://localhost", true), - Arguments.of("sub.example.com:8080", true), - Arguments.of("https://username:password@sub.example.com:8080", true), - Arguments.of("https://username:password@sub.example.com", true) + Arguments.of("http://localhost:8080"), + Arguments.of("localhost:8080"), + Arguments.of("localhost_8080"), + Arguments.of("http://example.com:8080"), + Arguments.of("http://sub.example.com:8080"), + Arguments.of(":8080"), + Arguments.of("http://localhost"), + Arguments.of("sub.example.com:8080"), + Arguments.of("https://username:password@sub.example.com:8080"), + Arguments.of("https://username:password@sub.example.com") ); } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClientTest.java index 2fcf3cdbb98c..a7ef864f3b71 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClientTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerAsyncClientTest.java @@ -17,12 +17,16 @@ import com.azure.core.test.utils.metrics.TestMeter; import com.azure.core.util.ClientOptions; import com.azure.core.util.Configuration; +import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.metrics.Meter; +import com.azure.core.util.tracing.ProcessKind; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.implementation.EventHubAmqpConnection; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; import com.azure.messaging.eventhubs.implementation.EventHubManagementNode; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.LastEnqueuedEventProperties; import com.azure.messaging.eventhubs.models.PartitionEvent; @@ -52,6 +56,7 @@ import java.time.Duration; import java.time.Instant; +import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; import java.util.Map; @@ -61,17 +66,24 @@ import java.util.concurrent.atomic.AtomicInteger; import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; +import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; +import static com.azure.core.util.tracing.Tracer.PARENT_TRACE_CONTEXT_KEY; import static com.azure.messaging.eventhubs.EventHubClientBuilder.DEFAULT_PREFETCH_COUNT; import static com.azure.messaging.eventhubs.TestUtils.getMessage; import static com.azure.messaging.eventhubs.TestUtils.isMatchingEvent; +import static com.azure.messaging.eventhubs.implementation.ClientConstants.AZ_NAMESPACE_VALUE; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -99,6 +111,8 @@ class EventHubConsumerAsyncClientTest { private static final Meter DEFAULT_METER = null; private static final ClientLogger LOGGER = new ClientLogger(EventHubConsumerAsyncClientTest.class); + private static final EventHubsConsumerInstrumentation DEFAULT_INSTRUMENTATION = new EventHubsConsumerInstrumentation(null, null, + HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); private final AmqpRetryOptions retryOptions = new AmqpRetryOptions().setMaxRetries(2); private final String messageTrackingUUID = UUID.randomUUID().toString(); private final TestPublisher endpointProcessor = TestPublisher.createCold(); @@ -159,7 +173,7 @@ AmqpTransportType.AMQP_WEB_SOCKETS, new AmqpRetryOptions(), ProxyOptions.SYSTEM_ "event-hub-name", connectionOptions.getRetry())); consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, - CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); } @AfterEach @@ -181,7 +195,8 @@ void teardown() throws Exception { @Test void lastEnqueuedEventInformationIsNull() { final EventHubConsumerAsyncClient runtimeConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, messageSerializer, CONSUMER_GROUP, DEFAULT_PREFETCH_COUNT, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, messageSerializer, CONSUMER_GROUP, DEFAULT_PREFETCH_COUNT, false, onClientClosed, + CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final int numberOfEvents = 10; when(amqpReceiveLink.getCredits()).thenReturn(numberOfEvents); final int numberToReceive = 3; @@ -204,7 +219,8 @@ void lastEnqueuedEventInformationIsNull() { void lastEnqueuedEventInformationCreated() { // Arrange final EventHubConsumerAsyncClient runtimeConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, messageSerializer, CONSUMER_GROUP, DEFAULT_PREFETCH_COUNT, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, messageSerializer, CONSUMER_GROUP, DEFAULT_PREFETCH_COUNT, false, onClientClosed, + CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final int numberOfEvents = 10; final ReceiveOptions receiveOptions = new ReceiveOptions().setTrackLastEnqueuedEventProperties(true); when(amqpReceiveLink.getCredits()).thenReturn(numberOfEvents); @@ -257,7 +273,8 @@ void receivesNumberOfEventsAllowsBlock() throws InterruptedException { // Scheduling on elastic to simulate a user passed in scheduler (this is the default in EventHubClientBuilder). final EventHubConsumerAsyncClient myConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); final Flux eventsFlux = myConsumer.receiveFromPartition(PARTITION_ID, EventPosition.earliest()) .take(numberOfEvents); @@ -317,7 +334,8 @@ void returnsNewListener() { any(ReceiveOptions.class), anyString())).thenReturn(Mono.just(link2), Mono.just(link3)); EventHubConsumerAsyncClient asyncClient = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); // Act & Assert StepVerifier.create(asyncClient.receiveFromPartition(PARTITION_ID, EventPosition.earliest()).take(numberOfEvents)) @@ -540,7 +558,8 @@ void receivesMultiplePartitions() { .thenReturn(Mono.just(new EventHubProperties(EVENT_HUB_NAME, Instant.EPOCH, partitions))); EventHubConsumerAsyncClient asyncClient = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); TestPublisher processor2 = TestPublisher.createCold(); AmqpReceiveLink link2 = mock(AmqpReceiveLink.class); @@ -615,7 +634,8 @@ void receivesMultiplePartitionsWhenOneCloses() { .thenReturn(Mono.just(new EventHubProperties(EVENT_HUB_NAME, Instant.EPOCH, partitions))); EventHubConsumerAsyncClient asyncClient = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); TestPublisher processor2 = TestPublisher.create(); AmqpReceiveLink link2 = mock(AmqpReceiveLink.class); @@ -675,7 +695,8 @@ void doesNotCloseSharedConnection() { EventHubConnectionProcessor eventHubConnection = Flux.create(sink -> sink.next(connection1)) .subscribeWith(new EventHubConnectionProcessor(HOSTNAME, EVENT_HUB_NAME, retryOptions)); EventHubConsumerAsyncClient sharedConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, true, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + eventHubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, true, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); // Act sharedConsumer.close(); @@ -695,7 +716,8 @@ void closesDedicatedConnection() { // Arrange EventHubConnectionProcessor hubConnection = mock(EventHubConnectionProcessor.class); EventHubConsumerAsyncClient dedicatedConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - hubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + hubConnection, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); // Act dedicatedConsumer.close(); @@ -713,8 +735,10 @@ void receiveReportsMetrics() { when(amqpReceiveLink.getCredits()).thenReturn(numberOfEvents); TestMeter meter = new TestMeter(); + EventHubsConsumerInstrumentation instrumentation = new EventHubsConsumerInstrumentation(null, meter, + HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, - CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, meter); + CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); Flux receive = consumer.receiveFromPartition(PARTITION_ID, EventPosition.earliest()) .filter(e -> isMatchingEvent(e, messageTrackingUUID)) @@ -747,8 +771,10 @@ void receiveReportsMetricsNegativeLag() { when(amqpReceiveLink.getCredits()).thenReturn(1); TestMeter meter = new TestMeter(); + EventHubsConsumerInstrumentation instrumentation = new EventHubsConsumerInstrumentation(null, meter, + HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, - CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, meter); + CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); Flux receive = consumer.receiveFromPartition(PARTITION_ID, EventPosition.earliest()) .filter(e -> isMatchingEvent(e, messageTrackingUUID)) @@ -780,8 +806,11 @@ void receiveDoesNotReportDisabledMetrics() { when(amqpReceiveLink.getCredits()).thenReturn(1); TestMeter meter = new TestMeter(false); + EventHubsConsumerInstrumentation instrumentation = new EventHubsConsumerInstrumentation(null, meter, + HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); + consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, - CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, meter); + CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); Flux receive = consumer.receiveFromPartition(PARTITION_ID, EventPosition.earliest()) .filter(e -> isMatchingEvent(e, messageTrackingUUID)) @@ -802,7 +831,7 @@ void receiveNullMeterDoesNotThrow() { when(amqpReceiveLink.getCredits()).thenReturn(1); consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, - CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, null); + CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); Flux receive = consumer.receiveFromPartition(PARTITION_ID, EventPosition.earliest()) .filter(e -> isMatchingEvent(e, messageTrackingUUID)) @@ -815,12 +844,63 @@ void receiveNullMeterDoesNotThrow() { .verifyComplete(); } - private void assertAttributes(String entityName, String entityPath, Map attributes) { - assertEquals(4, attributes.size()); - assertEquals(HOSTNAME, attributes.get("hostName")); - assertEquals(entityName, attributes.get("entityName")); - assertEquals(CONSUMER_GROUP, attributes.get("consumerGroup")); - assertEquals(entityPath, attributes.get("partitionId")); + /** + * Verifies tracing for getEventHubsProperties and getPartitionProperties + */ + @Test + void startSpanForGetProperties() { + // Arrange + final Tracer tracer1 = mock(Tracer.class); + EventHubsConsumerInstrumentation instrumentation = new EventHubsConsumerInstrumentation(tracer1, null, + HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); + EventHubConsumerAsyncClient consumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, + connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + instrumentation); + + EventHubProperties ehProperties = new EventHubProperties(EVENT_HUB_NAME, Instant.now(), new String[]{"0"}); + PartitionProperties partitionProperties = new PartitionProperties(EVENT_HUB_NAME, "0", + 1L, 2L, OffsetDateTime.now().toString(), Instant.now(), false); + EventHubManagementNode managementNode = mock(EventHubManagementNode.class); + when(connection.getManagementNode()).thenReturn(Mono.just(managementNode)); + when(managementNode.getEventHubProperties()).thenReturn(Mono.just(ehProperties)); + when(managementNode.getPartitionProperties(anyString())).thenReturn(Mono.just(partitionProperties)); + + when(tracer1.start(eq("EventHubs.getPartitionProperties"), any(), eq(ProcessKind.SEND))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + assertEquals(passed.getData(AZ_TRACING_NAMESPACE_KEY).get(), AZ_NAMESPACE_VALUE); + assertEquals(passed.getData(Tracer.ENTITY_PATH_KEY).get(), EVENT_HUB_NAME); + assertEquals(passed.getData(HOST_NAME_KEY).get(), HOSTNAME); + return passed.addData(PARENT_TRACE_CONTEXT_KEY, "getPartitionProperties"); + } + ); + when(tracer1.start(eq("EventHubs.getEventHubProperties"), any(), eq(ProcessKind.SEND))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + assertEquals(passed.getData(AZ_TRACING_NAMESPACE_KEY).get(), AZ_NAMESPACE_VALUE); + assertEquals(passed.getData(Tracer.ENTITY_PATH_KEY).get(), EVENT_HUB_NAME); + assertEquals(passed.getData(HOST_NAME_KEY).get(), HOSTNAME); + return passed.addData(PARENT_TRACE_CONTEXT_KEY, "getEventHubsProperties"); + } + ); + + // Act + StepVerifier.create(consumer.getEventHubProperties()) + .consumeNextWith(p -> assertSame(ehProperties, p)) + .verifyComplete(); + + StepVerifier.create(consumer.getPartitionProperties("0")) + .consumeNextWith(p -> assertSame(partitionProperties, p)) + .verifyComplete(); + + //Assert + verify(tracer1, times(1)) + .start(eq("EventHubs.getPartitionProperties"), any(), eq(ProcessKind.SEND)); + verify(tracer1, times(1)) + .start(eq("EventHubs.getEventHubProperties"), any(), eq(ProcessKind.SEND)); + verify(tracer1, times(2)).end(eq("success"), isNull(), any()); + + verifyNoInteractions(onClientClosed); } private void assertPartition(String partitionId, PartitionEvent event) { @@ -851,4 +931,13 @@ private void sendMessages(TestPublisher testPublisher, int numberOfEven testPublisher.next(message); } } + + + private void assertAttributes(String entityName, String entityPath, Map attributes) { + assertEquals(4, attributes.size()); + assertEquals(HOSTNAME, attributes.get("hostName")); + assertEquals(entityName, attributes.get("entityName")); + assertEquals(CONSUMER_GROUP, attributes.get("consumerGroup")); + assertEquals(entityPath, attributes.get("partitionId")); + } } diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerClientTest.java index b1da9c2be205..2843c5f92bd9 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerClientTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubConsumerClientTest.java @@ -15,10 +15,10 @@ import com.azure.core.util.ClientOptions; import com.azure.core.util.Configuration; import com.azure.core.util.IterableStream; -import com.azure.core.util.metrics.Meter; import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.implementation.EventHubAmqpConnection; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.LastEnqueuedEventProperties; import com.azure.messaging.eventhubs.models.PartitionEvent; @@ -75,7 +75,8 @@ public class EventHubConsumerClientTest { private static final String CLIENT_IDENTIFIER = "my-client-identifier"; private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(4); private static final Duration TIMEOUT = Duration.ofSeconds(30); - private static final Meter DEFAULT_METER = null; + private static final EventHubsConsumerInstrumentation DEFAULT_INSTRUMENTATION = + new EventHubsConsumerInstrumentation(null, null, HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, true); private final String messageTrackingUUID = UUID.randomUUID().toString(); private final TestPublisher messageProcessor = TestPublisher.createCold(); @@ -140,7 +141,8 @@ AmqpTransportType.AMQP_WEB_SOCKETS, new AmqpRetryOptions(), ProxyOptions.SYSTEM_ when(connection.closeAsync()).thenReturn(Mono.empty()); asyncConsumer = new EventHubConsumerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, + DEFAULT_INSTRUMENTATION); consumer = new EventHubConsumerClient(asyncConsumer, Duration.ofSeconds(10)); } @@ -166,7 +168,7 @@ public void lastEnqueuedEventInformationIsNull() { // Arrange final EventHubConsumerAsyncClient runtimeConsumer = new EventHubConsumerAsyncClient( HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, CONSUMER_GROUP, - PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + PREFETCH, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final EventHubConsumerClient consumer = new EventHubConsumerClient(runtimeConsumer, Duration.ofSeconds(5)); final int numberOfEvents = 10; sendMessages(messageProcessor, numberOfEvents, PARTITION_ID); @@ -196,7 +198,7 @@ public void lastEnqueuedEventInformationCreated() { final ReceiveOptions options = new ReceiveOptions().setTrackLastEnqueuedEventProperties(true); final EventHubConsumerAsyncClient runtimeConsumer = new EventHubConsumerAsyncClient( HOSTNAME, EVENT_HUB_NAME, connectionProcessor, messageSerializer, CONSUMER_GROUP, PREFETCH, - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final EventHubConsumerClient consumer = new EventHubConsumerClient(runtimeConsumer, Duration.ofSeconds(5)); final int numberOfEvents = 10; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubPartitionAsyncConsumerTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubPartitionAsyncConsumerTest.java index b663ed2e38e4..38205232fa92 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubPartitionAsyncConsumerTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubPartitionAsyncConsumerTest.java @@ -14,6 +14,7 @@ import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.eventhubs.implementation.AmqpReceiveLinkProcessor; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.LastEnqueuedEventProperties; import com.azure.messaging.eventhubs.models.PartitionContext; @@ -61,7 +62,8 @@ class EventHubPartitionAsyncConsumerTest { private static final String PARTITION_ID = "a-partition-id"; private static final Instant TEST_DATE = Instant.ofEpochSecond(1578643343); private static final ClientLogger LOGGER = new ClientLogger(EventHubPartitionAsyncConsumerTest.class); - + private static final EventHubsConsumerInstrumentation DEFAULT_INSTRUMENTATION = + new EventHubsConsumerInstrumentation(null, null, HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, false); @Mock private AmqpReceiveLink link1; @Mock @@ -127,7 +129,7 @@ void teardown() { void receivesMessages(boolean trackLastEnqueuedProperties) { // Arrange linkProcessor = createSink(link1, link2).subscribeWith(new AmqpReceiveLinkProcessor("foo-bar", - PREFETCH, parentConnection)); + PREFETCH, PARTITION_ID, parentConnection, DEFAULT_INSTRUMENTATION)); consumer = new EventHubPartitionAsyncConsumer(linkProcessor, messageSerializer, HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, PARTITION_ID, currentPosition, trackLastEnqueuedProperties); @@ -176,7 +178,7 @@ void receivesMessages(boolean trackLastEnqueuedProperties) { void receiveMultipleTimes() { // Arrange linkProcessor = createSink(link1, link2).subscribeWith(new AmqpReceiveLinkProcessor("foo-bar", - PREFETCH, parentConnection)); + PREFETCH, PARTITION_ID, parentConnection, DEFAULT_INSTRUMENTATION)); consumer = new EventHubPartitionAsyncConsumer(linkProcessor, messageSerializer, HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, PARTITION_ID, currentPosition, false); @@ -242,7 +244,7 @@ void receiveMultipleTimes() { @Test void listensToShutdownSignals() throws InterruptedException { // Arrange - linkProcessor = createSink(link1, link2).subscribeWith(new AmqpReceiveLinkProcessor("path", PREFETCH, parentConnection)); + linkProcessor = createSink(link1, link2).subscribeWith(new AmqpReceiveLinkProcessor("path", PREFETCH, PARTITION_ID, parentConnection, DEFAULT_INSTRUMENTATION)); consumer = new EventHubPartitionAsyncConsumer(linkProcessor, messageSerializer, HOSTNAME, EVENT_HUB_NAME, CONSUMER_GROUP, PARTITION_ID, currentPosition, false); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java index 72137f1a2520..43e63f020391 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java @@ -14,7 +14,6 @@ import com.azure.core.amqp.implementation.AmqpSendLink; import com.azure.core.amqp.implementation.ConnectionOptions; import com.azure.core.amqp.implementation.MessageSerializer; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.amqp.models.CbsAuthorizationType; import com.azure.core.credential.TokenCredential; import com.azure.core.test.utils.metrics.TestCounter; @@ -24,12 +23,12 @@ import com.azure.core.util.Configuration; import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; -import com.azure.core.util.metrics.Meter; import com.azure.core.util.tracing.ProcessKind; import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.ClientConstants; import com.azure.messaging.eventhubs.implementation.EventHubAmqpConnection; import com.azure.messaging.eventhubs.implementation.EventHubConnectionProcessor; +import com.azure.messaging.eventhubs.implementation.EventHubManagementNode; import com.azure.messaging.eventhubs.models.CreateBatchOptions; import com.azure.messaging.eventhubs.models.SendOptions; import org.apache.qpid.proton.amqp.messaging.Section; @@ -57,6 +56,7 @@ import java.time.Duration; import java.time.Instant; +import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; import java.util.Map; @@ -77,6 +77,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; @@ -100,7 +101,7 @@ class EventHubProducerAsyncClientTest { private static final String ENTITY_PATH = HOSTNAME + Configuration.getGlobalConfiguration() .get("AZURE_EVENTHUBS_ENDPOINT_SUFFIX", ".servicebus.windows.net"); private static final ClientLogger LOGGER = new ClientLogger(EventHubProducerAsyncClient.class); - private static final Meter DEFAULT_METER = null; + private static final EventHubsProducerInstrumentation DEFAULT_INSTRUMENTATION = new EventHubsProducerInstrumentation(null, null, HOSTNAME, EVENT_HUB_NAME); @Mock private AmqpSendLink sendLink; @Mock @@ -133,7 +134,6 @@ class EventHubProducerAsyncClientTest { private final FluxSink endpointSink = endpointProcessor.sink(FluxSink.OverflowStrategy.BUFFER); private EventHubProducerAsyncClient producer; private EventHubConnectionProcessor connectionProcessor; - private TracerProvider tracerProvider; private ConnectionOptions connectionOptions; private final Scheduler testScheduler = Schedulers.newBoundedElastic(10, 10, "test"); @@ -151,7 +151,6 @@ static void afterAll() { void setup(TestInfo testInfo) { MockitoAnnotations.initMocks(this); - tracerProvider = new TracerProvider(Collections.emptyList()); connectionOptions = new ConnectionOptions(HOSTNAME, tokenCredential, CbsAuthorizationType.SHARED_ACCESS_SIGNATURE, ClientConstants.AZURE_ACTIVE_DIRECTORY_SCOPE, AmqpTransportType.AMQP_WEB_SOCKETS, retryOptions, ProxyOptions.SYSTEM_DEFAULTS, testScheduler, @@ -167,7 +166,7 @@ void setup(TestInfo testInfo) { new EventHubConnectionProcessor(connectionOptions.getFullyQualifiedNamespace(), "event-hub-path", connectionOptions.getRetry())); producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); when(sendLink.getLinkSize()).thenReturn(Mono.just(ClientConstants.MAX_MESSAGE_LENGTH_BYTES)); when(sendLink2.getLinkSize()).thenReturn(Mono.just(ClientConstants.MAX_MESSAGE_LENGTH_BYTES)); @@ -260,8 +259,8 @@ void sendSingleMessageWithBlock() throws InterruptedException { final Semaphore semaphore = new Semaphore(1); // In our actual client builder, we allow this. final EventHubProducerAsyncClient flexibleProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, testScheduler, - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, testScheduler, + false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); // EC is the prefix they use when creating a link that sends to the service round-robin. when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), eq(retryOptions), eq(CLIENT_IDENTIFIER))) @@ -335,12 +334,10 @@ void sendStartSpanSingleMessage() { // Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); - + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), eq(CLIENT_IDENTIFIER))) .thenReturn(Mono.just(sendLink)); @@ -396,6 +393,64 @@ void sendStartSpanSingleMessage() { verifyNoInteractions(onClientClosed); } + /** + * Verifies tracing for getEventHubsProperties and getPartitionProperties + */ + @Test + void startSpanForGetProperties() { + // Arrange + final Tracer tracer1 = mock(Tracer.class); + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); + final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); + + EventHubProperties ehProperties = new EventHubProperties(EVENT_HUB_NAME, Instant.now(), new String[]{"0"}); + PartitionProperties partitionProperties = new PartitionProperties(EVENT_HUB_NAME, "0", + 1L, 2L, OffsetDateTime.now().toString(), Instant.now(), false); + EventHubManagementNode managementNode = mock(EventHubManagementNode.class); + when(connection.getManagementNode()).thenReturn(Mono.just(managementNode)); + when(managementNode.getEventHubProperties()).thenReturn(Mono.just(ehProperties)); + when(managementNode.getPartitionProperties(anyString())).thenReturn(Mono.just(partitionProperties)); + + when(tracer1.start(eq("EventHubs.getPartitionProperties"), any(), eq(ProcessKind.SEND))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + assertEquals(passed.getData(AZ_TRACING_NAMESPACE_KEY).get(), AZ_NAMESPACE_VALUE); + assertEquals(passed.getData(Tracer.ENTITY_PATH_KEY).get(), EVENT_HUB_NAME); + assertEquals(passed.getData(HOST_NAME_KEY).get(), HOSTNAME); + return passed.addData(PARENT_TRACE_CONTEXT_KEY, "getPartitionProperties"); + } + ); + when(tracer1.start(eq("EventHubs.getEventHubProperties"), any(), eq(ProcessKind.SEND))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + assertEquals(passed.getData(AZ_TRACING_NAMESPACE_KEY).get(), AZ_NAMESPACE_VALUE); + assertEquals(passed.getData(Tracer.ENTITY_PATH_KEY).get(), EVENT_HUB_NAME); + assertEquals(passed.getData(HOST_NAME_KEY).get(), HOSTNAME); + return passed.addData(PARENT_TRACE_CONTEXT_KEY, "getEventHubsProperties"); + } + ); + + // Act + StepVerifier.create(asyncProducer.getEventHubProperties()) + .consumeNextWith(p -> assertSame(ehProperties, p)) + .verifyComplete(); + + StepVerifier.create(asyncProducer.getPartitionProperties("0")) + .consumeNextWith(p -> assertSame(partitionProperties, p)) + .verifyComplete(); + + //Assert + verify(tracer1, times(1)) + .start(eq("EventHubs.getPartitionProperties"), any(), eq(ProcessKind.SEND)); + verify(tracer1, times(1)) + .start(eq("EventHubs.getEventHubProperties"), any(), eq(ProcessKind.SEND)); + verify(tracer1, times(2)).end(eq("success"), isNull(), any()); + + verifyNoInteractions(onClientClosed); + } + /** * Verifies send, message and addLink spans are only invoked once even for multiple retry attempts to send the * message. @@ -404,11 +459,9 @@ void sendStartSpanSingleMessage() { void sendMessageRetrySpanTest() { //Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); - + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); final String failureKey = "fail"; final EventData testData = new EventData("test") @@ -428,7 +481,6 @@ void sendMessageRetrySpanTest() { when(tracer1.getSharedSpanBuilder(eq("EventHubs.send"), any())).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); - assertEquals("span-context", passed.getData("span-context").orElseGet(null)); return passed.addData(SPAN_BUILDER_KEY, "span-builder"); } ); @@ -541,11 +593,10 @@ void createsEventDataBatch() { void startMessageSpansOnCreateBatch() { // Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); final AmqpSendLink link = mock(AmqpSendLink.class); when(link.getLinkSize()).thenReturn(Mono.just(ClientConstants.MAX_MESSAGE_LENGTH_BYTES)); @@ -573,7 +624,6 @@ void startMessageSpansOnCreateBatch() { when(tracer1.getSharedSpanBuilder(eq("EventHubs.send"), any())).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); - assertEquals(0, passed.getData(SPAN_CONTEXT_KEY).orElseGet(null)); return passed.addData(SPAN_BUILDER_KEY, "span-builder"); } ); @@ -846,13 +896,15 @@ void sendsAnEventDataBatchWithMetrics() { when(sendLink2.send(any(Message.class))).thenReturn(Mono.empty()); TestMeter meter = new TestMeter(); + EventHubsProducerInstrumentation instrumentation1 = new EventHubsProducerInstrumentation(null, meter, HOSTNAME, eventHub1); EventHubProducerAsyncClient producer1 = new EventHubProducerAsyncClient(HOSTNAME, eventHub1, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, meter); + messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation1); + EventHubsProducerInstrumentation instrumentation2 = new EventHubsProducerInstrumentation(null, meter, HOSTNAME, eventHub2); EventHubProducerAsyncClient producer2 = new EventHubProducerAsyncClient(HOSTNAME, eventHub2, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, meter); + messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation2); StepVerifier.create(producer1.createBatch() .flatMap(batch -> { @@ -879,6 +931,7 @@ void sendsAnEventDataBatchWithMetrics() { assertAttributes(eventHub2, null, "ok", measurements.get(1).getAttributes()); } + @Test void sendsAnEventDataBatchWithMetricsFailure() { when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), any())).thenReturn(Mono.just(sendLink)); @@ -888,9 +941,11 @@ void sendsAnEventDataBatchWithMetricsFailure() { when(sendLink.send(any(Message.class))).thenReturn(Mono.error(new RuntimeException("foo"))); TestMeter meter = new TestMeter(); + EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(null, meter, HOSTNAME, EVENT_HUB_NAME); + EventHubProducerAsyncClient producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, meter); + messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); StepVerifier.create(producer.send(new EventData("1"))) .expectErrorMessage("foo") @@ -918,8 +973,9 @@ void sendsAnEventDataBatchWithMetricsPartitionId() { when(sendLink.send(any(Message.class))).thenReturn(Mono.empty()); TestMeter meter = new TestMeter(); + EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(null, meter, HOSTNAME, EVENT_HUB_NAME); EventHubProducerAsyncClient producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, meter); + connectionProcessor, retryOptions, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); SendOptions options = new SendOptions().setPartitionId(partitionId); StepVerifier.create(producer.send(new EventData("1"), options)) @@ -935,6 +991,57 @@ void sendsAnEventDataBatchWithMetricsPartitionId() { assertAttributes(EVENT_HUB_NAME, partitionId, "ok", measurements.get(0).getAttributes()); } + @Test + void sendsAnEventDataBatchWithMetricsAndTraces() { + when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), any())).thenReturn(Mono.just(sendLink)); + when(sendLink.send(anyList())).thenReturn(Mono.empty()); + when(sendLink.getHostname()).thenReturn(HOSTNAME); + when(sendLink.getEntityPath()).thenReturn(EVENT_HUB_NAME); + when(sendLink.getLinkName()).thenReturn(EVENT_HUB_NAME); + when(sendLink.send(any(Message.class))).thenReturn(Mono.empty()); + + TestMeter meter = new TestMeter(); + Tracer tracer = mock(Tracer.class); + EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer, meter, HOSTNAME, EVENT_HUB_NAME); + EventHubProducerAsyncClient producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, + connectionProcessor, retryOptions, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); + + when(tracer.start(eq("EventHubs.send"), any(), eq(ProcessKind.SEND))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(PARENT_TRACE_CONTEXT_KEY, "parent span"); + } + ); + when(tracer.start(eq("EventHubs.message"), any(), eq(ProcessKind.MESSAGE))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed + .addData(DIAGNOSTIC_ID_KEY, "diag-id") + .addData(SPAN_CONTEXT_KEY, "span-context"); + } + ); + when(tracer.getSharedSpanBuilder(eq("EventHubs.send"), any())).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_BUILDER_KEY, "span-builder"); + } + ); + + StepVerifier.create(producer.send(new EventData("1"))) + .verifyComplete(); + + TestCounter eventCounter = meter.getCounters().get("messaging.eventhubs.events.sent"); + assertNotNull(eventCounter); + + List> measurements = eventCounter.getMeasurements(); + assertEquals(1, measurements.size()); + + assertEquals(1, measurements.get(0).getValue()); + assertAttributes(EVENT_HUB_NAME, null, "ok", measurements.get(0).getAttributes()); + + assertEquals("parent span", measurements.get(0).getContext().getData(PARENT_TRACE_CONTEXT_KEY).get()); + } + @Test void sendsAnEventDataBatchWithDisabledMetrics() { when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), any())).thenReturn(Mono.just(sendLink)); @@ -945,8 +1052,9 @@ void sendsAnEventDataBatchWithDisabledMetrics() { when(sendLink.send(any(Message.class))).thenReturn(Mono.empty()); TestMeter meter = new TestMeter(false); + EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(null, meter, HOSTNAME, EVENT_HUB_NAME); EventHubProducerAsyncClient producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, meter); + connectionProcessor, retryOptions, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); StepVerifier.create(producer.send(new EventData("1"))) .verifyComplete(); @@ -964,7 +1072,7 @@ void sendsAnEventDataBatchWithNullMeterDoesNotThrow() { when(sendLink.send(any(Message.class))).thenReturn(Mono.empty()); EventHubProducerAsyncClient producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, null); + connectionProcessor, retryOptions, messageSerializer, testScheduler, false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); StepVerifier.create(producer.send(new EventData("1"))) .verifyComplete(); @@ -1035,8 +1143,8 @@ void doesNotCloseSharedConnection() { // Arrange EventHubConnectionProcessor hubConnection = mock(EventHubConnectionProcessor.class); EventHubProducerAsyncClient sharedProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - hubConnection, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - true, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + hubConnection, retryOptions, messageSerializer, Schedulers.parallel(), + true, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); // Act sharedProducer.close(); @@ -1054,8 +1162,8 @@ void closesDedicatedConnection() { // Arrange EventHubConnectionProcessor hubConnection = mock(EventHubConnectionProcessor.class); EventHubProducerAsyncClient dedicatedProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - hubConnection, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + hubConnection, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); // Act dedicatedProducer.close(); @@ -1073,8 +1181,8 @@ void closesDedicatedConnectionOnlyOnce() { // Arrange EventHubConnectionProcessor hubConnection = mock(EventHubConnectionProcessor.class); EventHubProducerAsyncClient dedicatedProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - hubConnection, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + hubConnection, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); // Act dedicatedProducer.close(); @@ -1110,7 +1218,7 @@ void reopensOnFailure() { new EventHubConnectionProcessor(EVENT_HUB_NAME, connectionOptions.getFullyQualifiedNamespace(), connectionOptions.getRetry())); producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final int count = 4; final byte[] contents = TEST_CONTENTS.getBytes(UTF_8); @@ -1185,7 +1293,7 @@ void closesOnNonTransientFailure() { new EventHubConnectionProcessor(connectionOptions.getFullyQualifiedNamespace(), EVENT_HUB_NAME, connectionOptions.getRetry())); producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final int count = 4; final byte[] contents = TEST_CONTENTS.getBytes(UTF_8); @@ -1261,7 +1369,7 @@ void resendMessageOnTransientLinkFailure() { new EventHubConnectionProcessor(connectionOptions.getFullyQualifiedNamespace(), EVENT_HUB_NAME, connectionOptions.getRetry())); producer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final int count = 4; final byte[] contents = TEST_CONTENTS.getBytes(UTF_8); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java index d751e4b57fd8..2faf255d5a67 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java @@ -13,12 +13,10 @@ import com.azure.core.amqp.implementation.AmqpSendLink; import com.azure.core.amqp.implementation.ConnectionOptions; import com.azure.core.amqp.implementation.MessageSerializer; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.amqp.models.CbsAuthorizationType; import com.azure.core.credential.TokenCredential; import com.azure.core.util.ClientOptions; import com.azure.core.util.Context; -import com.azure.core.util.metrics.Meter; import com.azure.core.util.tracing.ProcessKind; import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.ClientConstants; @@ -43,7 +41,6 @@ import reactor.core.scheduler.Schedulers; import java.time.Duration; -import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -78,10 +75,9 @@ public class EventHubProducerClientTest { private static final String HOSTNAME = "my-host-name"; private static final String EVENT_HUB_NAME = "my-event-hub-name"; private static final String CLIENT_IDENTIFIER = "my-client-identifier"; - private static final Meter DEFAULT_METER = null; + private static final EventHubsProducerInstrumentation DEFAULT_INSTRUMENTATION = new EventHubsProducerInstrumentation(null, null, HOSTNAME, EVENT_HUB_NAME); private final AmqpRetryOptions retryOptions = new AmqpRetryOptions().setTryTimeout(Duration.ofSeconds(30)); private final MessageSerializer messageSerializer = new EventHubMessageSerializer(); - @Mock private AmqpSendLink sendLink; @Mock @@ -108,8 +104,6 @@ public void setup() { when(sendLink.getHostname()).thenReturn(HOSTNAME); when(sendLink.getEntityPath()).thenReturn(EVENT_HUB_NAME); - final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); - ConnectionOptions connectionOptions = new ConnectionOptions(HOSTNAME, tokenCredential, CbsAuthorizationType.SHARED_ACCESS_SIGNATURE, ClientConstants.AZURE_ACTIVE_DIRECTORY_SCOPE, AmqpTransportType.AMQP_WEB_SOCKETS, retryOptions, ProxyOptions.SYSTEM_DEFAULTS, Schedulers.parallel(), @@ -119,7 +113,7 @@ public void setup() { .subscribeWith(new EventHubConnectionProcessor(connectionOptions.getFullyQualifiedNamespace(), "event-hub-path", connectionOptions.getRetry())); asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, connectionProcessor, retryOptions, - tracerProvider, messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + messageSerializer, Schedulers.parallel(), false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); when(connection.getEndpointStates()).thenReturn(Flux.create(sink -> sink.next(AmqpEndpointState.ACTIVE))); when(connection.closeAsync()).thenReturn(Mono.empty()); @@ -169,11 +163,11 @@ public void sendSingleMessage() { public void sendStartSpanSingleMessage() { //Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - final TracerProvider tracerProvider = new TracerProvider(tracers); + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); + final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); final EventHubProducerClient producer = new EventHubProducerClient(asyncProducer, retryOptions.getTryTimeout()); final EventData eventData = new EventData("hello-world".getBytes(UTF_8)); @@ -204,6 +198,13 @@ public void sendStartSpanSingleMessage() { } ); + when(tracer1.extractContext(eq("diag-id"), any())).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_CONTEXT_KEY, "span-context"); + } + ); + doAnswer( invocation -> { Context passed = invocation.getArgument(0, Context.class); @@ -239,19 +240,18 @@ public void sendStartSpanSingleMessage() { public void sendMessageRetrySpanTest() { //Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); // EC is the prefix they use when creating a link that sends to the service round-robin. when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), eq(CLIENT_IDENTIFIER))) .thenReturn(Mono.just(sendLink)); final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); final EventHubProducerClient producer = new EventHubProducerClient(asyncProducer, retryOptions.getTryTimeout()); - final EventData eventData = new EventData("hello-world".getBytes(UTF_8)) - .addContext(SPAN_CONTEXT_KEY, "span-context"); + final EventData eventData = new EventData("hello-world".getBytes(UTF_8)); + eventData.getProperties().put("traceparent", "traceparent"); when(tracer1.start(eq("EventHubs.send"), any(), eq(ProcessKind.SEND))).thenAnswer( invocation -> { @@ -266,11 +266,17 @@ public void sendMessageRetrySpanTest() { when(tracer1.getSharedSpanBuilder(eq("EventHubs.send"), any())).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); - assertEquals("span-context", passed.getData("span-context").orElseGet(null)); return passed.addData(SPAN_BUILDER_KEY, "span-builder"); } ); + when(tracer1.extractContext(eq("traceparent"), any())).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_CONTEXT_KEY, "span-context"); + } + ); + //Act try { producer.send(eventData); @@ -299,10 +305,9 @@ public void sendEventsExceedsBatchSize() { when(connection.createSendLink(eq(EVENT_HUB_NAME), eq(EVENT_HUB_NAME), any(), eq(CLIENT_IDENTIFIER))) .thenReturn(Mono.just(sendLink)); when(sendLink.getLinkSize()).thenReturn(Mono.just(1024)); - TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_INSTRUMENTATION); final EventHubProducerClient producer = new EventHubProducerClient(asyncProducer, retryOptions.getTryTimeout()); //Act & Assert @@ -401,11 +406,10 @@ public void createsEventDataBatch() { public void startsMessageSpanOnEventBatch() { // Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - final TracerProvider tracerProvider = new TracerProvider(tracers); + final EventHubsProducerInstrumentation instrumentation = new EventHubsProducerInstrumentation(tracer1, null, HOSTNAME, EVENT_HUB_NAME); final EventHubProducerAsyncClient asyncProducer = new EventHubProducerAsyncClient(HOSTNAME, EVENT_HUB_NAME, - connectionProcessor, retryOptions, tracerProvider, messageSerializer, Schedulers.parallel(), - false, onClientClosed, CLIENT_IDENTIFIER, DEFAULT_METER); + connectionProcessor, retryOptions, messageSerializer, Schedulers.parallel(), + false, onClientClosed, CLIENT_IDENTIFIER, instrumentation); final EventHubProducerClient producer = new EventHubProducerClient(asyncProducer, retryOptions.getTryTimeout()); final AmqpSendLink link = mock(AmqpSendLink.class); @@ -428,7 +432,6 @@ public void startsMessageSpanOnEventBatch() { when(tracer1.getSharedSpanBuilder(eq("EventHubs.send"), any())).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); - assertEquals(0, passed.getData(SPAN_CONTEXT_KEY).orElseGet(null)); return passed.addData(SPAN_BUILDER_KEY, "span-builder"); } ); @@ -469,7 +472,6 @@ public void startsMessageSpanOnEventBatch() { producer.close(); } - verify(tracer1, times(2)) .start(eq("EventHubs.message"), any(), eq(ProcessKind.MESSAGE)); verify(tracer1, times(1)).getSharedSpanBuilder(eq("EventHubs.send"), any()); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientBuilderTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientBuilderTest.java index 95d4307955aa..d79df565ff29 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientBuilderTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientBuilderTest.java @@ -6,6 +6,7 @@ import com.azure.core.util.Configuration; import com.azure.messaging.eventhubs.implementation.ClientConstants; import java.time.Duration; + import org.junit.jupiter.api.Test; import java.net.URI; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientErrorHandlingTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientErrorHandlingTest.java index 0034f26d4549..bd44f2baca04 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientErrorHandlingTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientErrorHandlingTest.java @@ -3,6 +3,8 @@ package com.azure.messaging.eventhubs; +import com.azure.core.util.metrics.Meter; +import com.azure.core.util.tracing.Tracer; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; import com.azure.messaging.eventhubs.models.Checkpoint; import com.azure.messaging.eventhubs.models.CloseContext; @@ -41,7 +43,6 @@ * Unit tests for {@link EventProcessorClient} error handling. */ public class EventProcessorClientErrorHandlingTest { - @Mock private EventHubClientBuilder eventHubClientBuilder; @@ -54,6 +55,12 @@ public class EventProcessorClientErrorHandlingTest { @Mock private EventData eventData1; + @Mock + private Tracer tracer; + + @Mock + private Meter meter; + private CountDownLatch countDownLatch; @BeforeEach @@ -71,13 +78,12 @@ public void setup() { public void testCheckpointStoreErrors(CheckpointStore checkpointStore) throws InterruptedException { countDownLatch = new CountDownLatch(1); EventProcessorClient client = new EventProcessorClient(eventHubClientBuilder, "cg", - () -> new TestPartitionProcessor(), checkpointStore, false, - null, errorContext -> { - countDownLatch.countDown(); - Assertions.assertEquals("NONE", errorContext.getPartitionContext().getPartitionId()); - Assertions.assertEquals("cg", errorContext.getPartitionContext().getConsumerGroup()); - Assertions.assertTrue(errorContext.getThrowable() instanceof IllegalStateException); - }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> new TestPartitionProcessor(), checkpointStore, false, errorContext -> { + countDownLatch.countDown(); + Assertions.assertEquals("NONE", errorContext.getPartitionContext().getPartitionId()); + Assertions.assertEquals("cg", errorContext.getPartitionContext().getConsumerGroup()); + Assertions.assertTrue(errorContext.getThrowable() instanceof IllegalStateException); + }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, tracer); client.start(); boolean completed = countDownLatch.await(3, TimeUnit.SECONDS); try { @@ -92,14 +98,13 @@ public void testCheckpointStoreErrors(CheckpointStore checkpointStore) throws In public void testProcessEventHandlerError() throws InterruptedException { countDownLatch = new CountDownLatch(1); when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); - when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT)).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT, true)).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1))); EventProcessorClient client = new EventProcessorClient(eventHubClientBuilder, "cg", () -> new BadProcessEventHandler(countDownLatch), new SampleCheckpointStore(), false, - null, errorContext -> { - }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), - LoadBalancingStrategy.BALANCED); + errorContext -> { }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), + LoadBalancingStrategy.BALANCED, tracer); client.start(); boolean completed = countDownLatch.await(3, TimeUnit.SECONDS); client.stop(); @@ -109,14 +114,13 @@ public void testProcessEventHandlerError() throws InterruptedException { @Test public void testInitHandlerError() throws InterruptedException { countDownLatch = new CountDownLatch(1); - when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT)).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT, true)).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1))); EventProcessorClient client = new EventProcessorClient(eventHubClientBuilder, "cg", () -> new BadInitHandler(countDownLatch), new SampleCheckpointStore(), false, - null, errorContext -> { - }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), - LoadBalancingStrategy.BALANCED); + errorContext -> { }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), + LoadBalancingStrategy.BALANCED, tracer); client.start(); boolean completed = countDownLatch.await(3, TimeUnit.SECONDS); client.stop(); @@ -127,14 +131,13 @@ public void testInitHandlerError() throws InterruptedException { public void testCloseHandlerError() throws InterruptedException { countDownLatch = new CountDownLatch(1); when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); - when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT)).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer("cg", DEFAULT_PREFETCH_COUNT, true)).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1))); EventProcessorClient client = new EventProcessorClient(eventHubClientBuilder, "cg", () -> new BadCloseHandler(countDownLatch), new SampleCheckpointStore(), false, - null, errorContext -> { - }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), - LoadBalancingStrategy.BALANCED); + errorContext -> { }, new HashMap<>(), 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), + LoadBalancingStrategy.BALANCED, tracer); client.start(); boolean completed = countDownLatch.await(3, TimeUnit.SECONDS); client.stop(); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientTest.java index 9ddf74d07282..bbc90d675ec5 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventProcessorClientTest.java @@ -3,7 +3,6 @@ package com.azure.messaging.eventhubs; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.util.Context; import com.azure.core.util.tracing.ProcessKind; import com.azure.core.util.tracing.Tracer; @@ -30,7 +29,6 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -38,10 +36,13 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY; import static com.azure.core.util.tracing.Tracer.MESSAGE_ENQUEUED_TIME; import static com.azure.core.util.tracing.Tracer.PARENT_TRACE_CONTEXT_KEY; +import static com.azure.core.util.tracing.Tracer.PARENT_SPAN_KEY; +import static com.azure.core.util.tracing.Tracer.SPAN_BUILDER_KEY; import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; import static com.azure.messaging.eventhubs.EventHubClientBuilder.DEFAULT_PREFETCH_COUNT; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -49,6 +50,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; @@ -56,6 +58,7 @@ import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -111,18 +114,15 @@ public void teardown() throws Exception { */ @Test public void testWithSimplePartitionProcessor() throws Exception { + Tracer tracer = mock(Tracer.class); // Arrange - final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); - when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); when(eventHubAsyncClient.getEventHubName()).thenReturn("test-eh"); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), anyBoolean())) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))).thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2))); when(eventData1.getSequenceNumber()).thenReturn(1L); @@ -135,13 +135,13 @@ public void testWithSimplePartitionProcessor() throws Exception { final long beforeTest = System.currentTimeMillis(); String diagnosticId = "00-08ee063508037b1719dddcbf248e30e2-1365c684eb25daed-01"; - when(tracer1.extractContext(eq(diagnosticId), any())).thenAnswer( + when(tracer.extractContext(eq(diagnosticId), any())).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); return passed.addData(SPAN_CONTEXT_KEY, "value"); } ); - when(tracer1.start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS))).thenAnswer( + when(tracer.start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS))).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); return passed.addData(SPAN_CONTEXT_KEY, "value1") @@ -153,8 +153,8 @@ public void testWithSimplePartitionProcessor() throws Exception { // Act final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, tracer); eventProcessorClient.start(); TimeUnit.SECONDS.sleep(10); @@ -177,7 +177,7 @@ public void testWithSimplePartitionProcessor() throws Exception { verify(eventHubAsyncClient, atLeastOnce()).getPartitionIds(); verify(eventHubAsyncClient, atLeastOnce()) - .createConsumer(anyString(), anyInt()); + .createConsumer(anyString(), anyInt(), eq(true)); verify(consumer1, atLeastOnce()).receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class)); verify(consumer1, atLeastOnce()).close(); @@ -192,7 +192,6 @@ public void testWithSimplePartitionProcessor() throws Exception { assertTrue(partitionOwnership.getLastModifiedTime() <= System.currentTimeMillis(), "LastModifiedTime"); assertNotNull(partitionOwnership.getETag()); }).verifyComplete(); - } /** @@ -204,15 +203,14 @@ public void testWithSimplePartitionProcessor() throws Exception { public void testProcessSpans() throws Exception { //Arrange final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); + when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); when(eventHubAsyncClient.getEventHubName()).thenReturn("test-eh"); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), eq(true))) .thenReturn(consumer1); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventData1.getSequenceNumber()).thenReturn(1L); @@ -237,21 +235,28 @@ public void testProcessSpans() throws Exception { invocation -> { Context passed = invocation.getArgument(1, Context.class); assertTrue(passed.getData(MESSAGE_ENQUEUED_TIME).isPresent()); - return passed.addData(SPAN_CONTEXT_KEY, "value1").addData("scope", (AutoCloseable) () -> { - return; - }).addData(PARENT_TRACE_CONTEXT_KEY, "value2"); + return passed.addData(SPAN_CONTEXT_KEY, "value1").addData("scope", (AutoCloseable) () -> { }) + .addData(PARENT_SPAN_KEY, "value2"); } ); + CountDownLatch latch = new CountDownLatch(1); + when(tracer1.makeSpanCurrent(any())).thenReturn(() -> { }); + + doAnswer(invocation -> { + latch.countDown(); + return null; + }).when(tracer1).end(eq("success"), isNull(), any()); + final SampleCheckpointStore checkpointStore = new SampleCheckpointStore(); //Act EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - TestPartitionProcessor::new, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + TestPartitionProcessor::new, checkpointStore, false, ec -> { }, new HashMap<>(), + 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, tracer1); eventProcessorClient.start(); - TimeUnit.SECONDS.sleep(10); + assertTrue(latch.await(10, TimeUnit.SECONDS)); eventProcessorClient.stop(); //Assert @@ -260,6 +265,99 @@ public void testProcessSpans() throws Exception { verify(tracer1, times(1)).end(eq("success"), isNull(), any()); } + + /** + * Tests process start spans invoked for {@link EventProcessorClient}. + * + * @throws Exception if an error occurs while running the test. + */ + @Test + public void testProcessBatchSpans() throws Exception { + //Arrange + final Tracer tracer1 = mock(Tracer.class); + + when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); + when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); + when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); + when(eventHubAsyncClient.getEventHubName()).thenReturn("test-eh"); + when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); + when(eventHubAsyncClient + .createConsumer(anyString(), anyInt(), eq(true))) + .thenReturn(consumer1); + when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); + when(eventData1.getSequenceNumber()).thenReturn(1L); + when(eventData1.getOffset()).thenReturn(100L); + when(eventData1.getEnqueuedTime()).thenReturn(Instant.ofEpochSecond(1560639208)); + when(eventData2.getEnqueuedTime()).thenReturn(Instant.ofEpochSecond(1560639209)); + + String diagnosticId1 = "00-08ee063508037b1719dddcbf248e30e2-1365c684eb25daed-01"; + Map properties1 = new HashMap<>(); + properties1.put(DIAGNOSTIC_ID_KEY, diagnosticId1); + + String diagnosticId2 = "00-18ee063508037b1719dddcbf248e30e2-1365c684eb25daed-01"; + Map properties2 = new HashMap<>(); + properties2.put(DIAGNOSTIC_ID_KEY, diagnosticId2); + + when(eventData1.getProperties()).thenReturn(properties1); + when(eventData2.getProperties()).thenReturn(properties2); + when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) + .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2))); + + when(tracer1.extractContext(any(), any())).thenAnswer( + invocation -> { + String diagnosticId = invocation.getArgument(0, String.class); + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_CONTEXT_KEY, diagnosticId); + } + ); + when(tracer1.getSharedSpanBuilder(eq("EventHubs.process"), any())).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_BUILDER_KEY, "builder"); + } + ); + when(tracer1.start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS))).thenAnswer( + invocation -> { + Context passed = invocation.getArgument(1, Context.class); + return passed.addData(SPAN_CONTEXT_KEY, "value1").addData("scope", (AutoCloseable) () -> { }).addData(PARENT_TRACE_CONTEXT_KEY, "value2"); + } + ); + + doAnswer(invocation -> { + Context passed = invocation.getArgument(0, Context.class); + assertTrue(passed.getData(MESSAGE_ENQUEUED_TIME).isPresent()); + return null; + }).when(tracer1).addLink(any()); + + // + CountDownLatch latch = new CountDownLatch(1); + when(tracer1.makeSpanCurrent(any())).thenReturn(() -> { }); + + doAnswer(invocation -> { + latch.countDown(); + return null; + }).when(tracer1).end(eq("success"), isNull(), any()); + + final SampleCheckpointStore checkpointStore = new SampleCheckpointStore(); + + //Act + EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", + TestPartitionProcessor::new, checkpointStore, false, ec -> { }, new HashMap<>(), + 2, null, true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, tracer1); + + eventProcessorClient.start(); + assertTrue(latch.await(10, TimeUnit.SECONDS)); + eventProcessorClient.stop(); + + //Assert + verify(tracer1, times(1)).extractContext(eq(diagnosticId1), any()); + verify(tracer1, times(1)).extractContext(eq(diagnosticId2), any()); + verify(tracer1, times(1)).start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS)); + verify(tracer1, times(1)).getSharedSpanBuilder(eq("EventHubs.process"), any()); + verify(tracer1, times(2)).addLink(any()); + verify(tracer1, times(1)).end(eq("success"), isNull(), any()); + } + /** * Tests process start spans invoked without diagnostic id from event data of upstream for {@link EventProcessorClient}. * @@ -268,9 +366,7 @@ public void testProcessSpans() throws Exception { @Test public void testProcessSpansWithoutDiagnosticId() throws Exception { //Arrange - final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); + final Tracer tracer = mock(Tracer.class); when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); @@ -278,7 +374,7 @@ public void testProcessSpansWithoutDiagnosticId() throws Exception { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), eq(true))) .thenReturn(consumer1); when(eventData1.getSequenceNumber()).thenReturn(1L); when(eventData1.getOffset()).thenReturn(1L); @@ -297,16 +393,17 @@ public void testProcessSpansWithoutDiagnosticId() throws Exception { when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2), getEvent(eventData3))); - when(tracer1.start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS))).thenAnswer( + when(tracer.start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS))).thenAnswer( invocation -> { Context passed = invocation.getArgument(1, Context.class); assertTrue(passed.getData(MESSAGE_ENQUEUED_TIME).isPresent()); - return passed.addData(SPAN_CONTEXT_KEY, "value1").addData("scope", (AutoCloseable) () -> { - return; - }).addData(PARENT_TRACE_CONTEXT_KEY, "value2"); + return passed.addData(SPAN_CONTEXT_KEY, "value1").addData("scope", (AutoCloseable) () -> { }).addData(PARENT_SPAN_KEY, "value2"); } ); + AtomicBoolean closed = new AtomicBoolean(false); + when(tracer.makeSpanCurrent(any())).thenReturn(() -> closed.set(true)); + final SampleCheckpointStore checkpointStore = new SampleCheckpointStore(); CountDownLatch countDownLatch = new CountDownLatch(numberOfEvents); @@ -314,19 +411,20 @@ public void testProcessSpansWithoutDiagnosticId() throws Exception { testPartitionProcessor.countDownLatch = countDownLatch; //Act EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, tracer); eventProcessorClient.start(); boolean success = countDownLatch.await(10, TimeUnit.SECONDS); eventProcessorClient.stop(); assertTrue(success); + assertTrue(closed.get()); // This is one less because the processEvent is called before the end span call, so it is possible for // to reach this line without calling it the 5th time yet. (Timing issue.) - verify(tracer1, times(numberOfEvents)).start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS)); - verify(tracer1, atLeast(numberOfEvents - 1)).end(eq("success"), isNull(), any()); + verify(tracer, times(numberOfEvents)).start(eq("EventHubs.process"), any(), eq(ProcessKind.PROCESS)); + verify(tracer, atLeast(numberOfEvents - 1)).end(eq("success"), isNull(), any()); } /** @@ -350,7 +448,7 @@ public void testWithMultiplePartitions() throws Exception { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1", "2", "3")); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); when(eventHubAsyncClient.getEventHubName()).thenReturn("test-eh"); - when(eventHubAsyncClient.createConsumer(anyString(), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT))) + when(eventHubAsyncClient.createConsumer(anyString(), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT), eq(true))) .thenReturn(consumer1, consumer2, consumer3); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(identifiers)); @@ -376,13 +474,12 @@ public void testWithMultiplePartitions() throws Exception { when(eventData4.getOffset()).thenReturn(1L); final SampleCheckpointStore checkpointStore = new SampleCheckpointStore(); - final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); // Act final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - TestPartitionProcessor::new, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + TestPartitionProcessor::new, checkpointStore, false, ec -> { }, new HashMap<>(), + 1, null, false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); eventProcessorClient.start(); final boolean completed = count.await(10, TimeUnit.SECONDS); eventProcessorClient.stop(); @@ -394,7 +491,7 @@ public void testWithMultiplePartitions() throws Exception { verify(eventHubAsyncClient, atLeast(1)).getPartitionIds(); verify(eventHubAsyncClient, times(1)) - .createConsumer(anyString(), anyInt()); + .createConsumer(anyString(), anyInt(), eq(true)); // We expected one to be removed. Assertions.assertEquals(2, identifiers.size()); @@ -409,7 +506,6 @@ public void testWithMultiplePartitions() throws Exception { @Test public void testPrefetchCountSet() throws Exception { // Arrange - final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); final String consumerGroup = "my-consumer-group"; final int prefetch = 15; @@ -420,7 +516,7 @@ public void testPrefetchCountSet() throws Exception { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(eq(consumerGroup), eq(prefetch))) + .createConsumer(eq(consumerGroup), eq(prefetch), eq(true))) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2), getEvent(eventData3))); @@ -437,8 +533,8 @@ public void testPrefetchCountSet() throws Exception { testPartitionProcessor.countDownLatch = countDownLatch; final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, consumerGroup, - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); // Act eventProcessorClient.start(); @@ -449,13 +545,12 @@ public void testPrefetchCountSet() throws Exception { assertTrue(completed); assertIterableEquals(testPartitionProcessor.receivedEventsCount, Arrays.asList(2, 1)); - verify(eventHubAsyncClient).createConsumer(eq(consumerGroup), eq(prefetch)); + verify(eventHubAsyncClient).createConsumer(eq(consumerGroup), eq(prefetch), eq(true)); } @Test public void testDefaultPrefetch() throws Exception { // Arrange - final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); final String consumerGroup = "my-consumer-group"; when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); @@ -465,7 +560,7 @@ public void testDefaultPrefetch() throws Exception { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(eq(consumerGroup), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT))) + .createConsumer(eq(consumerGroup), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT), eq(true))) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2), getEvent(eventData3))); @@ -482,8 +577,8 @@ public void testDefaultPrefetch() throws Exception { testPartitionProcessor.countDownLatch = countDownLatch; final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, consumerGroup, - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); // Act eventProcessorClient.start(); @@ -494,16 +589,12 @@ public void testDefaultPrefetch() throws Exception { assertTrue(completed); assertIterableEquals(testPartitionProcessor.receivedEventsCount, Arrays.asList(2, 1)); - verify(eventHubAsyncClient).createConsumer(eq(consumerGroup), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT)); + verify(eventHubAsyncClient).createConsumer(eq(consumerGroup), eq(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT), eq(true)); } @Test public void testBatchReceive() throws Exception { // Arrange - final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); - when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); @@ -511,7 +602,7 @@ public void testBatchReceive() throws Exception { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), eq(true))) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2), getEvent(eventData3))); @@ -528,8 +619,8 @@ public void testBatchReceive() throws Exception { testPartitionProcessor.countDownLatch = countDownLatch; final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); // Act eventProcessorClient.start(); @@ -544,10 +635,6 @@ public void testBatchReceive() throws Exception { @Test public void testBatchReceiveHeartBeat() throws InterruptedException { // Arrange - final Tracer tracer1 = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer1); - TracerProvider tracerProvider = new TracerProvider(tracers); - when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); @@ -555,7 +642,7 @@ public void testBatchReceiveHeartBeat() throws InterruptedException { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), eq(true))) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2)).delayElements(Duration.ofSeconds(3))); @@ -572,8 +659,8 @@ public void testBatchReceiveHeartBeat() throws InterruptedException { testPartitionProcessor.countDownLatch = countDownLatch; final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 2, Duration.ofSeconds(1), true, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); // Act eventProcessorClient.start(); @@ -589,10 +676,7 @@ public void testBatchReceiveHeartBeat() throws InterruptedException { @Test public void testSingleEventReceiveHeartBeat() throws InterruptedException { // Arrange - final Tracer tracer = mock(Tracer.class); - final List tracers = Collections.singletonList(tracer); - TracerProvider tracerProvider = new TracerProvider(tracers); - + Tracer tracer = mock(Tracer.class); when(eventHubClientBuilder.getPrefetchCount()).thenReturn(DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); when(eventHubAsyncClient.getFullyQualifiedNamespace()).thenReturn("test-ns"); @@ -600,7 +684,7 @@ public void testSingleEventReceiveHeartBeat() throws InterruptedException { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.just("1")); when(eventHubAsyncClient.getIdentifier()).thenReturn("my-client-identifier"); when(eventHubAsyncClient - .createConsumer(anyString(), anyInt())) + .createConsumer(anyString(), anyInt(), eq(true))) .thenReturn(consumer1); when(consumer1.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.just(getEvent(eventData1), getEvent(eventData2)).delayElements(Duration.ofSeconds(3))); @@ -638,8 +722,8 @@ public void testSingleEventReceiveHeartBeat() throws InterruptedException { testPartitionProcessor.countDownLatch = countDownLatch; final EventProcessorClient eventProcessorClient = new EventProcessorClient(eventHubClientBuilder, "test-consumer", - () -> testPartitionProcessor, checkpointStore, false, tracerProvider, ec -> { }, new HashMap<>(), - 1, Duration.ofSeconds(1), false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED); + () -> testPartitionProcessor, checkpointStore, false, ec -> { }, new HashMap<>(), + 1, Duration.ofSeconds(1), false, Duration.ofSeconds(10), Duration.ofMinutes(1), LoadBalancingStrategy.BALANCED, null); eventProcessorClient.start(); boolean completed = countDownLatch.await(20, TimeUnit.SECONDS); eventProcessorClient.stop(); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/MessageUtilsTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/MessageUtilsTest.java index b32299c5a12c..fbfe38c181a2 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/MessageUtilsTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/MessageUtilsTest.java @@ -9,6 +9,7 @@ import com.azure.core.amqp.models.AmqpMessageHeader; import com.azure.core.amqp.models.AmqpMessageId; import com.azure.core.amqp.models.AmqpMessageProperties; +import com.azure.messaging.eventhubs.implementation.MessageUtils; import org.apache.qpid.proton.amqp.Symbol; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; import org.apache.qpid.proton.amqp.messaging.Data; diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionBasedLoadBalancerTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionBasedLoadBalancerTest.java index dd90e7335e46..5c922786cba1 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionBasedLoadBalancerTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionBasedLoadBalancerTest.java @@ -3,9 +3,9 @@ package com.azure.messaging.eventhubs; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.ErrorContext; import com.azure.messaging.eventhubs.models.EventBatchContext; import com.azure.messaging.eventhubs.models.EventContext; @@ -50,6 +50,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; @@ -78,6 +79,8 @@ public class PartitionBasedLoadBalancerTest { private static final boolean BATCH_RECEIVE_MODE = false; private static final PartitionContext PARTITION_CONTEXT = new PartitionContext(FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, "bazz"); + private static final EventHubsTracer DEFAULT_TRACER = + new EventHubsTracer(null, FQ_NAMESPACE, EVENT_HUB_NAME); private static final String OWNER_ID_1 = "owner1"; private static final String OWNER_ID_2 = "owner2"; @@ -97,7 +100,6 @@ public class PartitionBasedLoadBalancerTest { @Mock private PartitionProcessor partitionProcessor; - private TracerProvider tracerProvider; private AutoCloseable mockCloseable; @BeforeEach @@ -118,7 +120,6 @@ public void setup(TestInfo testInfo) { when(eventHubClientBuilder.getPrefetchCount()).thenReturn(EventHubClientBuilder.DEFAULT_PREFETCH_COUNT); when(eventHubClientBuilder.buildAsyncClient()).thenReturn(eventHubAsyncClient); this.checkpointStore = new SampleCheckpointStore(); - this.tracerProvider = new TracerProvider(Collections.emptyList()); } @AfterEach @@ -137,7 +138,7 @@ public void teardown() throws Exception { @Test public void testSingleEventProcessor() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { @@ -176,7 +177,7 @@ private void sleep(int secondsToSleep) { @Test public void testTwoEventProcessors() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { int i = index.intValue() % eventDataList.size(); @@ -217,7 +218,7 @@ public void testTwoEventProcessors() { @Test public void testPartitionStealing() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { @@ -268,7 +269,7 @@ public void testPartitionStealing() { public void testMoreEventProcessorsThanPartitions() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { @@ -308,7 +309,7 @@ public void testEventProcessorInactive() { final String ownerId4 = "owner4"; when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { final int i = index.intValue() % eventDataList.size(); @@ -370,17 +371,15 @@ public void testEventProcessorInactive() { @Test public void testReceiveFailure() { - TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); - doThrow(new IllegalStateException()).when(partitionProcessor).processEvent(any(EventContext.class)); List partitionIds = Arrays.asList("1", "2", "3"); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(partitionIds)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.error(new IllegalStateException())); PartitionPumpManager partitionPumpManager = new PartitionPumpManager(checkpointStore, - () -> partitionProcessor, eventHubClientBuilder, false, tracerProvider, new HashMap<>(), 1, null, + () -> partitionProcessor, eventHubClientBuilder, false, DEFAULT_TRACER, new HashMap<>(), 1, null, BATCH_RECEIVE_MODE); PartitionBasedLoadBalancer loadBalancer = new PartitionBasedLoadBalancer(checkpointStore, eventHubAsyncClient, FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, "owner", TimeUnit.SECONDS.toSeconds(5), @@ -395,14 +394,13 @@ public void testReceiveFailure() { @Test public void testCheckpointStoreListOwnershipFailure() { - TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); CheckpointStore checkpointStore = mock(CheckpointStore.class); when(checkpointStore.listOwnership(any(), any(), any())).thenReturn(Flux.error(new Exception("Listing " + "failed"))); doThrow(new IllegalStateException()).when(partitionProcessor).processEvent(any(EventContext.class)); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_2)); PartitionPumpManager partitionPumpManager = new PartitionPumpManager(checkpointStore, - () -> partitionProcessor, eventHubClientBuilder, false, tracerProvider, new HashMap<>(), 1, null, + () -> partitionProcessor, eventHubClientBuilder, false, DEFAULT_TRACER, new HashMap<>(), 1, null, BATCH_RECEIVE_MODE); PartitionBasedLoadBalancer loadBalancer = new PartitionBasedLoadBalancer(checkpointStore, eventHubAsyncClient, FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, "owner", TimeUnit.SECONDS.toSeconds(5), @@ -411,7 +409,7 @@ public void testCheckpointStoreListOwnershipFailure() { loadBalancer.loadBalance(); sleep(5); verify(eventHubAsyncClient, atLeast(1)).getPartitionIds(); - verify(eventHubAsyncClient, never()).createConsumer(anyString(), anyInt()); + verify(eventHubAsyncClient, never()).createConsumer(anyString(), anyInt(), eq(true)); verify(eventHubConsumer, never()) .receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class)); verify(partitionProcessor, never()).processEvent(any(EventContext.class)); @@ -425,8 +423,6 @@ public void testCheckpointStoreListOwnershipFailure() { @SuppressWarnings("unchecked") @Test public void testCheckpointStoreClaimOwnershipFailure() { - final TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); - final PartitionOwnership claim1 = getPartitionOwnership(PARTITION_1, OWNER_ID_1); final PartitionOwnership claim2 = getPartitionOwnership(PARTITION_2, OWNER_ID_1); @@ -450,7 +446,7 @@ public void testCheckpointStoreClaimOwnershipFailure() { }).when(partitionProcessor).processError(any(ErrorContext.class)); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_2)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(any(), any(), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { @@ -459,7 +455,7 @@ public void testCheckpointStoreClaimOwnershipFailure() { })); final PartitionPumpManager partitionPumpManager = new PartitionPumpManager(mockCheckpointStore, - () -> partitionProcessor, eventHubClientBuilder, false, tracerProvider, + () -> partitionProcessor, eventHubClientBuilder, false, DEFAULT_TRACER, Collections.emptyMap(), 1, null, BATCH_RECEIVE_MODE); final PartitionBasedLoadBalancer loadBalancer = new PartitionBasedLoadBalancer(mockCheckpointStore, eventHubAsyncClient, FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, "owner", @@ -475,7 +471,7 @@ public void testCheckpointStoreClaimOwnershipFailure() { // Assert verify(eventHubAsyncClient, atLeast(1)).getPartitionIds(); - verify(eventHubAsyncClient).createConsumer(anyString(), anyInt()); + verify(eventHubAsyncClient).createConsumer(anyString(), anyInt(), eq(true)); verify(partitionProcessor, atLeastOnce()).processEvent(any(EventContext.class)); verify(partitionProcessor, never()).processError(any(ErrorContext.class)); @@ -485,12 +481,11 @@ public void testCheckpointStoreClaimOwnershipFailure() { @Test public void testEventHubClientFailure() { - TracerProvider tracerProvider = new TracerProvider(Collections.emptyList()); doThrow(new IllegalStateException()).when(partitionProcessor).processEvent(any(EventContext.class)); List partitionIds = new ArrayList<>(); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(partitionIds)); PartitionPumpManager partitionPumpManager = new PartitionPumpManager(checkpointStore, - () -> partitionProcessor, eventHubClientBuilder, false, tracerProvider, new HashMap<>(), 1, null, + () -> partitionProcessor, eventHubClientBuilder, false, DEFAULT_TRACER, new HashMap<>(), 1, null, BATCH_RECEIVE_MODE); PartitionBasedLoadBalancer loadBalancer = new PartitionBasedLoadBalancer(checkpointStore, eventHubAsyncClient, FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, "owner", TimeUnit.SECONDS.toSeconds(5), @@ -499,7 +494,7 @@ public void testEventHubClientFailure() { loadBalancer.loadBalance(); sleep(2); verify(eventHubAsyncClient, atLeast(1)).getPartitionIds(); - verify(eventHubAsyncClient, never()).createConsumer(anyString(), anyInt()); + verify(eventHubAsyncClient, never()).createConsumer(anyString(), anyInt(), eq(true)); verify(eventHubConsumer, never()) .receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class)); verify(partitionProcessor, never()).processEvent(any(EventContext.class)); @@ -527,7 +522,7 @@ public void testEmptyOwnerId() { checkpointStore.claimOwnership(Arrays.asList(claim1, claim2)).subscribe(); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { final int i = index.intValue() % eventDataList.size(); @@ -581,7 +576,7 @@ public void testOwnershipRenewal() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_2)); - PartitionPumpManager partitionPumpManager = getPartitionPumpManager(tracerProvider); + PartitionPumpManager partitionPumpManager = getPartitionPumpManager(); final Scheduler scheduler = Schedulers.newSingle("test"); final Scheduler scheduler2 = Schedulers.newSingle("test2"); final PartitionPump pump1 = new PartitionPump("1", eventHubConsumer, scheduler); @@ -654,7 +649,7 @@ private PartitionOwnership getPartitionOwnership(String partitionId, String owne @Test public void testSingleEventProcessorWithGreedyStrategy() { when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(PARTITION_IDS_3)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(any(), any(), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { @@ -680,7 +675,7 @@ public void testSingleEventProcessorWithGreedyStrategy() { public void testMultipleEventProcessorsWithGreedyStrategy() { List partitionIds = Arrays.asList("1", "2", "3", "4", "5"); when(eventHubAsyncClient.getPartitionIds()).thenReturn(Flux.fromIterable(partitionIds)); - when(eventHubAsyncClient.createConsumer(anyString(), anyInt())).thenReturn(eventHubConsumer); + when(eventHubAsyncClient.createConsumer(anyString(), anyInt(), eq(true))).thenReturn(eventHubConsumer); when(eventHubConsumer.receiveFromPartition(anyString(), any(EventPosition.class), any(ReceiveOptions.class))) .thenReturn(Flux.interval(Duration.ofSeconds(1)).map(index -> { final int i = index.intValue() % eventDataList.size(); @@ -703,7 +698,7 @@ public void testMultipleEventProcessorsWithGreedyStrategy() { assertTrue(partitionOwnership.stream().filter(po -> po.getOwnerId().equals("owner2")).count() >= 2); } - private PartitionPumpManager getPartitionPumpManager(TracerProvider tracerProvider) { + private PartitionPumpManager getPartitionPumpManager() { return new PartitionPumpManager(checkpointStore, () -> new PartitionProcessor() { @Override @@ -723,11 +718,11 @@ public void processError(ErrorContext eventProcessingErrorContext) { eventProcessingErrorContext.getPartitionContext().getPartitionId(), eventProcessingErrorContext.getThrowable()); } - }, eventHubClientBuilder, false, tracerProvider, new HashMap<>(), 1, null, BATCH_RECEIVE_MODE); + }, eventHubClientBuilder, false, DEFAULT_TRACER, new HashMap<>(), 1, null, BATCH_RECEIVE_MODE); } private PartitionBasedLoadBalancer createPartitionLoadBalancer(String owner, LoadBalancingStrategy loadBalancingStrategy) { - PartitionPumpManager partitionPumpManager = getPartitionPumpManager(tracerProvider); + PartitionPumpManager partitionPumpManager = getPartitionPumpManager(); return new PartitionBasedLoadBalancer(checkpointStore, eventHubAsyncClient, FQ_NAMESPACE, EVENT_HUB_NAME, CONSUMER_GROUP_NAME, owner, TimeUnit.SECONDS.toSeconds(5), partitionPumpManager, ec -> { diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionPumpManagerTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionPumpManagerTest.java index ad018c6e4217..4043a9ee4bdb 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionPumpManagerTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/PartitionPumpManagerTest.java @@ -3,9 +3,9 @@ package com.azure.messaging.eventhubs; -import com.azure.core.amqp.implementation.TracerProvider; import com.azure.messaging.eventhubs.implementation.PartitionProcessor; import com.azure.messaging.eventhubs.implementation.PartitionProcessorException; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsTracer; import com.azure.messaging.eventhubs.models.Checkpoint; import com.azure.messaging.eventhubs.models.ErrorContext; import com.azure.messaging.eventhubs.models.EventBatchContext; @@ -67,7 +67,8 @@ public class PartitionPumpManagerTest { private static final String ETAG = "etag1"; private static final PartitionContext PARTITION_CONTEXT = new PartitionContext(FULLY_QUALIFIED_NAME, EVENTHUB_NAME, CONSUMER_GROUP, PARTITION_ID); - + private static final EventHubsTracer DEFAULT_TRACER = + new EventHubsTracer(null, FULLY_QUALIFIED_NAME, EVENTHUB_NAME); @Mock private CheckpointStore checkpointStore; @Mock @@ -77,8 +78,6 @@ public class PartitionPumpManagerTest { @Mock private EventHubConsumerAsyncClient consumerAsyncClient; @Mock - private TracerProvider tracerProvider; - @Mock private PartitionProcessor partitionProcessor; private final Map initialPartitionPositions = new HashMap<>(); @@ -97,7 +96,7 @@ public void beforeEach() { when(builder.buildAsyncClient()).thenReturn(asyncClient); // Consumer group and partition id don't change. - when(asyncClient.createConsumer(eq(CONSUMER_GROUP), eq(prefetch))) + when(asyncClient.createConsumer(eq(CONSUMER_GROUP), eq(prefetch), eq(true))) .thenReturn(consumerAsyncClient); when(consumerAsyncClient.receiveFromPartition(eq(PARTITION_ID), any(EventPosition.class), any(ReceiveOptions.class))) @@ -168,7 +167,7 @@ public void startPartitionPumpAtCorrectPosition(Long offset, Long sequenceNumber final Duration maxWaitTime = Duration.ofSeconds(5); final boolean batchReceiveMode = true; final PartitionPumpManager manager = new PartitionPumpManager(checkpointStore, supplier, builder, - trackLastEnqueuedEventProperties, tracerProvider, initialPartitionPositions, maxBatchSize, + trackLastEnqueuedEventProperties, DEFAULT_TRACER, initialPartitionPositions, maxBatchSize, maxWaitTime, batchReceiveMode); try { @@ -223,7 +222,7 @@ public void startPartitionPumpOnce() { final Duration maxWaitTime = Duration.ofSeconds(5); final boolean batchReceiveMode = true; final PartitionPumpManager manager = new PartitionPumpManager(checkpointStore, supplier, builder, - trackLastEnqueuedEventProperties, tracerProvider, initialPartitionEventPosition, maxBatchSize, + trackLastEnqueuedEventProperties, DEFAULT_TRACER, initialPartitionEventPosition, maxBatchSize, maxWaitTime, batchReceiveMode); checkpoint.setOffset(1L).setSequenceNumber(10L); @@ -256,7 +255,7 @@ public void startPartitionPumpCleansUpOnError() { final Duration maxWaitTime = Duration.ofSeconds(5); final boolean batchReceiveMode = true; final PartitionPumpManager manager = new PartitionPumpManager(checkpointStore, supplier, builder, - trackLastEnqueuedEventProperties, tracerProvider, initialPartitionPositions, maxBatchSize, + trackLastEnqueuedEventProperties, DEFAULT_TRACER, initialPartitionPositions, maxBatchSize, maxWaitTime, batchReceiveMode); final Exception testException = new IllegalStateException("Dummy exception."); @@ -296,7 +295,7 @@ public void stopAllPartitionPumps() { final Duration maxWaitTime = Duration.ofSeconds(5); final boolean batchReceiveMode = true; final PartitionPumpManager manager = new PartitionPumpManager(checkpointStore, supplier, builder, - trackLastEnqueuedEventProperties, tracerProvider, initialPartitionEventPosition, maxBatchSize, + trackLastEnqueuedEventProperties, DEFAULT_TRACER, initialPartitionEventPosition, maxBatchSize, maxWaitTime, batchReceiveMode); final String partition1 = "01"; @@ -339,7 +338,7 @@ public void processesEventBatchWithLastEnqueued() throws InterruptedException { final Duration maxWaitTime = Duration.ofSeconds(1); final boolean batchReceiveMode = true; final PartitionPumpManager manager = new PartitionPumpManager(checkpointStore, supplier, builder, - trackLastEnqueuedEventProperties, tracerProvider, initialPartitionEventPosition, maxBatchSize, + trackLastEnqueuedEventProperties, DEFAULT_TRACER, initialPartitionEventPosition, maxBatchSize, maxWaitTime, batchReceiveMode); // Mock events to add. diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/TracingIntegrationTests.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/TracingIntegrationTests.java new file mode 100644 index 000000000000..4054e2526252 --- /dev/null +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/TracingIntegrationTests.java @@ -0,0 +1,537 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.messaging.eventhubs; + +import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.eventhubs.models.CreateBatchOptions; +import com.azure.messaging.eventhubs.models.EventPosition; +import com.azure.messaging.eventhubs.models.PartitionEvent; +import com.azure.messaging.eventhubs.models.ReceiveOptions; +import com.azure.messaging.eventhubs.models.SendOptions; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.data.LinkData; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.api.parallel.Isolated; +import reactor.test.StepVerifier; + +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +@Isolated +@Execution(ExecutionMode.SAME_THREAD) +public class TracingIntegrationTests extends IntegrationTestBase { + private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); + private static final String PARTITION_ID = "0"; + private TestSpanProcessor spanProcessor; + private EventHubProducerAsyncClient producer; + private EventHubConsumerAsyncClient consumer; + private EventHubConsumerClient consumerSync; + private EventProcessorClient processor; + private Instant testStartTime; + private EventData data; + + public TracingIntegrationTests() { + super(new ClientLogger(TracingIntegrationTests.class)); + } + + @Override + protected void beforeTest() { + spanProcessor = new TestSpanProcessor(getFullyQualifiedDomainName(), getEventHubName()); + OpenTelemetrySdk.builder() + .setTracerProvider( + SdkTracerProvider.builder() + .addSpanProcessor(spanProcessor) + .build()) + .buildAndRegisterGlobal(); + + producer = new EventHubClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .buildAsyncProducerClient(); + + consumer = new EventHubClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .consumerGroup("$Default") + .buildAsyncConsumerClient(); + + consumerSync = new EventHubClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .consumerGroup("$Default") + .buildConsumerClient(); + + testStartTime = Instant.now().minusSeconds(1); + data = new EventData(CONTENTS_BYTES); + } + + @Override + protected void afterTest() { + GlobalOpenTelemetry.resetForTest(); + if (processor != null) { + processor.stop(); + } + try { + dispose(consumer, producer, consumerSync); + } catch (Exception e) { + logger.warning("Error occurred when draining queue.", e); + } + } + + @Test + public void sendAndReceiveFromPartition() throws InterruptedException { + AtomicReference receivedMessage = new AtomicReference<>(); + AtomicReference receivedSpan = new AtomicReference<>(); + + CountDownLatch latch = new CountDownLatch(2); + spanProcessor.notifyIfCondition(latch, span -> span == receivedSpan.get() || span.getName().equals("EventHubs.send")); + consumer + .receiveFromPartition(PARTITION_ID, EventPosition.fromEnqueuedTime(testStartTime)) + .take(1) + .subscribe(pe -> { + receivedMessage.set(pe.getData()); + receivedSpan.set(Span.current()); + }); + + StepVerifier.create(producer.send(data, new SendOptions().setPartitionId(PARTITION_ID))).verifyComplete(); + + assertTrue(latch.await(10, TimeUnit.SECONDS)); + + List spans = spanProcessor.getEndedSpans(); + + List message = findSpans(spans, "EventHubs.message"); + assertMessageSpan(message.get(0), data); + List send = findSpans(spans, "EventHubs.send"); + assertSendSpan(send.get(0), Collections.singletonList(data), "EventHubs.send"); + + List received = findSpans(spans, "EventHubs.consume").stream() + .filter(s -> s == receivedSpan.get()).collect(Collectors.toList()); + assertConsumerSpan(received.get(0), receivedMessage.get(), "EventHubs.consume"); + } + + @Test + public void sendAndReceive() throws InterruptedException { + AtomicReference receivedMessage = new AtomicReference<>(); + AtomicReference receivedSpan = new AtomicReference<>(); + + CountDownLatch latch = new CountDownLatch(2); + spanProcessor.notifyIfCondition(latch, span -> span == receivedSpan.get() || span.getName().equals("EventHubs.send")); + consumer + .receive() + .take(1) + .subscribe(pe -> { + receivedMessage.set(pe.getData()); + receivedSpan.set(Span.current()); + }); + + + StepVerifier.create(producer.send(data, new SendOptions())).verifyComplete(); + + assertTrue(latch.await(10, TimeUnit.SECONDS)); + + List spans = spanProcessor.getEndedSpans(); + + List message = findSpans(spans, "EventHubs.message"); + assertMessageSpan(message.get(0), data); + List send = findSpans(spans, "EventHubs.send"); + assertSendSpan(send.get(0), Collections.singletonList(data), "EventHubs.send"); + + List received = findSpans(spans, "EventHubs.consume").stream() + .filter(s -> s == receivedSpan.get()).collect(Collectors.toList()); + assertConsumerSpan(received.get(0), receivedMessage.get(), "EventHubs.consume"); + } + + @Test + public void sendBuffered() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + EventHubBufferedProducerAsyncClient bufferedProducer = new EventHubBufferedProducerClientBuilder() + .connectionString(getConnectionString()) + .onSendBatchFailed(failed -> { + fail("Exception occurred while sending messages." + failed.getThrowable()); + }) + .onSendBatchSucceeded(succeeded -> latch.countDown()) + .maxEventBufferLengthPerPartition(5) + .maxWaitTime(Duration.ofSeconds(5)) + .buildAsyncClient(); + + EventData event1 = new EventData("1"); + EventData event2 = new EventData("2"); + + StepVerifier.create( + bufferedProducer + .getPartitionIds().take(1) + .map(partitionId -> new SendOptions().setPartitionId(partitionId)) + .flatMap(sendOpts -> + bufferedProducer.enqueueEvent(event1, sendOpts) + .then(bufferedProducer.enqueueEvent(event2, sendOpts)))) + .expectNextCount(1) + .verifyComplete(); + + StepVerifier.create(consumer + .receive() + .take(2)) + .expectNextCount(2) + .verifyComplete(); + + assertTrue(latch.await(10, TimeUnit.SECONDS)); + + List spans = spanProcessor.getEndedSpans(); + + List message = findSpans(spans, "EventHubs.message"); + assertMessageSpan(message.get(0), event1); + assertMessageSpan(message.get(1), event2); + + List send = findSpans(spans, "EventHubs.send"); + assertSendSpan(send.get(0), Arrays.asList(event1, event2), "EventHubs.send"); + + List received = findSpans(spans, "EventHubs.consume"); + assertEquals(2, received.size()); + } + + @Test + public void syncReceive() { + StepVerifier.create(producer.createBatch(new CreateBatchOptions().setPartitionId(PARTITION_ID)) + .map(b -> { + b.tryAdd(new EventData(CONTENTS_BYTES)); + b.tryAdd(new EventData(CONTENTS_BYTES)); + return b; + }) + .flatMap(b -> producer.send(b))) + .verifyComplete(); + + List receivedMessages = consumerSync.receiveFromPartition(PARTITION_ID, 2, EventPosition.fromEnqueuedTime(testStartTime), Duration.ofSeconds(10)) + .stream().collect(Collectors.toList()); + + assertEquals(2, receivedMessages.size()); + List spans = spanProcessor.getEndedSpans(); + assertEquals(0, findSpans(spans, "EventHubs.process").size()); + + List received = findSpans(spans, "EventHubs.receiveFromPartition"); + assertSyncConsumerSpan(received.get(0), receivedMessages, "EventHubs.receiveFromPartition"); + } + + @Test + public void syncReceiveWithOptions() { + StepVerifier.create(producer.createBatch(new CreateBatchOptions().setPartitionId(PARTITION_ID)) + .map(b -> { + b.tryAdd(new EventData(CONTENTS_BYTES)); + b.tryAdd(new EventData(CONTENTS_BYTES)); + return b; + }) + .flatMap(b -> producer.send(b))) + .verifyComplete(); + + List receivedMessages = consumerSync.receiveFromPartition(PARTITION_ID, 2, + EventPosition.fromEnqueuedTime(testStartTime), Duration.ofSeconds(10), new ReceiveOptions()) + .stream().collect(Collectors.toList()); + + assertEquals(2, receivedMessages.size()); + List spans = spanProcessor.getEndedSpans(); + assertEquals(0, findSpans(spans, "EventHubs.process").size()); + + List received = findSpans(spans, "EventHubs.receiveFromPartition"); + assertSyncConsumerSpan(received.get(0), receivedMessages, "EventHubs.receiveFromPartition"); + } + + @Test + public void syncReceiveTimeout() { + List receivedMessages = consumerSync.receiveFromPartition(PARTITION_ID, 2, + EventPosition.fromEnqueuedTime(testStartTime), Duration.ofSeconds(1)) + .stream().collect(Collectors.toList()); + + List spans = spanProcessor.getEndedSpans(); + assertEquals(0, findSpans(spans, "EventHubs.process").size()); + + List received = findSpans(spans, "EventHubs.receiveFromPartition"); + assertSyncConsumerSpan(received.get(0), receivedMessages, "EventHubs.receiveFromPartition"); + assertEquals(StatusCode.OK, received.get(0).toSpanData().getStatus().getStatusCode()); + } + + @Test + public void sendAndProcess() throws InterruptedException { + AtomicReference currentInProcess = new AtomicReference<>(Span.getInvalid()); + AtomicReference receivedMessage = new AtomicReference<>(); + + CountDownLatch latch = new CountDownLatch(2); + spanProcessor.notifyIfCondition(latch, span -> span == currentInProcess.get() || span.getName().equals("EventHubs.send")); + + StepVerifier.create(producer.send(data, new SendOptions().setPartitionId(PARTITION_ID))).verifyComplete(); + processor = new EventProcessorClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .initialPartitionEventPosition(Collections.singletonMap(PARTITION_ID, EventPosition.fromEnqueuedTime(testStartTime))) + .consumerGroup("$Default") + .checkpointStore(new SampleCheckpointStore()) + .processEvent(ec -> { + currentInProcess.set(Span.current()); + receivedMessage.set(ec.getEventData()); + ec.updateCheckpoint(); + }) + .processError(e -> { + fail("unexpected error", e.getThrowable()); + }) + .buildEventProcessorClient(); + + processor.start(); + assertTrue(latch.await(10, TimeUnit.SECONDS)); + processor.stop(); + + assertTrue(currentInProcess.get().getSpanContext().isValid()); + List spans = spanProcessor.getEndedSpans(); + + List message = findSpans(spans, "EventHubs.message"); + assertMessageSpan(message.get(0), data); + + List send = findSpans(spans, "EventHubs.send"); + assertSendSpan(send.get(0), Collections.singletonList(data), "EventHubs.send"); + + List processed = findSpans(spans, "EventHubs.process") + .stream().filter(p -> p == currentInProcess.get()).collect(Collectors.toList()); + assertEquals(1, processed.size()); + assertConsumerSpan(processed.get(0), receivedMessage.get(), "EventHubs.process"); + } + + @Test + public void sendAndProcessBatch() throws InterruptedException { + EventData message1 = new EventData(CONTENTS_BYTES); + EventData message2 = new EventData(CONTENTS_BYTES); + AtomicReference currentInProcess = new AtomicReference<>(); + List received = new ArrayList<>(); + CountDownLatch latch = new CountDownLatch(2); + spanProcessor.notifyIfCondition(latch, span -> span == currentInProcess.get() || span.getName().equals("EventHubs.send")); + StepVerifier.create(producer.send(Arrays.asList(message1, message2), new SendOptions().setPartitionId(PARTITION_ID))).verifyComplete(); + + processor = new EventProcessorClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .initialPartitionEventPosition(Collections.singletonMap(PARTITION_ID, EventPosition.fromEnqueuedTime(testStartTime))) + .consumerGroup("$Default") + .checkpointStore(new SampleCheckpointStore()) + .processEventBatch(eb -> { + received.clear(); + eb.getEvents().forEach(e -> { + currentInProcess.set(Span.current()); + received.add(e); + eb.updateCheckpoint(); + }); + }, 2) + .processError(e -> { + fail("unexpected error", e.getThrowable()); + }) + .buildEventProcessorClient(); + + processor.start(); + assertTrue(latch.await(10, TimeUnit.SECONDS)); + processor.stop(); + + List spans = spanProcessor.getEndedSpans(); + + List messages = findSpans(spans, "EventHubs.message"); + assertMessageSpan(messages.get(0), message1); + assertMessageSpan(messages.get(1), message2); + List send = findSpans(spans, "EventHubs.send"); + + assertSendSpan(send.get(0), Arrays.asList(message1, message2), "EventHubs.send"); + + List processed = findSpans(spans, "EventHubs.process") + .stream().filter(p -> p == currentInProcess.get()).collect(Collectors.toList()); + assertEquals(1, processed.size()); + assertConsumerSpan(processed.get(0), received, "EventHubs.process"); + } + + @Test + public void sendProcessAndFail() throws InterruptedException { + AtomicReference currentInProcess = new AtomicReference<>(); + List received = new ArrayList<>(); + CountDownLatch latch = new CountDownLatch(2); + spanProcessor.notifyIfCondition(latch, span -> span == currentInProcess.get() || span.getName().equals("EventHubs.send")); + + StepVerifier.create(producer.send(data, new SendOptions().setPartitionId(PARTITION_ID))).verifyComplete(); + + processor = new EventProcessorClientBuilder() + .connectionString(getConnectionString()) + .eventHubName(getEventHubName()) + .initialPartitionEventPosition(Collections.singletonMap(PARTITION_ID, EventPosition.fromEnqueuedTime(testStartTime))) + .consumerGroup("$Default") + .checkpointStore(new SampleCheckpointStore()) + .processEventBatch(eb -> { + received.clear(); + eb.getEvents().forEach(e -> { + currentInProcess.set(Span.current()); + received.add(e); + eb.updateCheckpoint(); + throw new RuntimeException("foo"); + }); + }, 1) + .processError(e -> { + fail("unexpected error", e.getThrowable()); + }) + .buildEventProcessorClient(); + + processor.start(); + assertTrue(latch.await(10, TimeUnit.SECONDS)); + processor.stop(); + + List spans = spanProcessor.getEndedSpans(); + List processed = findSpans(spans, "EventHubs.process") + .stream().filter(p -> p == currentInProcess.get()) + .collect(Collectors.toList()); + assertEquals(1, processed.size()); + assertConsumerSpan(processed.get(0), received, "EventHubs.process"); + } + + private void assertMessageSpan(ReadableSpan actual, EventData message) { + assertEquals("EventHubs.message", actual.getName()); + assertEquals(SpanKind.PRODUCER, actual.getKind()); + String traceparent = "00-" + actual.getSpanContext().getTraceId() + "-" + actual.getSpanContext().getSpanId() + "-01"; + assertEquals(message.getProperties().get("Diagnostic-Id"), traceparent); + assertEquals(message.getProperties().get("traceparent"), traceparent); + } + + private void assertSendSpan(ReadableSpan actual, List messages, String spanName) { + assertEquals(spanName, actual.getName()); + assertEquals(SpanKind.CLIENT, actual.getKind()); + List links = actual.toSpanData().getLinks(); + assertEquals(messages.size(), links.size()); + for (int i = 0; i < links.size(); i++) { + String messageTraceparent = (String) messages.get(i).getProperties().get("traceparent"); + SpanContext linkContext = links.get(i).getSpanContext(); + String linkTraceparent = "00-" + linkContext.getTraceId() + "-" + linkContext.getSpanId() + "-01"; + assertEquals(messageTraceparent, linkTraceparent); + } + } + + private void assertSyncConsumerSpan(ReadableSpan actual, List messages, String spanName) { + assertEquals(spanName, actual.getName()); + assertEquals(SpanKind.CLIENT, actual.getKind()); + List links = actual.toSpanData().getLinks(); + /* TODO (lmolkova) uncomment after azure-core-tracing-opentelemetry 1.0.0-beat.31 ships + assertEquals(messages.size(), links.size()); + for (int i = 0; i < links.size(); i++) { + String messageTraceparent = (String) messages.get(i).getData().getProperties().get("traceparent"); + SpanContext linkContext = links.get(i).getSpanContext(); + String linkTraceparent = "00-" + linkContext.getTraceId() + "-" + linkContext.getSpanId() + "-01"; + assertEquals(messageTraceparent, linkTraceparent); + assertNotNull(links.get(i).getAttributes().get(AttributeKey.longKey(Tracer.MESSAGE_ENQUEUED_TIME))); + }*/ + } + + private void assertConsumerSpan(ReadableSpan actual, EventData message, String spanName) { + assertEquals(spanName, actual.getName()); + assertEquals(SpanKind.CONSUMER, actual.getKind()); + assertEquals(0, actual.toSpanData().getLinks().size()); + + String messageTraceparent = (String) message.getProperties().get("traceparent"); + if (messageTraceparent == null) { + assertFalse(actual.getParentSpanContext().isValid()); + } else { + String parent = "00-" + actual.getSpanContext().getTraceId() + "-" + actual.getParentSpanContext().getSpanId() + "-01"; + assertEquals(messageTraceparent, parent); + } + } + + private void assertConsumerSpan(ReadableSpan actual, List messages, String spanName) { + assertEquals(spanName, actual.getName()); + assertEquals(SpanKind.CONSUMER, actual.getKind()); + /* TODO (lmolkova) uncomment after azure-core-tracing-opentelemetry 1.0.0-beta.31 ships + assertEquals(messages.size(), actual.toSpanData().getLinks().size()); + List links = actual.toSpanData().getLinks(); + for (EventData data : messages) { + String messageTraceparent = (String) data.getProperties().get("traceparent"); + List link = links.stream().filter(l -> { + String linkedContext = "00-" + l.getSpanContext().getTraceId() + "-" + l.getSpanContext().getSpanId() + "-01"; + return linkedContext.equals(messageTraceparent); + }).collect(Collectors.toList()); + assertEquals(1, link.size()); + assertNotNull(link.get(0).getAttributes().get(AttributeKey.longKey(Tracer.MESSAGE_ENQUEUED_TIME))); + }*/ + } + + private List findSpans(List spans, String spanName) { + return spans.stream() + .filter(s -> s.getName().equals(spanName)) + .collect(Collectors.toList()); + } + + static class TestSpanProcessor implements SpanProcessor { + private final ConcurrentLinkedDeque spans = new ConcurrentLinkedDeque<>(); + private final String entityName; + private final String namespace; + + private AtomicReference> notifier = new AtomicReference<>(); + + TestSpanProcessor(String namespace, String entityName) { + this.namespace = namespace; + this.entityName = entityName; + } + public List getEndedSpans() { + return spans.stream().collect(Collectors.toList()); + } + + @Override + public void onStart(Context context, ReadWriteSpan readWriteSpan) { + } + + @Override + public boolean isStartRequired() { + return false; + } + + @Override + public void onEnd(ReadableSpan readableSpan) { + assertEquals("Microsoft.EventHub", readableSpan.getAttribute(AttributeKey.stringKey("az.namespace"))); + assertEquals(entityName, readableSpan.getAttribute(AttributeKey.stringKey("message_bus.destination"))); + assertEquals(namespace, readableSpan.getAttribute(AttributeKey.stringKey("peer.address"))); + + Consumer filter = notifier.get(); + if (filter != null) { + filter.accept(readableSpan); + } + spans.add(readableSpan); + } + + public void notifyIfCondition(CountDownLatch countDownLatch, Predicate filter) { + notifier.set((span) -> { + if (filter.test(span)) { + countDownLatch.countDown(); + } + }); + } + + @Override + public boolean isEndRequired() { + return true; + } + } +} diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessorTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessorTest.java index c3e72d0bb066..2efab5508d60 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessorTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/implementation/AmqpReceiveLinkProcessorTest.java @@ -10,6 +10,7 @@ import com.azure.core.amqp.exception.AmqpErrorContext; import com.azure.core.amqp.exception.AmqpException; import com.azure.core.amqp.implementation.AmqpReceiveLink; +import com.azure.messaging.eventhubs.implementation.instrumentation.EventHubsConsumerInstrumentation; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; @@ -51,6 +52,8 @@ class AmqpReceiveLinkProcessorTest { private static final int PREFETCH = 5; + private static final EventHubsConsumerInstrumentation DEFAULT_INSTRUMENTATION = + new EventHubsConsumerInstrumentation(null, null, "hostname", "hubname", "$Default", false); @Mock private AmqpReceiveLink link1; @@ -91,7 +94,7 @@ void setup() { when(retryPolicy.getRetryOptions()).thenReturn(new AmqpRetryOptions()); - linkProcessor = new AmqpReceiveLinkProcessor("entity-path", PREFETCH, parentConnection); + linkProcessor = new AmqpReceiveLinkProcessor("entity-path", PREFETCH, "partition", parentConnection, DEFAULT_INSTRUMENTATION); when(link1.getEndpointStates()).thenReturn(endpointProcessor.flux()); when(link1.receive()).thenReturn(messageProcessor.flux()); @@ -110,11 +113,11 @@ void teardown() throws Exception { @Test void constructor() { Assertions.assertThrows(NullPointerException.class, () -> new AmqpReceiveLinkProcessor( - "entity-path", PREFETCH, null)); + "entity-path", PREFETCH, "partition", null, DEFAULT_INSTRUMENTATION)); Assertions.assertThrows(IllegalArgumentException.class, () -> new AmqpReceiveLinkProcessor( - "ENTITY", -1, parentConnection)); + "ENTITY", -1, "partition", parentConnection, DEFAULT_INSTRUMENTATION)); Assertions.assertThrows(NullPointerException.class, () -> new AmqpReceiveLinkProcessor( - null, PREFETCH, parentConnection)); + null, PREFETCH, "partition", parentConnection, DEFAULT_INSTRUMENTATION)); } /** diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/models/ProxyOptionsTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/models/ProxyOptionsTest.java index 11764d43904a..8266d654c3bc 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/models/ProxyOptionsTest.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/models/ProxyOptionsTest.java @@ -17,40 +17,40 @@ public class ProxyOptionsTest { private static final String PROXY_HOST = "127.0.0.1"; private static final String PROXY_PORT = "3128"; private static final String HTTP_PROXY = "/" + PROXY_HOST + ":" + PROXY_PORT; // InetAddressHolder's address starts with '/' - private static final String PROXY_USERNAME = "dummyUsername"; - private static final String PROXY_PASSWORD = "dummyPassword"; + private static final String FAKE_PROXY_USERNAME_PLACEHOLDER = "fakeUserNamePlaceholder"; + private static final String FAKE_PROXY_PASSWORD_PLACEHOLDER = "fakePasswordPlaceholder"; private static Proxy proxyAddress = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, Integer.parseInt(PROXY_PORT))); @ParameterizedTest @EnumSource(ProxyAuthenticationType.class) public void validateProxyConfiguration(ProxyAuthenticationType proxyAuthenticationType) { - ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, PROXY_USERNAME, PROXY_PASSWORD); + ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, FAKE_PROXY_USERNAME_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER); validateProxyConfiguration(proxyOptions, proxyAuthenticationType); } @ParameterizedTest @EnumSource(ProxyAuthenticationType.class) public void testIsProxyAddressConfigured(ProxyAuthenticationType proxyAuthenticationType) { - ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, PROXY_USERNAME, PROXY_PASSWORD); + ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, FAKE_PROXY_USERNAME_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertTrue(proxyOptions.isProxyAddressConfigured()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertTrue(proxyOptions.isProxyAddressConfigured()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, PROXY_USERNAME, null); + proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, FAKE_PROXY_USERNAME_PLACEHOLDER, null); Assertions.assertTrue(proxyOptions.isProxyAddressConfigured()); proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, null); Assertions.assertTrue(proxyOptions.isProxyAddressConfigured()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, PROXY_USERNAME, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, FAKE_PROXY_USERNAME_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertFalse(proxyOptions.isProxyAddressConfigured()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertFalse(proxyOptions.isProxyAddressConfigured()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, PROXY_USERNAME, null); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, FAKE_PROXY_USERNAME_PLACEHOLDER, null); Assertions.assertFalse(proxyOptions.isProxyAddressConfigured()); proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, null); @@ -60,25 +60,25 @@ public void testIsProxyAddressConfigured(ProxyAuthenticationType proxyAuthentica @ParameterizedTest @EnumSource(ProxyAuthenticationType.class) public void testHasUserDefinedCredentials(ProxyAuthenticationType proxyAuthenticationType) { - ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, PROXY_USERNAME, PROXY_PASSWORD); + ProxyOptions proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, FAKE_PROXY_USERNAME_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertTrue(proxyOptions.hasUserDefinedCredentials()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertFalse(proxyOptions.hasUserDefinedCredentials()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, PROXY_USERNAME, null); + proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, FAKE_PROXY_USERNAME_PLACEHOLDER, null); Assertions.assertFalse(proxyOptions.hasUserDefinedCredentials()); proxyOptions = new ProxyOptions(proxyAuthenticationType, proxyAddress, null, null); Assertions.assertFalse(proxyOptions.hasUserDefinedCredentials()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, PROXY_USERNAME, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, FAKE_PROXY_USERNAME_PLACEHOLDER, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertTrue(proxyOptions.hasUserDefinedCredentials()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, PROXY_PASSWORD); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, FAKE_PROXY_PASSWORD_PLACEHOLDER); Assertions.assertFalse(proxyOptions.hasUserDefinedCredentials()); - proxyOptions = new ProxyOptions(proxyAuthenticationType, null, PROXY_USERNAME, null); + proxyOptions = new ProxyOptions(proxyAuthenticationType, null, FAKE_PROXY_USERNAME_PLACEHOLDER, null); Assertions.assertFalse(proxyOptions.hasUserDefinedCredentials()); proxyOptions = new ProxyOptions(proxyAuthenticationType, null, null, null); @@ -89,8 +89,8 @@ private static void validateProxyConfiguration(ProxyOptions proxyOptions, ProxyA String proxyAddressStr = proxyOptions.getProxyAddress().address().toString(); ProxyAuthenticationType authentication = proxyOptions.getAuthentication(); Assertions.assertEquals(HTTP_PROXY, proxyAddressStr); - Assertions.assertEquals(PROXY_USERNAME, proxyOptions.getCredential().getUserName()); - Assertions.assertEquals(PROXY_PASSWORD, new String(proxyOptions.getCredential().getPassword())); + Assertions.assertEquals(FAKE_PROXY_USERNAME_PLACEHOLDER, proxyOptions.getCredential().getUserName()); + Assertions.assertEquals(FAKE_PROXY_PASSWORD_PLACEHOLDER, new String(proxyOptions.getCredential().getPassword())); Assertions.assertEquals(proxyAuthenticationType, authentication); } } diff --git a/sdk/eventhubs/microsoft-azure-eventhubs-eph/pom.xml b/sdk/eventhubs/microsoft-azure-eventhubs-eph/pom.xml index 019e5080d553..31d144aca06d 100644 --- a/sdk/eventhubs/microsoft-azure-eventhubs-eph/pom.xml +++ b/sdk/eventhubs/microsoft-azure-eventhubs-eph/pom.xml @@ -64,7 +64,7 @@ com.microsoft.azure msal4j - 1.13.2 + 1.13.3 test diff --git a/sdk/eventhubs/microsoft-azure-eventhubs-extensions/pom.xml b/sdk/eventhubs/microsoft-azure-eventhubs-extensions/pom.xml index fe06850f8c9e..fb27d0925573 100644 --- a/sdk/eventhubs/microsoft-azure-eventhubs-extensions/pom.xml +++ b/sdk/eventhubs/microsoft-azure-eventhubs-extensions/pom.xml @@ -68,7 +68,7 @@ com.microsoft.azure msal4j - 1.13.2 + 1.13.3 test diff --git a/sdk/eventhubs/microsoft-azure-eventhubs/pom.xml b/sdk/eventhubs/microsoft-azure-eventhubs/pom.xml index 2647c00a04fa..cbecd652b65b 100644 --- a/sdk/eventhubs/microsoft-azure-eventhubs/pom.xml +++ b/sdk/eventhubs/microsoft-azure-eventhubs/pom.xml @@ -77,7 +77,7 @@ com.microsoft.azure msal4j - 1.13.2 + 1.13.3 test diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigPasswordTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigPasswordTests.java index 47c8f6cd74eb..7bda10ea7aa5 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigPasswordTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigPasswordTests.java @@ -13,14 +13,14 @@ public final class HttpProxyConfigPasswordTests { @Test public void testDeserialize() { HttpProxyConfigPassword model = - BinaryData.fromString("{\"password\":\"bavxbniwdjswzt\"}").toObject(HttpProxyConfigPassword.class); - Assertions.assertEquals("bavxbniwdjswzt", model.password()); + BinaryData.fromString("{\"password\":\"fakePasswordPlaceholder\"}").toObject(HttpProxyConfigPassword.class); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); } @Test public void testSerialize() { - HttpProxyConfigPassword model = new HttpProxyConfigPassword().withPassword("bavxbniwdjswzt"); + HttpProxyConfigPassword model = new HttpProxyConfigPassword().withPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(HttpProxyConfigPassword.class); - Assertions.assertEquals("bavxbniwdjswzt", model.password()); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); } } diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigTests.java index c4b7f5f46264..1e8d33fa7451 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/HttpProxyConfigTests.java @@ -16,14 +16,14 @@ public void testDeserialize() { HttpProxyConfig model = BinaryData .fromString( - "{\"password\":\"clha\",\"httpProxy\":\"dbabp\",\"httpsProxy\":\"wrqlfktsthsuco\",\"noProxy\":[\"yyazttbt\",\"wrqpue\",\"ckzywbiexzfeyue\",\"xibxujwbhqwalm\"],\"trustedCa\":\"yoxa\",\"username\":\"dkzjancuxrh\"}") + "{\"password\":\"fakePasswordPlaceholder\",\"httpProxy\":\"dbabp\",\"httpsProxy\":\"wrqlfktsthsuco\",\"noProxy\":[\"yyazttbt\",\"wrqpue\",\"ckzywbiexzfeyue\",\"xibxujwbhqwalm\"],\"trustedCa\":\"yoxa\",\"username\":\"fakeUsernamePlaceholder\"}") .toObject(HttpProxyConfig.class); Assertions.assertEquals("dbabp", model.httpProxy()); Assertions.assertEquals("wrqlfktsthsuco", model.httpsProxy()); Assertions.assertEquals("yyazttbt", model.noProxy().get(0)); Assertions.assertEquals("yoxa", model.trustedCa()); - Assertions.assertEquals("dkzjancuxrh", model.username()); - Assertions.assertEquals("clha", model.password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); } @Test @@ -34,14 +34,14 @@ public void testSerialize() { .withHttpsProxy("wrqlfktsthsuco") .withNoProxy(Arrays.asList("yyazttbt", "wrqpue", "ckzywbiexzfeyue", "xibxujwbhqwalm")) .withTrustedCa("yoxa") - .withUsername("dkzjancuxrh") - .withPassword("clha"); + .withUsername("fakeUsernamePlaceholder") + .withPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(HttpProxyConfig.class); Assertions.assertEquals("dbabp", model.httpProxy()); Assertions.assertEquals("wrqlfktsthsuco", model.httpsProxy()); Assertions.assertEquals("yyazttbt", model.noProxy().get(0)); Assertions.assertEquals("yoxa", model.trustedCa()); - Assertions.assertEquals("dkzjancuxrh", model.username()); - Assertions.assertEquals("clha", model.password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); } } diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersPropertiesWithSecretsTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersPropertiesWithSecretsTests.java index c6d171a2341c..120e9f8f443e 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersPropertiesWithSecretsTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersPropertiesWithSecretsTests.java @@ -20,25 +20,25 @@ public void testDeserialize() { ProvisionedClustersPropertiesWithSecrets model = BinaryData .fromString( - "{\"aadProfile\":{\"adminGroupObjectIDs\":[\"conuqszfkbeype\",\"rmjmwvvjektc\",\"senhwlrs\",\"frzpwvlqdqgb\"],\"clientAppID\":\"ylihkaetckt\",\"enableAzureRbac\":true,\"managed\":false,\"serverAppID\":\"snkymuctq\",\"tenantID\":\"fbebrjcxer\",\"serverAppSecret\":\"wutttxfvjrbi\"},\"windowsProfile\":{\"adminPassword\":\"xepcyvahfn\",\"adminUsername\":\"kyqxjvuujqgidokg\",\"enableCsiProxy\":true,\"licenseType\":\"Windows_Server\"},\"httpProxyConfig\":{\"password\":\"vcltbgsncgh\",\"httpProxy\":\"esz\",\"httpsProxy\":\"bijhtxfvgxbf\",\"noProxy\":[\"nehmpvecx\",\"odebfqkkrbmpu\",\"gr\"],\"trustedCa\":\"flz\",\"username\":\"bxzpuzycisp\"}}") + "{\"aadProfile\":{\"adminGroupObjectIDs\":[\"conuqszfkbeype\",\"rmjmwvvjektc\",\"senhwlrs\",\"frzpwvlqdqgb\"],\"clientAppID\":\"ylihkaetckt\",\"enableAzureRbac\":true,\"managed\":false,\"serverAppID\":\"snkymuctq\",\"tenantID\":\"fbebrjcxer\",\"serverAppSecret\":\"fakeSecretPlaceholder\"},\"windowsProfile\":{\"adminPassword\":\"fakePasswordPlaceholder\",\"adminUsername\":\"fakeUsernamePlaceholder\",\"enableCsiProxy\":true,\"licenseType\":\"Windows_Server\"},\"httpProxyConfig\":{\"password\":\"fakePasswordPlaceholder\",\"httpProxy\":\"esz\",\"httpsProxy\":\"bijhtxfvgxbf\",\"noProxy\":[\"nehmpvecx\",\"odebfqkkrbmpu\",\"gr\"],\"trustedCa\":\"flz\",\"username\":\"fakeUsernamePlaceholder\"}}") .toObject(ProvisionedClustersPropertiesWithSecrets.class); - Assertions.assertEquals("wutttxfvjrbi", model.aadProfile().serverAppSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.aadProfile().serverAppSecret()); Assertions.assertEquals("conuqszfkbeype", model.aadProfile().adminGroupObjectIDs().get(0)); Assertions.assertEquals("ylihkaetckt", model.aadProfile().clientAppId()); Assertions.assertEquals(true, model.aadProfile().enableAzureRbac()); Assertions.assertEquals(false, model.aadProfile().managed()); Assertions.assertEquals("snkymuctq", model.aadProfile().serverAppId()); Assertions.assertEquals("fbebrjcxer", model.aadProfile().tenantId()); - Assertions.assertEquals("kyqxjvuujqgidokg", model.windowsProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.windowsProfile().adminUsername()); Assertions.assertEquals(true, model.windowsProfile().enableCsiProxy()); Assertions.assertEquals(LicenseType.WINDOWS_SERVER, model.windowsProfile().licenseType()); - Assertions.assertEquals("xepcyvahfn", model.windowsProfile().adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.windowsProfile().adminPassword()); Assertions.assertEquals("esz", model.httpProxyConfig().httpProxy()); Assertions.assertEquals("bijhtxfvgxbf", model.httpProxyConfig().httpsProxy()); Assertions.assertEquals("nehmpvecx", model.httpProxyConfig().noProxy().get(0)); Assertions.assertEquals("flz", model.httpProxyConfig().trustedCa()); - Assertions.assertEquals("bxzpuzycisp", model.httpProxyConfig().username()); - Assertions.assertEquals("vcltbgsncgh", model.httpProxyConfig().password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.httpProxyConfig().username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.httpProxyConfig().password()); } @Test @@ -47,7 +47,7 @@ public void testSerialize() { new ProvisionedClustersPropertiesWithSecrets() .withAadProfile( new AadProfile() - .withServerAppSecret("wutttxfvjrbi") + .withServerAppSecret("fakeSecretPlaceholder") .withAdminGroupObjectIDs( Arrays.asList("conuqszfkbeype", "rmjmwvvjektc", "senhwlrs", "frzpwvlqdqgb")) .withClientAppId("ylihkaetckt") @@ -57,35 +57,35 @@ public void testSerialize() { .withTenantId("fbebrjcxer")) .withWindowsProfile( new WindowsProfile() - .withAdminUsername("kyqxjvuujqgidokg") + .withAdminUsername("fakeUsernamePlaceholder") .withEnableCsiProxy(true) .withLicenseType(LicenseType.WINDOWS_SERVER) - .withAdminPassword("xepcyvahfn")) + .withAdminPassword("fakePasswordPlaceholder")) .withHttpProxyConfig( new HttpProxyConfig() .withHttpProxy("esz") .withHttpsProxy("bijhtxfvgxbf") .withNoProxy(Arrays.asList("nehmpvecx", "odebfqkkrbmpu", "gr")) .withTrustedCa("flz") - .withUsername("bxzpuzycisp") - .withPassword("vcltbgsncgh")); + .withUsername("fakeUsernamePlaceholder") + .withPassword("fakePasswordPlaceholder")); model = BinaryData.fromObject(model).toObject(ProvisionedClustersPropertiesWithSecrets.class); - Assertions.assertEquals("wutttxfvjrbi", model.aadProfile().serverAppSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.aadProfile().serverAppSecret()); Assertions.assertEquals("conuqszfkbeype", model.aadProfile().adminGroupObjectIDs().get(0)); Assertions.assertEquals("ylihkaetckt", model.aadProfile().clientAppId()); Assertions.assertEquals(true, model.aadProfile().enableAzureRbac()); Assertions.assertEquals(false, model.aadProfile().managed()); Assertions.assertEquals("snkymuctq", model.aadProfile().serverAppId()); Assertions.assertEquals("fbebrjcxer", model.aadProfile().tenantId()); - Assertions.assertEquals("kyqxjvuujqgidokg", model.windowsProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.windowsProfile().adminUsername()); Assertions.assertEquals(true, model.windowsProfile().enableCsiProxy()); Assertions.assertEquals(LicenseType.WINDOWS_SERVER, model.windowsProfile().licenseType()); - Assertions.assertEquals("xepcyvahfn", model.windowsProfile().adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.windowsProfile().adminPassword()); Assertions.assertEquals("esz", model.httpProxyConfig().httpProxy()); Assertions.assertEquals("bijhtxfvgxbf", model.httpProxyConfig().httpsProxy()); Assertions.assertEquals("nehmpvecx", model.httpProxyConfig().noProxy().get(0)); Assertions.assertEquals("flz", model.httpProxyConfig().trustedCa()); - Assertions.assertEquals("bxzpuzycisp", model.httpProxyConfig().username()); - Assertions.assertEquals("vcltbgsncgh", model.httpProxyConfig().password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.httpProxyConfig().username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.httpProxyConfig().password()); } } diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersTests.java index 497407018647..48bc57548599 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/ProvisionedClustersTests.java @@ -37,30 +37,30 @@ public void testDeserialize() { ProvisionedClusters model = BinaryData .fromString( - "{\"identity\":{\"principalId\":\"kuofqweykhme\",\"tenantId\":\"vfyexfw\",\"type\":\"SystemAssigned\"},\"properties\":{\"enableRbac\":false,\"linuxProfile\":{\"adminUsername\":\"yvdcsitynnaa\"},\"features\":{},\"addonProfiles\":{\"qsc\":{\"config\":{},\"enabled\":true}},\"controlPlane\":{\"name\":\"hezrkgq\",\"count\":1290040732,\"availabilityZones\":[\"fovgmkqsleyyvxy\",\"jpkcattpng\"],\"maxCount\":1035421848,\"maxPods\":183805680,\"minCount\":957799467,\"mode\":\"LB\",\"nodeLabels\":{\"q\":\"vmdajvnysou\",\"yhltrpmopjmcm\":\"canoaeupf\",\"thfuiuaodsfcpkvx\":\"tuo\",\"dagfuaxbezyiuok\":\"dpuozmyz\"},\"nodeTaints\":[\"hrdxwzywqsmbs\",\"reximoryocfs\",\"ksymd\",\"ys\"],\"osType\":\"Linux\",\"nodeImageVersion\":\"uxh\",\"vmSize\":\"udxorrqn\"},\"kubernetesVersion\":\"czvyifq\",\"networkProfile\":{\"loadBalancerSku\":\"stacked-metallb\",\"dnsServiceIP\":\"sllr\",\"networkPolicy\":\"flannel\",\"podCidr\":\"f\",\"podCidrs\":[\"kpnpulexxbczwtr\"],\"serviceCidr\":\"iqzbq\",\"serviceCidrs\":[\"ovm\",\"okacspk\",\"lhzdobp\",\"jmflbvvnch\"]},\"nodeResourceGroup\":\"cciw\",\"agentPoolProfiles\":[{\"name\":\"qkhr\",\"count\":1877680716,\"availabilityZones\":[],\"maxCount\":288403017,\"maxPods\":1916962672,\"minCount\":972559338,\"mode\":\"LB\",\"nodeLabels\":{},\"nodeTaints\":[],\"osType\":\"Linux\",\"nodeImageVersion\":\"uimjmvx\",\"vmSize\":\"duugidyjr\"}],\"cloudProviderProfile\":{},\"provisioningState\":\"Created\",\"status\":{\"addonStatus\":{},\"errorMessage\":\"onpc\"},\"aadProfile\":{\"adminGroupObjectIDs\":[\"hslkevleggzf\",\"u\",\"fmvfaxkffeiit\"],\"clientAppID\":\"vmezy\",\"enableAzureRbac\":true,\"managed\":false,\"serverAppID\":\"sbbzo\",\"tenantID\":\"igrxwburvjxxjn\",\"serverAppSecret\":\"ydptkoen\"},\"windowsProfile\":{\"adminPassword\":\"knvudwtiukb\",\"adminUsername\":\"ngkpocipazy\",\"enableCsiProxy\":true,\"licenseType\":\"None\"},\"httpProxyConfig\":{\"password\":\"jnpiucgyg\",\"httpProxy\":\"qzntypm\",\"httpsProxy\":\"p\",\"noProxy\":[\"drqjsdpy\"],\"trustedCa\":\"fyhxde\",\"username\":\"jzicwifsjt\"}},\"extendedLocation\":{\"type\":\"bishcbkhajdeyea\",\"name\":\"p\"},\"location\":\"agalpbuxwgipwhon\",\"tags\":{\"injep\":\"gshwankixz\",\"iyqzrnk\":\"ttmrywnuzoqf\"},\"id\":\"qvyxlwhzlsicoho\",\"name\":\"qnwvlrya\",\"type\":\"w\"}") + "{\"identity\":{\"principalId\":\"kuofqweykhme\",\"tenantId\":\"vfyexfw\",\"type\":\"SystemAssigned\"},\"properties\":{\"enableRbac\":false,\"linuxProfile\":{\"adminUsername\":\"fakeUsernamePlaceholder\"},\"features\":{},\"addonProfiles\":{\"qsc\":{\"config\":{},\"enabled\":true}},\"controlPlane\":{\"name\":\"hezrkgq\",\"count\":1290040732,\"availabilityZones\":[\"fovgmkqsleyyvxy\",\"jpkcattpng\"],\"maxCount\":1035421848,\"maxPods\":183805680,\"minCount\":957799467,\"mode\":\"LB\",\"nodeLabels\":{\"q\":\"vmdajvnysou\",\"yhltrpmopjmcm\":\"canoaeupf\",\"thfuiuaodsfcpkvx\":\"tuo\",\"dagfuaxbezyiuok\":\"dpuozmyz\"},\"nodeTaints\":[\"hrdxwzywqsmbs\",\"reximoryocfs\",\"ksymd\",\"ys\"],\"osType\":\"Linux\",\"nodeImageVersion\":\"uxh\",\"vmSize\":\"udxorrqn\"},\"kubernetesVersion\":\"czvyifq\",\"networkProfile\":{\"loadBalancerSku\":\"stacked-metallb\",\"dnsServiceIP\":\"sllr\",\"networkPolicy\":\"flannel\",\"podCidr\":\"f\",\"podCidrs\":[\"kpnpulexxbczwtr\"],\"serviceCidr\":\"iqzbq\",\"serviceCidrs\":[\"ovm\",\"okacspk\",\"lhzdobp\",\"jmflbvvnch\"]},\"nodeResourceGroup\":\"cciw\",\"agentPoolProfiles\":[{\"name\":\"qkhr\",\"count\":1877680716,\"availabilityZones\":[],\"maxCount\":288403017,\"maxPods\":1916962672,\"minCount\":972559338,\"mode\":\"LB\",\"nodeLabels\":{},\"nodeTaints\":[],\"osType\":\"Linux\",\"nodeImageVersion\":\"uimjmvx\",\"vmSize\":\"duugidyjr\"}],\"cloudProviderProfile\":{},\"provisioningState\":\"Created\",\"status\":{\"addonStatus\":{},\"errorMessage\":\"onpc\"},\"aadProfile\":{\"adminGroupObjectIDs\":[\"hslkevleggzf\",\"u\",\"fmvfaxkffeiit\"],\"clientAppID\":\"vmezy\",\"enableAzureRbac\":true,\"managed\":false,\"serverAppID\":\"sbbzo\",\"tenantID\":\"igrxwburvjxxjn\",\"serverAppSecret\":\"fakeSecretPlaceholder\"},\"windowsProfile\":{\"adminPassword\":\"fakePasswordPlaceholder\",\"adminUsername\":\"fakeUsernamePlaceholder\",\"enableCsiProxy\":true,\"licenseType\":\"None\"},\"httpProxyConfig\":{\"password\":\"fakePasswordPlaceholder\",\"httpProxy\":\"qzntypm\",\"httpsProxy\":\"p\",\"noProxy\":[\"drqjsdpy\"],\"trustedCa\":\"fyhxde\",\"username\":\"fakeUsernamePlaceholder\"}},\"extendedLocation\":{\"type\":\"bishcbkhajdeyea\",\"name\":\"p\"},\"location\":\"agalpbuxwgipwhon\",\"tags\":{\"injep\":\"gshwankixz\",\"iyqzrnk\":\"ttmrywnuzoqf\"},\"id\":\"qvyxlwhzlsicoho\",\"name\":\"qnwvlrya\",\"type\":\"w\"}") .toObject(ProvisionedClusters.class); Assertions.assertEquals("agalpbuxwgipwhon", model.location()); Assertions.assertEquals("gshwankixz", model.tags().get("injep")); Assertions.assertEquals(ResourceIdentityType.SYSTEM_ASSIGNED, model.identity().type()); - Assertions.assertEquals("ydptkoen", model.properties().aadProfile().serverAppSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.properties().aadProfile().serverAppSecret()); Assertions.assertEquals("hslkevleggzf", model.properties().aadProfile().adminGroupObjectIDs().get(0)); Assertions.assertEquals("vmezy", model.properties().aadProfile().clientAppId()); Assertions.assertEquals(true, model.properties().aadProfile().enableAzureRbac()); Assertions.assertEquals(false, model.properties().aadProfile().managed()); Assertions.assertEquals("sbbzo", model.properties().aadProfile().serverAppId()); Assertions.assertEquals("igrxwburvjxxjn", model.properties().aadProfile().tenantId()); - Assertions.assertEquals("ngkpocipazy", model.properties().windowsProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().windowsProfile().adminUsername()); Assertions.assertEquals(true, model.properties().windowsProfile().enableCsiProxy()); Assertions.assertEquals(LicenseType.NONE, model.properties().windowsProfile().licenseType()); - Assertions.assertEquals("knvudwtiukb", model.properties().windowsProfile().adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.properties().windowsProfile().adminPassword()); Assertions.assertEquals("qzntypm", model.properties().httpProxyConfig().httpProxy()); Assertions.assertEquals("p", model.properties().httpProxyConfig().httpsProxy()); Assertions.assertEquals("drqjsdpy", model.properties().httpProxyConfig().noProxy().get(0)); Assertions.assertEquals("fyhxde", model.properties().httpProxyConfig().trustedCa()); - Assertions.assertEquals("jzicwifsjt", model.properties().httpProxyConfig().username()); - Assertions.assertEquals("jnpiucgyg", model.properties().httpProxyConfig().password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().httpProxyConfig().username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.properties().httpProxyConfig().password()); Assertions.assertEquals(false, model.properties().enableRbac()); - Assertions.assertEquals("yvdcsitynnaa", model.properties().linuxProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().linuxProfile().adminUsername()); Assertions.assertEquals(true, model.properties().addonProfiles().get("qsc").enabled()); Assertions.assertEquals(1290040732, model.properties().controlPlane().count()); Assertions.assertEquals("fovgmkqsleyyvxy", model.properties().controlPlane().availabilityZones().get(0)); @@ -107,7 +107,7 @@ public void testSerialize() { new ProvisionedClustersAllProperties() .withAadProfile( new AadProfile() - .withServerAppSecret("ydptkoen") + .withServerAppSecret("fakeSecretPlaceholder") .withAdminGroupObjectIDs(Arrays.asList("hslkevleggzf", "u", "fmvfaxkffeiit")) .withClientAppId("vmezy") .withEnableAzureRbac(true) @@ -116,20 +116,20 @@ public void testSerialize() { .withTenantId("igrxwburvjxxjn")) .withWindowsProfile( new WindowsProfile() - .withAdminUsername("ngkpocipazy") + .withAdminUsername("fakeUsernamePlaceholder") .withEnableCsiProxy(true) .withLicenseType(LicenseType.NONE) - .withAdminPassword("knvudwtiukb")) + .withAdminPassword("fakePasswordPlaceholder")) .withHttpProxyConfig( new HttpProxyConfig() .withHttpProxy("qzntypm") .withHttpsProxy("p") .withNoProxy(Arrays.asList("drqjsdpy")) .withTrustedCa("fyhxde") - .withUsername("jzicwifsjt") - .withPassword("jnpiucgyg")) + .withUsername("fakeUsernamePlaceholder") + .withPassword("fakePasswordPlaceholder")) .withEnableRbac(false) - .withLinuxProfile(new LinuxProfileProperties().withAdminUsername("yvdcsitynnaa")) + .withLinuxProfile(new LinuxProfileProperties().withAdminUsername("fakeUsernamePlaceholder")) .withFeatures(new ProvisionedClustersCommonPropertiesFeatures()) .withAddonProfiles(mapOf("qsc", new AddonProfiles().withConfig(mapOf()).withEnabled(true))) .withControlPlane( @@ -189,25 +189,25 @@ public void testSerialize() { Assertions.assertEquals("agalpbuxwgipwhon", model.location()); Assertions.assertEquals("gshwankixz", model.tags().get("injep")); Assertions.assertEquals(ResourceIdentityType.SYSTEM_ASSIGNED, model.identity().type()); - Assertions.assertEquals("ydptkoen", model.properties().aadProfile().serverAppSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.properties().aadProfile().serverAppSecret()); Assertions.assertEquals("hslkevleggzf", model.properties().aadProfile().adminGroupObjectIDs().get(0)); Assertions.assertEquals("vmezy", model.properties().aadProfile().clientAppId()); Assertions.assertEquals(true, model.properties().aadProfile().enableAzureRbac()); Assertions.assertEquals(false, model.properties().aadProfile().managed()); Assertions.assertEquals("sbbzo", model.properties().aadProfile().serverAppId()); Assertions.assertEquals("igrxwburvjxxjn", model.properties().aadProfile().tenantId()); - Assertions.assertEquals("ngkpocipazy", model.properties().windowsProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().windowsProfile().adminUsername()); Assertions.assertEquals(true, model.properties().windowsProfile().enableCsiProxy()); Assertions.assertEquals(LicenseType.NONE, model.properties().windowsProfile().licenseType()); - Assertions.assertEquals("knvudwtiukb", model.properties().windowsProfile().adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.properties().windowsProfile().adminPassword()); Assertions.assertEquals("qzntypm", model.properties().httpProxyConfig().httpProxy()); Assertions.assertEquals("p", model.properties().httpProxyConfig().httpsProxy()); Assertions.assertEquals("drqjsdpy", model.properties().httpProxyConfig().noProxy().get(0)); Assertions.assertEquals("fyhxde", model.properties().httpProxyConfig().trustedCa()); - Assertions.assertEquals("jzicwifsjt", model.properties().httpProxyConfig().username()); - Assertions.assertEquals("jnpiucgyg", model.properties().httpProxyConfig().password()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().httpProxyConfig().username()); + Assertions.assertEquals("fakePasswordPlaceholder", model.properties().httpProxyConfig().password()); Assertions.assertEquals(false, model.properties().enableRbac()); - Assertions.assertEquals("yvdcsitynnaa", model.properties().linuxProfile().adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.properties().linuxProfile().adminUsername()); Assertions.assertEquals(true, model.properties().addonProfiles().get("qsc").enabled()); Assertions.assertEquals(1290040732, model.properties().controlPlane().count()); Assertions.assertEquals("fovgmkqsleyyvxy", model.properties().controlPlane().availabilityZones().get(0)); diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfilePasswordTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfilePasswordTests.java index 76c8fb38eeb7..262c0cc5a466 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfilePasswordTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfilePasswordTests.java @@ -13,14 +13,14 @@ public final class WindowsProfilePasswordTests { @Test public void testDeserialize() { WindowsProfilePassword model = - BinaryData.fromString("{\"adminPassword\":\"ybyxc\"}").toObject(WindowsProfilePassword.class); - Assertions.assertEquals("ybyxc", model.adminPassword()); + BinaryData.fromString("{\"adminPassword\":\"fakePasswordPlaceholder\"}").toObject(WindowsProfilePassword.class); + Assertions.assertEquals("fakePasswordPlaceholder", model.adminPassword()); } @Test public void testSerialize() { - WindowsProfilePassword model = new WindowsProfilePassword().withAdminPassword("ybyxc"); + WindowsProfilePassword model = new WindowsProfilePassword().withAdminPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(WindowsProfilePassword.class); - Assertions.assertEquals("ybyxc", model.adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.adminPassword()); } } diff --git a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfileTests.java b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfileTests.java index dd2d575a1fbf..095811fe3723 100644 --- a/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfileTests.java +++ b/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/src/test/java/com/azure/resourcemanager/hybridcontainerservice/generated/WindowsProfileTests.java @@ -16,26 +16,26 @@ public void testDeserialize() { WindowsProfile model = BinaryData .fromString( - "{\"adminPassword\":\"skpbhenbtkcxywn\",\"adminUsername\":\"nrs\",\"enableCsiProxy\":false,\"licenseType\":\"None\"}") + "{\"adminPassword\":\"fakePasswordPlaceholder\",\"adminUsername\":\"fakeUsernamePlaceholder\",\"enableCsiProxy\":false,\"licenseType\":\"None\"}") .toObject(WindowsProfile.class); - Assertions.assertEquals("nrs", model.adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.adminUsername()); Assertions.assertEquals(false, model.enableCsiProxy()); Assertions.assertEquals(LicenseType.NONE, model.licenseType()); - Assertions.assertEquals("skpbhenbtkcxywn", model.adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.adminPassword()); } @Test public void testSerialize() { WindowsProfile model = new WindowsProfile() - .withAdminUsername("nrs") + .withAdminUsername("fakeUsernamePlaceholder") .withEnableCsiProxy(false) .withLicenseType(LicenseType.NONE) - .withAdminPassword("skpbhenbtkcxywn"); + .withAdminPassword("fakePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(WindowsProfile.class); - Assertions.assertEquals("nrs", model.adminUsername()); + Assertions.assertEquals("fakeUsernamePlaceholder", model.adminUsername()); Assertions.assertEquals(false, model.enableCsiProxy()); Assertions.assertEquals(LicenseType.NONE, model.licenseType()); - Assertions.assertEquals("skpbhenbtkcxywn", model.adminPassword()); + Assertions.assertEquals("fakePasswordPlaceholder", model.adminPassword()); } } diff --git a/sdk/identity/azure-identity/CHANGELOG.md b/sdk/identity/azure-identity/CHANGELOG.md index cfa3f9a3919a..d2828ebbdd5c 100644 --- a/sdk/identity/azure-identity/CHANGELOG.md +++ b/sdk/identity/azure-identity/CHANGELOG.md @@ -10,6 +10,9 @@ ### Other Changes +#### Dependency Updates +- Upgraded `msal4j` from `1.13.2` to `1.13.3` + ## 1.7.0-beta.2 (2022-10-13) ### Features Added diff --git a/sdk/identity/azure-identity/README.md b/sdk/identity/azure-identity/README.md index ed8f9b2f2ff6..d38056c82711 100644 --- a/sdk/identity/azure-identity/README.md +++ b/sdk/identity/azure-identity/README.md @@ -2,7 +2,7 @@ The Azure Identity library provides [Azure Active Directory (Azure AD)](https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-whatis) token authentication support across the Azure SDK. It provides a set of [TokenCredential](https://learn.microsoft.com/java/api/com.azure.core.credential.tokencredential?view=azure-java-stable) implementations that can be used to construct Azure SDK clients that support Azure AD token authentication. - [Source code][source] | [API reference documentation][javadoc] | [Azure AD documentation][azuread_doc] +[Source code][source] | [API reference documentation][javadoc] | [Azure AD documentation][azuread_doc] ## Getting started @@ -39,9 +39,7 @@ Then include the direct dependency in the `dependencies` section without the ver #### Include direct dependency -To take dependency on a particular version of the library that isn't present in the BOM, add the direct dependency to your project as follows. - -Maven dependency for Azure Secret Client library. Add it to your project's POM file. +To take dependency on a particular version of the library that isn't present in the BOM, add the direct dependency to your project as follows: [//]: # ({x-version-update-start;com.azure:azure-identity;current}) ```xml @@ -244,7 +242,7 @@ While the `DefaultAzureCredential` is generally the quickest way to get started ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredentialBuilder().build(); AzureCliCredential cliCredential = new AzureCliCredentialBuilder().build(); - + ChainedTokenCredential credential = new ChainedTokenCredentialBuilder().addLast(managedIdentityCredential).addLast(cliCredential).build(); // Azure SDK client builders accept the credential as a parameter @@ -478,7 +476,7 @@ Credentials can be chained together to be tried in turn until one succeeds using AZURE_CLIENT_CERTIFICATE_PATH - path to a PEM-encoded certificate file including private key + path to a PFX or PEM-encoded certificate file including private key AZURE_CLIENT_CERTIFICATE_PASSWORD @@ -502,6 +500,10 @@ Credentials can be chained together to be tried in turn until one succeeds using AZURE_CLIENT_ID ID of an Azure AD application + + AZURE_TENANT_ID + (optional) ID of the application's Azure AD tenant + AZURE_USERNAME a username (usually an email address) diff --git a/sdk/identity/azure-identity/images/mermaidjs/DefaultAzureCredentialAuthFlow.svg b/sdk/identity/azure-identity/images/mermaidjs/DefaultAzureCredentialAuthFlow.svg index 6f8a9a43d11d..4eb5f57ec66d 100644 --- a/sdk/identity/azure-identity/images/mermaidjs/DefaultAzureCredentialAuthFlow.svg +++ b/sdk/identity/azure-identity/images/mermaidjs/DefaultAzureCredentialAuthFlow.svg @@ -1 +1 @@ -
    CREDENTIAL TYPES
    Developer
    Deployed service
    Environment
    Managed Identity
    IntelliJ
    Azure CLI
    Azure PowerShell
    \ No newline at end of file +
    CREDENTIAL TYPES
    Developer
    Deployed service
    Environment
    Managed Identity
    IntelliJ
    Azure CLI
    Azure PowerShell
    \ No newline at end of file diff --git a/sdk/identity/azure-identity/pom.xml b/sdk/identity/azure-identity/pom.xml index 66c9f3e66644..234f3a36286c 100644 --- a/sdk/identity/azure-identity/pom.xml +++ b/sdk/identity/azure-identity/pom.xml @@ -41,7 +41,7 @@ com.microsoft.azure msal4j - 1.13.2 + 1.13.3 com.microsoft.azure @@ -120,7 +120,7 @@ - com.microsoft.azure:msal4j:[1.13.2] + com.microsoft.azure:msal4j:[1.13.3] com.microsoft.azure:msal4j-persistence-extension:[1.1.0] net.java.dev.jna:jna-platform:[5.6.0] org.linguafranca.pwdb:KeePassJava2:[2.1.4] diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java index c0c4aaa23a89..d6aa36c95c14 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java @@ -36,6 +36,7 @@ *
  • {@link Configuration#PROPERTY_AZURE_CLIENT_ID AZURE_CLIENT_ID}
  • *
  • {@link Configuration#PROPERTY_AZURE_USERNAME AZURE_USERNAME}
  • *
  • {@link Configuration#PROPERTY_AZURE_PASSWORD AZURE_PASSWORD}
  • + *
  • {@link Configuration#PROPERTY_AZURE_TENANT_ID AZURE_TENANT_ID}
  • * */ @Immutable diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java index 450792ab538a..1b49c1cb5ca0 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java @@ -21,7 +21,13 @@ import java.util.concurrent.atomic.AtomicReference; /** - * Enables authentication to Azure Active Directory using data from Visual Studio Code + * Enables authentication to Azure Active Directory as the user signed in to Visual Studio Code via + * the 'Azure Account' extension. + * + *

    It's a known issue that this credential doesn't + * work with Azure Account extension + * versions newer than 0.9.11. A long-term fix to this problem is in progress. In the meantime, consider + * authenticating with {@link AzureCliCredential}.

    */ public class VisualStudioCodeCredential implements TokenCredential { private final IdentityClient identityClient; diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IdentityClient.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IdentityClient.java index 3666a4bd81b1..e5cc4458b0e0 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IdentityClient.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IdentityClient.java @@ -994,7 +994,7 @@ private Mono authenticateToServiceFabricManagedIdentityEndpoint(Str * @param request the details of the token request * @return a Publisher that emits an AccessToken */ - private Mono authenticateToManagedIdentityEndpoint(String identityEndpoint, String identityHeader, + public Mono authenticateToManagedIdentityEndpoint(String identityEndpoint, String identityHeader, String msiEndpoint, String msiSecret, TokenRequestContext request) { return Mono.fromCallable(() -> { diff --git a/sdk/identity/azure-identity/src/samples/java/com/azure/identity/credential/JavaDocCodeSnippets.java b/sdk/identity/azure-identity/src/samples/java/com/azure/identity/credential/JavaDocCodeSnippets.java index 83c30b89fcb9..c573a5e6ce8d 100644 --- a/sdk/identity/azure-identity/src/samples/java/com/azure/identity/credential/JavaDocCodeSnippets.java +++ b/sdk/identity/azure-identity/src/samples/java/com/azure/identity/credential/JavaDocCodeSnippets.java @@ -26,8 +26,8 @@ public final class JavaDocCodeSnippets { private String tenantId = System.getenv("AZURE_TENANT_ID"); private String clientId = System.getenv("AZURE_CLIENT_ID"); private String clientSecret = System.getenv("AZURE_CLIENT_SECRET"); - private String username = "sampleuser"; - private String password = "Samp1eP@ssw0rd"; + private String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + private String fakePasswordPlaceholder = "fakePasswordPlaceholder"; /** * Method to insert code snippets for {@link ClientSecretCredential} @@ -80,8 +80,8 @@ public void chainedTokenCredentialCodeSnippets() { // BEGIN: com.azure.identity.credential.chainedtokencredential.construct UsernamePasswordCredential usernamePasswordCredential = new UsernamePasswordCredentialBuilder() .clientId(clientId) - .username(username) - .password(password) + .username(fakeUsernamePlaceholder) + .password(fakePasswordPlaceholder) .build(); InteractiveBrowserCredential interactiveBrowserCredential = new InteractiveBrowserCredentialBuilder() .clientId(clientId) diff --git a/sdk/identity/azure-identity/src/test/java/com/azure/identity/AzureCliCredentialTest.java b/sdk/identity/azure-identity/src/test/java/com/azure/identity/AzureCliCredentialTest.java index a6dd0e84c4af..05b3e9b39fe6 100644 --- a/sdk/identity/azure-identity/src/test/java/com/azure/identity/AzureCliCredentialTest.java +++ b/sdk/identity/azure-identity/src/test/java/com/azure/identity/AzureCliCredentialTest.java @@ -108,9 +108,6 @@ public void azureCliCredentialAuthenticationFailedException() throws Exception { @Test public void testAdditionalTenantNoImpact() { // setup - String username = "testuser"; - String password = "P@ssw0rd"; - TokenRequestContext request = new TokenRequestContext().addScopes("https://vault.azure.net/.default") .setTenantId("newTenant"); diff --git a/sdk/identity/azure-identity/src/test/java/com/azure/identity/UsernamePasswordCredentialTest.java b/sdk/identity/azure-identity/src/test/java/com/azure/identity/UsernamePasswordCredentialTest.java index 9934b1f8f418..533071123c12 100644 --- a/sdk/identity/azure-identity/src/test/java/com/azure/identity/UsernamePasswordCredentialTest.java +++ b/sdk/identity/azure-identity/src/test/java/com/azure/identity/UsernamePasswordCredentialTest.java @@ -36,8 +36,8 @@ public class UsernamePasswordCredentialTest { @Test public void testValidUserCredential() throws Exception { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; String token1 = "token1"; String token2 = "token2"; TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com"); @@ -47,7 +47,7 @@ public void testValidUserCredential() throws Exception { // mock try (MockedConstruction identityClientMock = mockConstruction(IdentityClient.class, (identityClient, context) -> { - when(identityClient.authenticateWithUsernamePassword(request1, username, password)).thenReturn(TestUtils.getMockMsalToken(token1, expiresAt)); + when(identityClient.authenticateWithUsernamePassword(request1, fakeUsernamePlaceholder, fakePasswordPlaceholder)).thenReturn(TestUtils.getMockMsalToken(token1, expiresAt)); when(identityClient.authenticateWithPublicClientCache(any(), any())) .thenAnswer(invocation -> { TokenRequestContext argument = (TokenRequestContext) invocation.getArguments()[0]; @@ -62,7 +62,7 @@ public void testValidUserCredential() throws Exception { })) { // test UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().clientId(clientId).username(username).password(password).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder).build(); StepVerifier.create(credential.getToken(request1)) .expectNextMatches(accessToken -> token1.equals(accessToken.getToken()) && expiresAt.getSecond() == accessToken.getExpiresAt().getSecond()) @@ -75,7 +75,7 @@ public void testValidUserCredential() throws Exception { } try (MockedConstruction identityClientMock = mockConstruction(IdentitySyncClient.class, (identitySyncClient, context) -> { - when(identitySyncClient.authenticateWithUsernamePassword(request1, username, password)).thenReturn(TestUtils.getMockMsalTokenSync(token1, expiresAt)); + when(identitySyncClient.authenticateWithUsernamePassword(request1, fakeUsernamePlaceholder, fakePasswordPlaceholder)).thenReturn(TestUtils.getMockMsalTokenSync(token1, expiresAt)); when(identitySyncClient.authenticateWithPublicClientCache(any(), any())) .thenAnswer(invocation -> { TokenRequestContext argument = (TokenRequestContext) invocation.getArguments()[0]; @@ -89,7 +89,7 @@ public void testValidUserCredential() throws Exception { }); })) { UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().clientId(clientId).username(username).password(password).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder).build(); // test AccessToken accessToken = credential.getTokenSync(request1); Assert.assertEquals(token1, accessToken.getToken()); @@ -105,20 +105,20 @@ public void testValidUserCredential() throws Exception { @Test public void testInvalidUserCredential() throws Exception { // setup - String username = "testuser"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; String badPassword = "Password"; TokenRequestContext request = new TokenRequestContext().addScopes("https://management.azure.com"); // mock try (MockedConstruction identityClientMock = mockConstruction(IdentityClient.class, (identityClient, context) -> { - when(identityClient.authenticateWithUsernamePassword(request, username, badPassword)).thenThrow(new MsalServiceException("bad credential", "BadCredential")); + when(identityClient.authenticateWithUsernamePassword(request, fakeUsernamePlaceholder, badPassword)).thenThrow(new MsalServiceException("bad credential", "BadCredential")); when(identityClient.authenticateWithPublicClientCache(any(), any())) .thenAnswer(invocation -> Mono.error(new UnsupportedOperationException("nothing cached"))); when(identityClient.getIdentityClientOptions()).thenReturn(new IdentityClientOptions()); })) { // test UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().clientId(clientId).username(username).password(badPassword).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).username(fakeUsernamePlaceholder).password(badPassword).build(); StepVerifier.create(credential.getToken(request)) .expectErrorMatches(t -> t instanceof MsalServiceException && "bad credential".equals(t.getMessage())) .verify(); @@ -126,14 +126,14 @@ public void testInvalidUserCredential() throws Exception { } try (MockedConstruction identityClientMock = mockConstruction(IdentitySyncClient.class, (identitySyncClient, context) -> { - when(identitySyncClient.authenticateWithUsernamePassword(request, username, badPassword)).thenThrow(new MsalServiceException("bad credential", "BadCredential")); + when(identitySyncClient.authenticateWithUsernamePassword(request, fakeUsernamePlaceholder, badPassword)).thenThrow(new MsalServiceException("bad credential", "BadCredential")); when(identitySyncClient.authenticateWithPublicClientCache(any(), any())) .thenAnswer(invocation -> Mono.error(new UnsupportedOperationException("nothing cached"))); when(identitySyncClient.getIdentityClientOptions()).thenReturn(new IdentityClientOptions()); })) { // test UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().clientId(clientId).username(username).password(badPassword).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).username(fakeUsernamePlaceholder).password(badPassword).build(); try { credential.getTokenSync(request); } catch (Exception e) { @@ -146,33 +146,33 @@ public void testInvalidUserCredential() throws Exception { @Test public void testInvalidParameters() throws Exception { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; String token1 = "token1"; TokenRequestContext request = new TokenRequestContext().addScopes("https://management.azure.com"); OffsetDateTime expiresOn = OffsetDateTime.now(ZoneOffset.UTC).plusHours(1); // mock try (MockedConstruction identityClientMock = mockConstruction(IdentityClient.class, (identityClient, context) -> { - when(identityClient.authenticateWithUsernamePassword(request, username, password)).thenReturn(TestUtils.getMockMsalToken(token1, expiresOn)); + when(identityClient.authenticateWithUsernamePassword(request, fakeUsernamePlaceholder, fakePasswordPlaceholder)).thenReturn(TestUtils.getMockMsalToken(token1, expiresOn)); when(identityClient.authenticateWithPublicClientCache(any(), any())) .thenAnswer(invocation -> Mono.error(new UnsupportedOperationException("nothing cached"))); })) { // test try { - new UsernamePasswordCredentialBuilder().username(username).password(password).build(); + new UsernamePasswordCredentialBuilder().username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder).build(); fail(); } catch (IllegalArgumentException e) { Assert.assertTrue(e.getMessage().contains("clientId")); } try { - new UsernamePasswordCredentialBuilder().clientId(clientId).username(username).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).username(fakeUsernamePlaceholder).build(); fail(); } catch (IllegalArgumentException e) { Assert.assertTrue(e.getMessage().contains("password")); } try { - new UsernamePasswordCredentialBuilder().clientId(clientId).password(password).build(); + new UsernamePasswordCredentialBuilder().clientId(clientId).password(fakePasswordPlaceholder).build(); fail(); } catch (IllegalArgumentException e) { Assert.assertTrue(e.getMessage().contains("username")); @@ -184,21 +184,21 @@ public void testInvalidParameters() throws Exception { @Test public void testValidAuthenticate() throws Exception { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; String token1 = "token1"; TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com"); OffsetDateTime expiresAt = OffsetDateTime.now(ZoneOffset.UTC).plusHours(1); // mock try (MockedConstruction identityClientMock = mockConstruction(IdentityClient.class, (identityClient, context) -> { - when(identityClient.authenticateWithUsernamePassword(eq(request1), eq(username), eq(password))) + when(identityClient.authenticateWithUsernamePassword(eq(request1), eq(fakeUsernamePlaceholder), eq(fakePasswordPlaceholder))) .thenReturn(TestUtils.getMockMsalToken(token1, expiresAt)); })) { // test UsernamePasswordCredential credential = new UsernamePasswordCredentialBuilder().clientId(clientId) - .username(username).password(password).build(); + .username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder).build(); StepVerifier.create(credential.authenticate(request1)) .expectNextMatches(authenticationRecord -> authenticationRecord.getAuthority() .equals("http://login.microsoftonline.com") @@ -212,14 +212,14 @@ public void testValidAuthenticate() throws Exception { @Test public void testAdditionalTenantNoImpact() { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; TokenRequestContext request = new TokenRequestContext().addScopes("https://vault.azure.net/.default") .setTenantId("newTenant"); UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().username(username).password(password) + new UsernamePasswordCredentialBuilder().username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder) .clientId(clientId).additionallyAllowedTenants("RANDOM").build(); StepVerifier.create(credential.getToken(request)) .expectErrorMatches(e -> e.getCause() instanceof MsalServiceException) @@ -229,14 +229,14 @@ public void testAdditionalTenantNoImpact() { @Test public void testInvalidMultiTenantAuth() { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; TokenRequestContext request = new TokenRequestContext().addScopes("https://vault.azure.net/.default") .setTenantId("newTenant"); UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().tenantId("tenant").username(username).password(password) + new UsernamePasswordCredentialBuilder().tenantId("tenant").username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder) .clientId(clientId).build(); StepVerifier.create(credential.getToken(request)) .expectErrorMatches(e -> e instanceof ClientAuthenticationException && (e.getCause().getMessage().startsWith("The current credential is not configured to"))) @@ -246,14 +246,14 @@ public void testInvalidMultiTenantAuth() { @Test public void testValidMultiTenantAuth() { // setup - String username = "testuser"; - String password = "P@ssw0rd"; + String fakeUsernamePlaceholder = "fakeUsernamePlaceholder"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; TokenRequestContext request = new TokenRequestContext().addScopes("https://vault.azure.net/.default") .setTenantId("newTenant"); UsernamePasswordCredential credential = - new UsernamePasswordCredentialBuilder().username(username).password(password).tenantId("tenant") + new UsernamePasswordCredentialBuilder().username(fakeUsernamePlaceholder).password(fakePasswordPlaceholder).tenantId("tenant") .clientId(clientId).additionallyAllowedTenants(IdentityUtil.ALL_TENANTS).build(); StepVerifier.create(credential.getToken(request)) diff --git a/sdk/keyvault/azure-security-keyvault-administration/src/test/java/com/azure/security/keyvault/administration/KeyVaultCredentialPolicyTest.java b/sdk/keyvault/azure-security-keyvault-administration/src/test/java/com/azure/security/keyvault/administration/KeyVaultCredentialPolicyTest.java index acf49427d2d6..1a65aba08b32 100644 --- a/sdk/keyvault/azure-security-keyvault-administration/src/test/java/com/azure/security/keyvault/administration/KeyVaultCredentialPolicyTest.java +++ b/sdk/keyvault/azure-security-keyvault-administration/src/test/java/com/azure/security/keyvault/administration/KeyVaultCredentialPolicyTest.java @@ -98,7 +98,7 @@ public void setup() { this.unauthorizedHttpResponseWithoutHeader = unauthorizedResponseWithoutHeader; this.callContext = plainContext; this.differentScopeContext = differentScopeContext; - this.credential = new BasicAuthenticationCredential("user", "pass"); + this.credential = new BasicAuthenticationCredential("user", "fakePasswordPlaceholder"); this.testContext = testContext; this.bodyContext = bodyContext; this.bodyFluxContext = bodyFluxContext; diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java index 839e8ceb327a..8349c0b45ade 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java @@ -1085,7 +1085,7 @@ public Mono> updateCertificatePolicyWithResponse(Str *
          * CertificateIssuer issuer = new CertificateIssuer("issuerName", "providerName")
          *     .setAccountId("keyvaultuser")
    -     *     .setPassword("temp2");
    +     *     .setPassword("fakePasswordPlaceholder");
          * certificateAsyncClient.createIssuer(issuer)
          *     .contextWrite(Context.of(key1, value1, key2, value2))
          *     .subscribe(issuerResponse -> {
    @@ -1122,7 +1122,7 @@ public Mono createIssuer(CertificateIssuer issuer) {
          * 
          * CertificateIssuer newIssuer = new CertificateIssuer("issuerName", "providerName")
          *     .setAccountId("keyvaultuser")
    -     *     .setPassword("temp2");
    +     *     .setPassword("fakePasswordPlaceholder");
          * certificateAsyncClient.createIssuerWithResponse(newIssuer)
          *     .contextWrite(Context.of(key1, value1, key2, value2))
          *     .subscribe(issuerResponse -> {
    diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java
    index c38c02e1e7a5..aae07eaf33f3 100644
    --- a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java
    +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java
    @@ -196,7 +196,7 @@ public void createCertificateIssuerCodeSnippets() {
             // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.createIssuer#CertificateIssuer
             CertificateIssuer issuer = new CertificateIssuer("issuerName", "providerName")
                 .setAccountId("keyvaultuser")
    -            .setPassword("temp2");
    +            .setPassword("fakePasswordPlaceholder");
             certificateAsyncClient.createIssuer(issuer)
                 .contextWrite(Context.of(key1, value1, key2, value2))
                 .subscribe(issuerResponse -> {
    @@ -208,7 +208,7 @@ public void createCertificateIssuerCodeSnippets() {
             // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.createIssuerWithResponse#CertificateIssuer
             CertificateIssuer newIssuer = new CertificateIssuer("issuerName", "providerName")
                 .setAccountId("keyvaultuser")
    -            .setPassword("temp2");
    +            .setPassword("fakePasswordPlaceholder");
             certificateAsyncClient.createIssuerWithResponse(newIssuer)
                 .contextWrite(Context.of(key1, value1, key2, value2))
                 .subscribe(issuerResponse -> {
    diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java
    index b6c8231a3765..0f5fa5df4af0 100644
    --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java
    +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java
    @@ -59,6 +59,7 @@
     import java.util.function.Consumer;
     import java.util.stream.Stream;
     
    +import static com.azure.security.keyvault.certificates.FakeCredentialInTest.FAKE_CERTIFICATE_CONTENT;
     import static org.junit.jupiter.api.Assertions.assertEquals;
     import static org.junit.jupiter.api.Assertions.assertNotNull;
     import static org.junit.jupiter.api.Assertions.fail;
    @@ -384,11 +385,11 @@ void updateIssuerRunner(BiConsumer testRun
                     .setFirstName("otherFirst")
                     .setLastName("otherLast")
                     .setEmail("otherFirst.otherLast@hotmail.com")
    -                .setPhone("67890")))
    +                .setPhone("fakePhoneNumberPlaceholder")))
                 .setAccountId("otherIssuerAccountId")
                 .setEnabled(false)
                 .setOrganizationId("otherOrgId")
    -            .setPassword("test456");
    +            .setPassword("fakePasswordPlaceholder");
     
             testRunner.accept(certificateIssuer, issuerForUpdate);
         }
    @@ -456,15 +457,14 @@ void listDeletedCertificatesRunner(Consumer> testRunner) {
         public abstract void importCertificate(HttpClient httpClient, CertificateServiceVersion serviceVersion);
     
         void importCertificateRunner(Consumer testRunner) {
    -        String certificateContent = "MIIJOwIBAzCCCPcGCSqGSIb3DQEHAaCCCOgEggjkMIII4DCCBgkGCSqGSIb3DQEHAaCCBfoEggX2MIIF8jCCBe4GCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAj15YH9pOE58AICB9AEggTYLrI+SAru2dBZRQRlJY7XQ3LeLkah2FcRR3dATDshZ2h0IA2oBrkQIdsLyAAWZ32qYR1qkWxLHn9AqXgu27AEbOk35+pITZaiy63YYBkkpR+pDdngZt19Z0PWrGwHEq5z6BHS2GLyyN8SSOCbdzCz7blj3+7IZYoMj4WOPgOm/tQ6U44SFWek46QwN2zeA4i97v7ftNNns27ms52jqfhOvTA9c/wyfZKAY4aKJfYYUmycKjnnRl012ldS2lOkASFt+lu4QCa72IY6ePtRudPCvmzRv2pkLYS6z3cI7omT8nHP3DymNOqLbFqr5O2M1ZYaLC63Q3xt3eVvbcPh3N08D1hHkhz/KDTvkRAQpvrW8ISKmgDdmzN55Pe55xHfSWGB7gPw8sZea57IxFzWHTK2yvTslooWoosmGxanYY2IG/no3EbPOWDKjPZ4ilYJe5JJ2immlxPz+2e2EOCKpDI+7fzQcRz3PTd3BK+budZ8aXX8aW/lOgKS8WmxZoKnOJBNWeTNWQFugmktXfdPHAdxMhjUXqeGQd8wTvZ4EzQNNafovwkI7IV/ZYoa++RGofVR3ZbRSiBNF6TDj/qXFt0wN/CQnsGAmQAGNiN+D4mY7i25dtTu/Jc7OxLdhAUFpHyJpyrYWLfvOiS5WYBeEDHkiPUa/8eZSPA3MXWZR1RiuDvuNqMjct1SSwdXADTtF68l/US1ksU657+XSC+6ly1A/upz+X71+C4Ho6W0751j5ZMT6xKjGh5pee7MVuduxIzXjWIy3YSd0fIT3U0A5NLEvJ9rfkx6JiHjRLx6V1tqsrtT6BsGtmCQR1UCJPLqsKVDvAINx3cPA/CGqr5OX2BGZlAihGmN6n7gv8w4O0k0LPTAe5YefgXN3m9pE867N31GtHVZaJ/UVgDNYS2jused4rw76ZWN41akx2QN0JSeMJqHXqVz6AKfz8ICS/dFnEGyBNpXiMRxrY/QPKi/wONwqsbDxRW7vZRVKs78pBkE0ksaShlZk5GkeayDWC/7Hi/NqUFtIloK9XB3paLxo1DGu5qqaF34jZdktzkXp0uZqpp+FfKZaiovMjt8F7yHCPk+LYpRsU2Cyc9DVoDA6rIgf+uEP4jppgehsxyT0lJHax2t869R2jYdsXwYUXjgwHIV0voj7bJYPGFlFjXOp6ZW86scsHM5xfsGQoK2Fp838VT34SHE1ZXU/puM7rviREHYW72pfpgGZUILQMohuTPnd8tFtAkbrmjLDo+k9xx7HUvgoFTiNNWuq/cRjr70FKNguMMTIrid+HwfmbRoaxENWdLcOTNeascER2a+37UQolKD5ksrPJG6RdNA7O2pzp3micDYRs/+s28cCIxO//J/d4nsgHp6RTuCu4+Jm9k0YTw2Xg75b2cWKrxGnDUgyIlvNPaZTB5QbMid4x44/lE0LLi9kcPQhRgrK07OnnrMgZvVGjt1CLGhKUv7KFc3xV1r1rwKkosxnoG99oCoTQtregcX5rIMjHgkc1IdflGJkZzaWMkYVFOJ4Weynz008i4ddkske5vabZs37Lb8iggUYNBYZyGzalruBgnQyK4fz38Fae4nWYjyildVfgyo/fCePR2ovOfphx9OQJi+M9BoFmPrAg+8ARDZ+R+5yzYuEc9ZoVX7nkp7LTGB3DANBgkrBgEEAYI3EQIxADATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGEAOAAwAGQAZgBmADgANgAtAGUAOQA2AGUALQA0ADIAMgA0AC0AYQBhADEAMQAtAGIAZAAxADkANABkADUAYQA2AGIANwA3MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggLPBgkqhkiG9w0BBwagggLAMIICvAIBADCCArUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECNX+VL2MxzzWAgIH0ICCAojmRBO+CPfVNUO0s+BVuwhOzikAGNBmQHNChmJ/pyzPbMUbx7tO63eIVSc67iERda2WCEmVwPigaVQkPaumsfp8+L6iV/BMf5RKlyRXcwh0vUdu2Qa7qadD+gFQ2kngf4Dk6vYo2/2HxayuIf6jpwe8vql4ca3ZtWXfuRix2fwgltM0bMz1g59d7x/glTfNqxNlsty0A/rWrPJjNbOPRU2XykLuc3AtlTtYsQ32Zsmu67A7UNBw6tVtkEXlFDqhavEhUEO3dvYqMY+QLxzpZhA0q44ZZ9/ex0X6QAFNK5wuWxCbupHWsgxRwKftrxyszMHsAvNoNcTlqcctee+ecNwTJQa1/MDbnhO6/qHA7cfG1qYDq8Th635vGNMW1w3sVS7l0uEvdayAsBHWTcOC2tlMa5bfHrhY8OEIqj5bN5H9RdFy8G/W239tjDu1OYjBDydiBqzBn8HG1DSj1Pjc0kd/82d4ZU0308KFTC3yGcRad0GnEH0Oi3iEJ9HbriUbfVMbXNHOF+MktWiDVqzndGMKmuJSdfTBKvGFvejAWVO5E4mgLvoaMmbchc3BO7sLeraHnJN5hvMBaLcQI38N86mUfTR8AP6AJ9c2k514KaDLclm4z6J8dMz60nUeo5D3YD09G6BavFHxSvJ8MF0Lu5zOFzEePDRFm9mH8W0N/sFlIaYfD/GWU/w44mQucjaBk95YtqOGRIj58tGDWr8iUdHwaYKGqU24zGeRae9DhFXPzZshV1ZGsBQFRaoYkyLAwdJWIXTi+c37YaC8FRSEnnNmS79Dou1Kc3BvK4EYKAD2KxjtUebrV174gD0Q+9YuJ0GXOTspBvCFd5VT2Rw5zDNrA/J3F5fMCk4wOzAfMAcGBSsOAwIaBBSxgh2xyF+88V4vAffBmZXv8Txt4AQU4O/NX4MjxSodbE7ApNAMIvrtREwCAgfQ";
    -        String certificatePassword = "123";
    +        String certificatePassword = "fakePasswordPlaceholder";
             String certificateName = testResourceNamer.randomName("importCertPkcs", 25);
             HashMap tags = new HashMap<>();
     
             tags.put("key", "val");
     
             ImportCertificateOptions importCertificateOptions =
    -            new ImportCertificateOptions(certificateName, Base64.getDecoder().decode(certificateContent))
    +            new ImportCertificateOptions(certificateName, Base64.getDecoder().decode(FAKE_CERTIFICATE_CONTENT))
                     .setPassword(certificatePassword)
                     .setEnabled(true)
                     .setTags(tags);
    @@ -517,11 +517,11 @@ CertificateIssuer setupIssuer(String issuerName) {
                     .setFirstName("first")
                     .setLastName("last")
                     .setEmail("first.last@hotmail.com")
    -                .setPhone("12345")))
    +                .setPhone("fakePhoneNumberPlaceholder")))
                 .setAccountId("issuerAccountId")
                 .setEnabled(true)
                 .setOrganizationId("orgId")
    -            .setPassword("test123");
    +            .setPassword("fakePasswordPlaceholder");
         }
     
         String toHexString(byte[] x5t) {
    diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/FakeCredentialInTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/FakeCredentialInTest.java
    new file mode 100644
    index 000000000000..12d3cdfed431
    --- /dev/null
    +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/FakeCredentialInTest.java
    @@ -0,0 +1,48 @@
    +// Copyright (c) Microsoft Corporation. All rights reserved.
    +// Licensed under the MIT License.
    +
    +package com.azure.security.keyvault.certificates;
    +
    +/**
    + * Fake credential shared in Tests
    + */
    +public class FakeCredentialInTest {
    +    /**
    +     * Fake certificate content
    +     */
    +    public static final String FAKE_CERTIFICATE_CONTENT =
    +        "MIIJOwIBAzCCCPcGCSqGSIb3DQEHAaCCCOgEggjkMIII4DCCBgkGCSqGSIb3DQEHAaCCBfoEggX2MIIF8jCCBe4GCyqGSIb3DQE"
    +            + "MCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAj15YH9pOE58AICB9AEggTYLrI+SAru2dBZRQRlJY7XQ3LeLkah2FcR"
    +            + "R3dATDshZ2h0IA2oBrkQIdsLyAAWZ32qYR1qkWxLHn9AqXgu27AEbOk35+pITZaiy63YYBkkpR+pDdngZt19Z0PWrGwHE"
    +            + "q5z6BHS2GLyyN8SSOCbdzCz7blj3+7IZYoMj4WOPgOm/tQ6U44SFWek46QwN2zeA4i97v7ftNNns27ms52jqfhOvTA9c/"
    +            + "wyfZKAY4aKJfYYUmycKjnnRl012ldS2lOkASFt+lu4QCa72IY6ePtRudPCvmzRv2pkLYS6z3cI7omT8nHP3DymNOqLbFq"
    +            + "r5O2M1ZYaLC63Q3xt3eVvbcPh3N08D1hHkhz/KDTvkRAQpvrW8ISKmgDdmzN55Pe55xHfSWGB7gPw8sZea57IxFzWHTK2"
    +            + "yvTslooWoosmGxanYY2IG/no3EbPOWDKjPZ4ilYJe5JJ2immlxPz+2e2EOCKpDI+7fzQcRz3PTd3BK+budZ8aXX8aW/lO"
    +            + "gKS8WmxZoKnOJBNWeTNWQFugmktXfdPHAdxMhjUXqeGQd8wTvZ4EzQNNafovwkI7IV/ZYoa++RGofVR3ZbRSiBNF6TDj/"
    +            + "qXFt0wN/CQnsGAmQAGNiN+D4mY7i25dtTu/Jc7OxLdhAUFpHyJpyrYWLfvOiS5WYBeEDHkiPUa/8eZSPA3MXWZR1RiuDv"
    +            + "uNqMjct1SSwdXADTtF68l/US1ksU657+XSC+6ly1A/upz+X71+C4Ho6W0751j5ZMT6xKjGh5pee7MVuduxIzXjWIy3YSd"
    +            + "0fIT3U0A5NLEvJ9rfkx6JiHjRLx6V1tqsrtT6BsGtmCQR1UCJPLqsKVDvAINx3cPA/CGqr5OX2BGZlAihGmN6n7gv8w4O"
    +            + "0k0LPTAe5YefgXN3m9pE867N31GtHVZaJ/UVgDNYS2jused4rw76ZWN41akx2QN0JSeMJqHXqVz6AKfz8ICS/dFnEGyBN"
    +            + "pXiMRxrY/QPKi/wONwqsbDxRW7vZRVKs78pBkE0ksaShlZk5GkeayDWC/7Hi/NqUFtIloK9XB3paLxo1DGu5qqaF34jZd"
    +            + "ktzkXp0uZqpp+FfKZaiovMjt8F7yHCPk+LYpRsU2Cyc9DVoDA6rIgf+uEP4jppgehsxyT0lJHax2t869R2jYdsXwYUXjg"
    +            + "wHIV0voj7bJYPGFlFjXOp6ZW86scsHM5xfsGQoK2Fp838VT34SHE1ZXU/puM7rviREHYW72pfpgGZUILQMohuTPnd8tFt"
    +            + "AkbrmjLDo+k9xx7HUvgoFTiNNWuq/cRjr70FKNguMMTIrid+HwfmbRoaxENWdLcOTNeascER2a+37UQolKD5ksrPJG6Rd"
    +            + "NA7O2pzp3micDYRs/+s28cCIxO//J/d4nsgHp6RTuCu4+Jm9k0YTw2Xg75b2cWKrxGnDUgyIlvNPaZTB5QbMid4x44/lE"
    +            + "0LLi9kcPQhRgrK07OnnrMgZvVGjt1CLGhKUv7KFc3xV1r1rwKkosxnoG99oCoTQtregcX5rIMjHgkc1IdflGJkZzaWMkY"
    +            + "VFOJ4Weynz008i4ddkske5vabZs37Lb8iggUYNBYZyGzalruBgnQyK4fz38Fae4nWYjyildVfgyo/fCePR2ovOfphx9OQ"
    +            + "Ji+M9BoFmPrAg+8ARDZ+R+5yzYuEc9ZoVX7nkp7LTGB3DANBgkrBgEEAYI3EQIxADATBgkqhkiG9w0BCRUxBgQEAQAAAD"
    +            + "BXBgkqhkiG9w0BCRQxSh5IAGEAOAAwAGQAZgBmADgANgAtAGUAOQA2AGUALQA0ADIAMgA0AC0AYQBhADEAMQAtAGIAZAA"
    +            + "xADkANABkADUAYQA2AGIANwA3MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAg"
    +            + "AEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggLPBgkqhkiG9w0BBwagggLAMIICvAIBA"
    +            + "DCCArUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECNX+VL2MxzzWAgIH0ICCAojmRBO+CPfVNUO0s+BVuwhOzikAGN"
    +            + "BmQHNChmJ/pyzPbMUbx7tO63eIVSc67iERda2WCEmVwPigaVQkPaumsfp8+L6iV/BMf5RKlyRXcwh0vUdu2Qa7qadD+gF"
    +            + "Q2kngf4Dk6vYo2/2HxayuIf6jpwe8vql4ca3ZtWXfuRix2fwgltM0bMz1g59d7x/glTfNqxNlsty0A/rWrPJjNbOPRU2X"
    +            + "ykLuc3AtlTtYsQ32Zsmu67A7UNBw6tVtkEXlFDqhavEhUEO3dvYqMY+QLxzpZhA0q44ZZ9/ex0X6QAFNK5wuWxCbupHWs"
    +            + "gxRwKftrxyszMHsAvNoNcTlqcctee+ecNwTJQa1/MDbnhO6/qHA7cfG1qYDq8Th635vGNMW1w3sVS7l0uEvdayAsBHWTc"
    +            + "OC2tlMa5bfHrhY8OEIqj5bN5H9RdFy8G/W239tjDu1OYjBDydiBqzBn8HG1DSj1Pjc0kd/82d4ZU0308KFTC3yGcRad0G"
    +            + "nEH0Oi3iEJ9HbriUbfVMbXNHOF+MktWiDVqzndGMKmuJSdfTBKvGFvejAWVO5E4mgLvoaMmbchc3BO7sLeraHnJN5hvMB"
    +            + "aLcQI38N86mUfTR8AP6AJ9c2k514KaDLclm4z6J8dMz60nUeo5D3YD09G6BavFHxSvJ8MF0Lu5zOFzEePDRFm9mH8W0N/"
    +            + "sFlIaYfD/GWU/w44mQucjaBk95YtqOGRIj58tGDWr8iUdHwaYKGqU24zGeRae9DhFXPzZshV1ZGsBQFRaoYkyLAwdJWIX"
    +            + "Ti+c37YaC8FRSEnnNmS79Dou1Kc3BvK4EYKAD2KxjtUebrV174gD0Q+9YuJ0GXOTspBvCFd5VT2Rw5zDNrA/J3F5fMCk4"
    +            + "wOzAfMAcGBSsOAwIaBBSxgh2xyF+88V4vAffBmZXv8Txt4AQU4O/NX4MjxSodbE7ApNAMIvrtREwCAgfQ";
    +}
    diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/KeyVaultCredentialPolicyTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/KeyVaultCredentialPolicyTest.java
    index ef5ce544bc3e..c5c9f209826a 100644
    --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/KeyVaultCredentialPolicyTest.java
    +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/KeyVaultCredentialPolicyTest.java
    @@ -98,7 +98,7 @@ public void setup() {
             this.unauthorizedHttpResponseWithoutHeader = unauthorizedResponseWithoutHeader;
             this.callContext = plainContext;
             this.differentScopeContext = differentScopeContext;
    -        this.credential = new BasicAuthenticationCredential("user", "pass");
    +        this.credential = new BasicAuthenticationCredential("user", "fakePasswordPlaceholder");
             this.testContext = testContext;
             this.bodyContext = bodyContext;
             this.bodyFluxContext = bodyFluxContext;
    diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyVaultCredentialPolicyTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyVaultCredentialPolicyTest.java
    index 14e5d2801ab8..4dd74d3a11a5 100644
    --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyVaultCredentialPolicyTest.java
    +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyVaultCredentialPolicyTest.java
    @@ -98,7 +98,7 @@ public void setup() {
             this.unauthorizedHttpResponseWithoutHeader = unauthorizedResponseWithoutHeader;
             this.callContext = plainContext;
             this.differentScopeContext = differentScopeContext;
    -        this.credential = new BasicAuthenticationCredential("user", "pass");
    +        this.credential = new BasicAuthenticationCredential("user", "fakePasswordPlaceholder");
             this.testContext = testContext;
             this.bodyContext = bodyContext;
             this.bodyFluxContext = bodyFluxContext;
    diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/HelloWorldAsync.java b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/HelloWorldAsync.java
    index dddf21106b3b..91a114dd8201 100644
    --- a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/HelloWorldAsync.java
    +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/HelloWorldAsync.java
    @@ -35,7 +35,7 @@ public static void main(String[] args) throws InterruptedException {
     
             // Let's create a secret holding bank account credentials valid for 1 year. If the secret already exists in the
             // key vault, then a new version of the secret is created.
    -        secretAsyncClient.setSecret(new KeyVaultSecret("BankAccountPassword", "f4G34fMh8v")
    +        secretAsyncClient.setSecret(new KeyVaultSecret("BankAccountPassword", "fakePasswordPlaceholder")
                 .setProperties(new SecretProperties()
                     .setExpiresOn(OffsetDateTime.now().plusYears(1))))
                 .subscribe(secretResponse ->
    @@ -70,7 +70,7 @@ public static void main(String[] args) throws InterruptedException {
             // Bank forced a password update for security purposes. Let's change the value of the secret in the key vault.
             // To achieve this, we need to create a new version of the secret in the key vault. The update operation cannot
             // change the value of the secret.
    -        secretAsyncClient.setSecret("BankAccountPassword", "bhjd4DDgsa")
    +        secretAsyncClient.setSecret("BankAccountPassword", "fakePasswordPlaceholder")
                 .subscribe(secretResponse ->
                     System.out.printf("Secret is created with name %s and value %s %n", secretResponse.getName(),
                         secretResponse.getValue()));
    diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/ListOperations.java b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/ListOperations.java
    index 18a0badf1d0c..832dc68f830d 100644
    --- a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/ListOperations.java
    +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/ListOperations.java
    @@ -36,11 +36,11 @@ public static void main(String[] args) throws IllegalArgumentException {
     
             // Let's create secrets holding storage and bank accounts credentials valid for 1 year. If the secret
             // already exists in the key vault, then a new version of the secret is created.
    -        client.setSecret(new KeyVaultSecret("StorageAccountPassword", "f4G34fMh8v-fdsgjsk2323=-asdsdfsdf")
    +        client.setSecret(new KeyVaultSecret("StorageAccountPassword", "fakePasswordPlaceholder")
                 .setProperties(new SecretProperties()
                     .setExpiresOn(OffsetDateTime.now().plusYears(1))));
     
    -        client.setSecret(new KeyVaultSecret("BankAccountPassword", "f4G34fMh8v")
    +        client.setSecret(new KeyVaultSecret("BankAccountPassword", "fakePasswordPlaceholder")
                 .setProperties(new SecretProperties()
                     .setExpiresOn(OffsetDateTime.now().plusYears(1))));
     
    @@ -56,7 +56,7 @@ public static void main(String[] args) throws IllegalArgumentException {
     
             // The bank account password got updated, so you want to update the secret in key vault to ensure it reflects the new password.
             // Calling setSecret on an existing secret creates a new version of the secret in the key vault with the new value.
    -        client.setSecret("BankAccountPassword", "sskdjfsdasdjsd");
    +        client.setSecret("BankAccountPassword", "fakePasswordPlaceholder");
     
             // You need to check all the different values your bank account password secret had previously. Lets print all the versions of this secret.
             for (SecretProperties secret : client.listPropertiesOfSecretVersions("BankAccountPassword")) {
    diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/KeyVaultCredentialPolicyTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/KeyVaultCredentialPolicyTest.java
    index 5496fe76db50..28902350e20d 100644
    --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/KeyVaultCredentialPolicyTest.java
    +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/KeyVaultCredentialPolicyTest.java
    @@ -98,7 +98,7 @@ public void setup() {
             this.unauthorizedHttpResponseWithoutHeader = unauthorizedResponseWithoutHeader;
             this.callContext = plainContext;
             this.differentScopeContext = differentScopeContext;
    -        this.credential = new BasicAuthenticationCredential("user", "pass");
    +        this.credential = new BasicAuthenticationCredential("user", "fakePasswordPlaceholder");
             this.testContext = testContext;
             this.bodyContext = bodyContext;
             this.bodyFluxContext = bodyFluxContext;
    diff --git a/sdk/keyvault/microsoft-azure-keyvault/src/test/java/com/microsoft/azure/keyvault/test/CertificateOperationsTest.java b/sdk/keyvault/microsoft-azure-keyvault/src/test/java/com/microsoft/azure/keyvault/test/CertificateOperationsTest.java
    index 9e60a49aab61..74035b6f50bf 100644
    --- a/sdk/keyvault/microsoft-azure-keyvault/src/test/java/com/microsoft/azure/keyvault/test/CertificateOperationsTest.java
    +++ b/sdk/keyvault/microsoft-azure-keyvault/src/test/java/com/microsoft/azure/keyvault/test/CertificateOperationsTest.java
    @@ -267,7 +267,7 @@ public void createCertificatePkcs12ForCertificateOperationsTest() throws Excepti
                         .withFirstName("John")
                         .withLastName("Doe")
                         .withEmailAddress("john.doe@contoso.com")
    -                    .withPhone("1234567890");
    +                    .withPhone("fakePhoneNumberPlaceholder");
     
             // Construct organization details
             List administratorsDetails = new ArrayList();
    @@ -370,7 +370,7 @@ public void createCertificatePemForCertificateOperationsTest() throws Exception
                         .withFirstName("John")
                         .withLastName("Doe")
                         .withEmailAddress("john.doe@contoso.com")
    -                    .withPhone("1234567890");
    +                    .withPhone("fakePhoneNumberPlaceholder");
     
             // Construct organization details
             OrganizationDetails organizationDetails = new OrganizationDetails();
    @@ -551,7 +551,7 @@ public void certificateAsyncRequestCancellationForCertificateOperationsTest() th
         @Test
         public void importCertificatePkcs12ForCertificateOperationsTest() throws Exception {
             String certificateContent = readCertificate("pkcs12_base64_testdata.cer");
    -        String certificatePassword = "123";
    +        String certificatePassword = "fakePasswordPlaceholder";
     
             // Set content type to indicate the certificate is PKCS12 format.
             SecretProperties secretProperties = new SecretProperties().withContentType(MIME_PKCS12);
    @@ -615,7 +615,7 @@ public void importCertificatePkcs12ForCertificateOperationsTest() throws Excepti
         @Test
         public void certificateUpdateForCertificateOperationsTest() throws Exception {
             String certificateContent = readCertificate("pkcs12_base64_testdata.cer");
    -        String certificatePassword = "123";
    +        String certificatePassword = "fakePasswordPlaceholder";
     
             // Set content type to indicate the certificate is PKCS12 format.
             SecretProperties secretProperties = new SecretProperties().withContentType(MIME_PKCS12);
    @@ -668,7 +668,7 @@ public void certificateUpdateForCertificateOperationsTest() throws Exception {
         public void listCertificatesForCertificateOperationsTest() throws Exception {
             String certificateName = "listCertificate";
             String certificateContent = readCertificate("pkcs12_base64_testdata.cer");
    -        String certificatePassword = "123";
    +        String certificatePassword = "fakePasswordPlaceholder";
     
             // Set content type to indicate the certificate is PKCS12 format.
             SecretProperties secretProperties = new SecretProperties();
    @@ -732,7 +732,7 @@ public void listCertificatesForCertificateOperationsTest() throws Exception {
         public void listCertificateVersionsForCertificateOperationsTest() throws Exception {
             String certificateName = "listCertificateVersions";
             String certificateContent = readCertificate("pkcs12_base64_testdata.cer");
    -        String certificatePassword = "123";
    +        String certificatePassword = "fakePasswordPlaceholder";
     
             // Set content type to indicate the certificate is PKCS12 format.
             SecretProperties secretProperties = new SecretProperties();
    @@ -794,7 +794,7 @@ public void issuerCrudOperationsForCertificateOperationsTest() throws Exception
                         .withFirstName("John")
                         .withLastName("Doe")
                         .withEmailAddress("john.doe@contoso.com")
    -                    .withPhone("1234567890");
    +                    .withPhone("fakePhoneNumberPlaceholder");
     
             // Construct organization details
             OrganizationDetails organizationDetails = new OrganizationDetails();
    diff --git a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePemForCertificateOperationsTest.json b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePemForCertificateOperationsTest.json
    index bd56d80d50cb..37177b3632a7 100644
    --- a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePemForCertificateOperationsTest.json
    +++ b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePemForCertificateOperationsTest.json
    @@ -51,7 +51,7 @@
           "cache-control" : "no-cache",
           "x-ms-keyvault-service-version" : "1.1.0.859",
           "x-ms-request-id" : "d63e94a9-1da6-40fa-b18c-69085c70c311",
    -      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/createCertificateJavaPemIssuer01\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"1234567890\"}]},\"attributes\":{\"enabled\":true,\"created\":1543865457,\"updated\":1547151181}}"
    +      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/createCertificateJavaPemIssuer01\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"fakePhoneNumberPlaceholder\"}]},\"attributes\":{\"enabled\":true,\"created\":1543865457,\"updated\":1547151181}}"
         }
       }, {
         "Method" : "POST",
    @@ -405,4 +405,4 @@
         }
       } ],
       "variables" : [ ]
    -}
    \ No newline at end of file
    +}
    diff --git a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePkcs12ForCertificateOperationsTest.json b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePkcs12ForCertificateOperationsTest.json
    index 5fb34f276956..9245647a72ed 100644
    --- a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePkcs12ForCertificateOperationsTest.json
    +++ b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/createCertificatePkcs12ForCertificateOperationsTest.json
    @@ -51,7 +51,7 @@
           "cache-control" : "no-cache",
           "x-ms-keyvault-service-version" : "1.1.0.859",
           "x-ms-request-id" : "94be14fa-6ea3-4cd6-804b-4e1529ed272c",
    -      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/createCertificateJavaPkcs12Issuer01\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"1234567890\"}]},\"attributes\":{\"enabled\":true,\"created\":1543865432,\"updated\":1547150927}}"
    +      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/createCertificateJavaPkcs12Issuer01\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"fakePhoneNumberPlaceholder\"}]},\"attributes\":{\"enabled\":true,\"created\":1543865432,\"updated\":1547150927}}"
         }
       }, {
         "Method" : "POST",
    @@ -378,4 +378,4 @@
         }
       } ],
       "variables" : [ ]
    -}
    \ No newline at end of file
    +}
    diff --git a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/issuerCrudOperationsForCertificateOperationsTest.json b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/issuerCrudOperationsForCertificateOperationsTest.json
    index 1dd16f4b41de..413ad344095d 100644
    --- a/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/issuerCrudOperationsForCertificateOperationsTest.json
    +++ b/sdk/keyvault/microsoft-azure-keyvault/src/test/resources/session-records/issuerCrudOperationsForCertificateOperationsTest.json
    @@ -51,7 +51,7 @@
           "cache-control" : "no-cache",
           "x-ms-keyvault-service-version" : "1.1.0.859",
           "x-ms-request-id" : "e7b0862c-6648-4cd0-b1ca-88c48013f551",
    -      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/issuer1\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"1234567890\"}]},\"attributes\":{\"enabled\":true,\"created\":1547150891,\"updated\":1547150891}}"
    +      "Body" : "{\"id\":\"https://azure-keyvault-3.vault.azure.net/certificates/issuers/issuer1\",\"provider\":\"Test\",\"credentials\":{\"account_id\":\"account1\"},\"org_details\":{\"zip\":0,\"admin_details\":[{\"first_name\":\"John\",\"last_name\":\"Doe\",\"email\":\"john.doe@contoso.com\",\"phone\":\"fakePhoneNumberPlaceholder\"}]},\"attributes\":{\"enabled\":true,\"created\":1547150891,\"updated\":1547150891}}"
         }
       }, {
         "Method" : "GET",
    @@ -163,4 +163,4 @@
         }
       } ],
       "variables" : [ ]
    -}
    \ No newline at end of file
    +}
    diff --git a/sdk/labservices/azure-resourcemanager-labservices/SAMPLE.md b/sdk/labservices/azure-resourcemanager-labservices/SAMPLE.md
    index 5b2130cb05e2..578b2b1e7296 100644
    --- a/sdk/labservices/azure-resourcemanager-labservices/SAMPLE.md
    +++ b/sdk/labservices/azure-resourcemanager-labservices/SAMPLE.md
    @@ -90,7 +90,7 @@ public final class ImagesCreateOrUpdateSamples {
             manager
                 .images()
                 .define("image1")
    -            .withExistingLabPlan("testrg123", "testlabplan")
    +            .withExistingLabPlan("fakeResourceGroupPlaceholder", "testlabplan")
                 .withEnabledState(EnableState.ENABLED)
                 .create();
         }
    @@ -113,7 +113,7 @@ public final class ImagesGetSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getImage(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.images().getWithResponse("testrg123", "testlabplan", "image1", Context.NONE);
    +        manager.images().getWithResponse("fakeResourceGroupPlaceholder", "testlabplan", "image1", Context.NONE);
         }
     }
     ```
    @@ -134,7 +134,7 @@ public final class ImagesListByLabPlanSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void listImages(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.images().listByLabPlan("testrg123", "testlabplan", null, Context.NONE);
    +        manager.images().listByLabPlan("fakeResourceGroupPlaceholder", "testlabplan", null, Context.NONE);
         }
     }
     ```
    @@ -158,7 +158,7 @@ public final class ImagesUpdateSamples {
          */
         public static void patchImage(com.azure.resourcemanager.labservices.LabServicesManager manager) {
             Image resource =
    -            manager.images().getWithResponse("testrg123", "testlabplan", "image1", Context.NONE).getValue();
    +            manager.images().getWithResponse("fakeResourceGroupPlaceholder", "testlabplan", "image1", Context.NONE).getValue();
             resource.update().withEnabledState(EnableState.ENABLED).apply();
         }
     }
    @@ -191,7 +191,7 @@ public final class LabPlansCreateOrUpdateSamples {
                 .labPlans()
                 .define("testlabplan")
                 .withRegion("westus")
    -            .withExistingResourceGroup("testrg123")
    +            .withExistingResourceGroup("fakeResourceGroupPlaceholder")
                 .withDefaultConnectionProfile(
                     new ConnectionProfile()
                         .withWebSshAccess(ConnectionType.NONE)
    @@ -209,9 +209,9 @@ public final class LabPlansCreateOrUpdateSamples {
                 .withDefaultNetworkProfile(
                     new LabPlanNetworkProfile()
                         .withSubnetId(
    -                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/testrg123/providers/Microsoft.Network/virtualNetworks/test-vnet/subnets/default"))
    +                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/fakeResourceGroupPlaceholder/providers/Microsoft.Network/virtualNetworks/test-vnet/subnets/default"))
                 .withSharedGalleryId(
    -                "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/testrg123/providers/Microsoft.Compute/galleries/testsig")
    +                "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/fakeResourceGroupPlaceholder/providers/Microsoft.Compute/galleries/testsig")
                 .withSupportInfo(
                     new SupportInfo()
                         .withUrl("help.contoso.com")
    @@ -239,7 +239,7 @@ public final class LabPlansDeleteSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void deleteLabPlan(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labPlans().delete("testrg123", "testlabplan", Context.NONE);
    +        manager.labPlans().delete("fakeResourceGroupPlaceholder", "testlabplan", Context.NONE);
         }
     }
     ```
    @@ -260,7 +260,7 @@ public final class LabPlansGetByResourceGroupSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getLabPlan(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labPlans().getByResourceGroupWithResponse("testrg123", "testlabplan", Context.NONE);
    +        manager.labPlans().getByResourceGroupWithResponse("fakeResourceGroupPlaceholder", "testlabplan", Context.NONE);
         }
     }
     ```
    @@ -302,7 +302,7 @@ public final class LabPlansListByResourceGroupSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void listResourceGroupLabPlans(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labPlans().listByResourceGroup("testrg123", Context.NONE);
    +        manager.labPlans().listByResourceGroup("fakeResourceGroupPlaceholder", Context.NONE);
         }
     }
     ```
    @@ -327,12 +327,12 @@ public final class LabPlansSaveImageSamples {
             manager
                 .labPlans()
                 .saveImage(
    -                "testrg123",
    +                "fakeResourceGroupPlaceholder",
                     "testlabplan",
                     new SaveImageBody()
                         .withName("Test Image")
                         .withLabVirtualMachineId(
    -                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/testrg123/providers/Microsoft.LabServices/labs/testlab/virtualMachines/template"),
    +                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/fakeResourceGroupPlaceholder/providers/Microsoft.LabServices/labs/testlab/virtualMachines/template"),
                     Context.NONE);
         }
     }
    @@ -358,7 +358,7 @@ public final class LabPlansUpdateSamples {
          */
         public static void patchLabPlan(com.azure.resourcemanager.labservices.LabServicesManager manager) {
             LabPlan resource =
    -            manager.labPlans().getByResourceGroupWithResponse("testrg123", "testlabplan", Context.NONE).getValue();
    +            manager.labPlans().getByResourceGroupWithResponse("fakeResourceGroupPlaceholder", "testlabplan", Context.NONE).getValue();
             resource
                 .update()
                 .withDefaultConnectionProfile(
    @@ -405,11 +405,11 @@ public final class LabsCreateOrUpdateSamples {
                 .labs()
                 .define("testlab")
                 .withRegion("westus")
    -            .withExistingResourceGroup("testrg123")
    +            .withExistingResourceGroup("fakeResourceGroupPlaceholder")
                 .withNetworkProfile(
                     new LabNetworkProfile()
                         .withSubnetId(
    -                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/testrg123/providers/Microsoft.Network/virtualNetworks/test-vnet/subnets/default"))
    +                        "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/fakeResourceGroupPlaceholder/providers/Microsoft.Network/virtualNetworks/test-vnet/subnets/default"))
                 .withAutoShutdownProfile(
                     new AutoShutdownProfile()
                         .withShutdownOnDisconnect(EnableState.ENABLED)
    @@ -441,7 +441,7 @@ public final class LabsCreateOrUpdateSamples {
                         .withAdminUser(new Credentials().withUsername("test-user")))
                 .withSecurityProfile(new SecurityProfile().withOpenAccess(EnableState.DISABLED))
                 .withLabPlanId(
    -                "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/testrg123/providers/Microsoft.LabServices/labPlans/testlabplan")
    +                "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/fakeResourceGroupPlaceholder/providers/Microsoft.LabServices/labPlans/testlabplan")
                 .withTitle("Test Lab")
                 .withDescription("This is a test lab.")
                 .create();
    @@ -465,7 +465,7 @@ public final class LabsDeleteSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void deleteLab(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labs().delete("testrg123", "testlab", Context.NONE);
    +        manager.labs().delete("fakeResourceGroupPlaceholder", "testlab", Context.NONE);
         }
     }
     ```
    @@ -486,7 +486,7 @@ public final class LabsGetByResourceGroupSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getLab(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labs().getByResourceGroupWithResponse("testrg123", "testlab", Context.NONE);
    +        manager.labs().getByResourceGroupWithResponse("fakeResourceGroupPlaceholder", "testlab", Context.NONE);
         }
     }
     ```
    @@ -528,7 +528,7 @@ public final class LabsListByResourceGroupSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void listResourceGroupLabs(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labs().listByResourceGroup("testrg123", Context.NONE);
    +        manager.labs().listByResourceGroup("fakeResourceGroupPlaceholder", Context.NONE);
         }
     }
     ```
    @@ -549,7 +549,7 @@ public final class LabsPublishSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void publishLab(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labs().publish("testrg123", "testlab", Context.NONE);
    +        manager.labs().publish("fakeResourceGroupPlaceholder", "testlab", Context.NONE);
         }
     }
     ```
    @@ -570,7 +570,7 @@ public final class LabsSyncGroupSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void syncLab(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.labs().syncGroup("testrg123", "testlab", Context.NONE);
    +        manager.labs().syncGroup("fakeResourceGroupPlaceholder", "testlab", Context.NONE);
         }
     }
     ```
    @@ -594,7 +594,7 @@ public final class LabsUpdateSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void patchLab(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        Lab resource = manager.labs().getByResourceGroupWithResponse("testrg123", "testlab", Context.NONE).getValue();
    +        Lab resource = manager.labs().getByResourceGroupWithResponse("fakeResourceGroupPlaceholder", "testlab", Context.NONE).getValue();
             resource.update().withSecurityProfile(new SecurityProfile().withOpenAccess(EnableState.ENABLED)).apply();
         }
     }
    @@ -663,7 +663,7 @@ public final class SchedulesCreateOrUpdateSamples {
             manager
                 .schedules()
                 .define("schedule1")
    -            .withExistingLab("testrg123", "testlab")
    +            .withExistingLab("fakeResourceGroupPlaceholder", "testlab")
                 .withStartAt(OffsetDateTime.parse("2020-05-26T12:00:00Z"))
                 .withStopAt(OffsetDateTime.parse("2020-05-26T18:00:00Z"))
                 .withRecurrencePattern(
    @@ -694,7 +694,7 @@ public final class SchedulesDeleteSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void deleteSchedule(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.schedules().delete("testrg123", "testlab", "schedule1", Context.NONE);
    +        manager.schedules().delete("fakeResourceGroupPlaceholder", "testlab", "schedule1", Context.NONE);
         }
     }
     ```
    @@ -715,7 +715,7 @@ public final class SchedulesGetSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getSchedule(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.schedules().getWithResponse("testrg123", "testlab", "schedule1", Context.NONE);
    +        manager.schedules().getWithResponse("fakeResourceGroupPlaceholder", "testlab", "schedule1", Context.NONE);
         }
     }
     ```
    @@ -736,7 +736,7 @@ public final class SchedulesListByLabSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getListSchedule(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.schedules().listByLab("testrg123", "testlab", null, Context.NONE);
    +        manager.schedules().listByLab("fakeResourceGroupPlaceholder", "testlab", null, Context.NONE);
         }
     }
     ```
    @@ -762,7 +762,7 @@ public final class SchedulesUpdateSamples {
          */
         public static void patchSchedule(com.azure.resourcemanager.labservices.LabServicesManager manager) {
             Schedule resource =
    -            manager.schedules().getWithResponse("testrg123", "testlab", "schedule1", Context.NONE).getValue();
    +            manager.schedules().getWithResponse("fakeResourceGroupPlaceholder", "testlab", "schedule1", Context.NONE).getValue();
             resource
                 .update()
                 .withRecurrencePattern(
    @@ -836,7 +836,7 @@ public final class UsersCreateOrUpdateSamples {
             manager
                 .users()
                 .define("testuser")
    -            .withExistingLab("testrg123", "testlab")
    +            .withExistingLab("fakeResourceGroupPlaceholder", "testlab")
                 .withEmail("testuser@contoso.com")
                 .withAdditionalUsageQuota(Duration.parse("PT10H"))
                 .create();
    @@ -860,7 +860,7 @@ public final class UsersDeleteSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void deleteUser(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.users().delete("testrg123", "testlab", "testuser", Context.NONE);
    +        manager.users().delete("fakeResourceGroupPlaceholder", "testlab", "testuser", Context.NONE);
         }
     }
     ```
    @@ -881,7 +881,7 @@ public final class UsersGetSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getUser(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.users().getWithResponse("testrg123", "testlab", "testuser", Context.NONE);
    +        manager.users().getWithResponse("fakeResourceGroupPlaceholder", "testlab", "testuser", Context.NONE);
         }
     }
     ```
    @@ -906,7 +906,7 @@ public final class UsersInviteSamples {
             manager
                 .users()
                 .invite(
    -                "testrg123",
    +                "fakeResourceGroupPlaceholder",
                     "testlab",
                     "testuser",
                     new InviteBody().withText("Invitation to lab testlab"),
    @@ -931,7 +931,7 @@ public final class UsersListByLabSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void listUser(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.users().listByLab("testrg123", "testlab", null, Context.NONE);
    +        manager.users().listByLab("fakeResourceGroupPlaceholder", "testlab", null, Context.NONE);
         }
     }
     ```
    @@ -954,7 +954,7 @@ public final class UsersUpdateSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void patchUser(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        User resource = manager.users().getWithResponse("testrg123", "testlab", "testuser", Context.NONE).getValue();
    +        User resource = manager.users().getWithResponse("fakeResourceGroupPlaceholder", "testlab", "testuser", Context.NONE).getValue();
             resource.update().withAdditionalUsageQuota(Duration.parse("PT10H")).apply();
         }
     }
    @@ -976,7 +976,7 @@ public final class VirtualMachinesGetSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void getVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().getWithResponse("testrg123", "testlab", "template", Context.NONE);
    +        manager.virtualMachines().getWithResponse("fakeResourceGroupPlaceholder", "testlab", "template", Context.NONE);
         }
     }
     ```
    @@ -997,7 +997,7 @@ public final class VirtualMachinesListByLabSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void listVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().listByLab("testrg123", "testlab", null, Context.NONE);
    +        manager.virtualMachines().listByLab("fakeResourceGroupPlaceholder", "testlab", null, Context.NONE);
         }
     }
     ```
    @@ -1018,7 +1018,7 @@ public final class VirtualMachinesRedeploySamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void redeployVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().redeploy("testrg123", "testlab", "template", Context.NONE);
    +        manager.virtualMachines().redeploy("fakeResourceGroupPlaceholder", "testlab", "template", Context.NONE);
         }
     }
     ```
    @@ -1039,7 +1039,7 @@ public final class VirtualMachinesReimageSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void reimageVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().reimage("testrg123", "testlab", "template", Context.NONE);
    +        manager.virtualMachines().reimage("fakeResourceGroupPlaceholder", "testlab", "template", Context.NONE);
         }
     }
     ```
    @@ -1064,7 +1064,7 @@ public final class VirtualMachinesResetPasswordSamples {
             manager
                 .virtualMachines()
                 .resetPassword(
    -                "testrg123",
    +                "fakeResourceGroupNamePlaceholder",
                     "testlab",
                     "template",
                     new ResetPasswordBody().withUsername("example-username").withPassword("example-password"),
    @@ -1089,7 +1089,7 @@ public final class VirtualMachinesStartSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void startVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().start("testrg123", "testlab", "template", Context.NONE);
    +        manager.virtualMachines().start("fakeResourceGroupPlaceholder", "testlab", "template", Context.NONE);
         }
     }
     ```
    @@ -1110,7 +1110,7 @@ public final class VirtualMachinesStopSamples {
          * @param manager Entry point to LabServicesManager.
          */
         public static void stopVirtualMachine(com.azure.resourcemanager.labservices.LabServicesManager manager) {
    -        manager.virtualMachines().stop("testrg123", "testlab", "template", Context.NONE);
    +        manager.virtualMachines().stop("fakeResourceGroupPlaceholder", "testlab", "template", Context.NONE);
         }
     }
     ```
    diff --git a/sdk/labservices/azure-resourcemanager-labservices/src/samples/java/com/azure/resourcemanager/labservices/generated/VirtualMachinesResetPasswordSamples.java b/sdk/labservices/azure-resourcemanager-labservices/src/samples/java/com/azure/resourcemanager/labservices/generated/VirtualMachinesResetPasswordSamples.java
    index 7a2ffa37833f..b4341a4a02d2 100644
    --- a/sdk/labservices/azure-resourcemanager-labservices/src/samples/java/com/azure/resourcemanager/labservices/generated/VirtualMachinesResetPasswordSamples.java
    +++ b/sdk/labservices/azure-resourcemanager-labservices/src/samples/java/com/azure/resourcemanager/labservices/generated/VirtualMachinesResetPasswordSamples.java
    @@ -21,7 +21,7 @@ public static void resetPasswordVirtualMachine(com.azure.resourcemanager.labserv
             manager
                 .virtualMachines()
                 .resetPassword(
    -                "testrg123",
    +                "fakeResourceGroupNamePlaceholder",
                     "testlab",
                     "template",
                     new ResetPasswordBody().withUsername("example-username").withPassword("example-password"),
    diff --git a/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/ElevationClientTestBase.java b/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/ElevationClientTestBase.java
    index 9f56d754fa79..b218cd451ec6 100644
    --- a/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/ElevationClientTestBase.java
    +++ b/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/ElevationClientTestBase.java
    @@ -28,7 +28,7 @@
     import com.azure.maps.elevation.models.ElevationResult;
     
     public class ElevationClientTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    diff --git a/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/TestUtils.java b/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/TestUtils.java
    index c697fe3439f3..f52ac4b772ef 100644
    --- a/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/TestUtils.java
    +++ b/sdk/maps/azure-maps-elevation/src/test/java/com/azure/maps/elevation/TestUtils.java
    @@ -22,7 +22,7 @@
     import org.junit.jupiter.params.provider.Arguments;
     
     public class TestUtils {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
         /**
    @@ -93,7 +93,7 @@ static ElevationResult getExpectedPostDataForPolyline() throws IOException {
             SerializerEncoding.JSON);
         }
     
    -    // Code referenced from 
    +    // Code referenced from
         // https://www.techiedelight.com/convert-inputstream-byte-array-java/#:~:text=Convert%20InputStream%20to%20byte%20array%20in%20Java%201,Commons%20IO%20...%204%204.%20Using%20sun.misc.IOUtils%20
         public static byte[] toByteArray(InputStream in) throws IOException {
             ByteArrayOutputStream os = new ByteArrayOutputStream();
    diff --git a/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/GeolocationClientTestBase.java b/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/GeolocationClientTestBase.java
    index 400d353dc197..1ead14e7eb3e 100644
    --- a/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/GeolocationClientTestBase.java
    +++ b/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/GeolocationClientTestBase.java
    @@ -28,7 +28,7 @@
     import com.azure.maps.geolocation.models.IpAddressToLocationResult;
     
     public class GeolocationClientTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    diff --git a/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/TestUtils.java b/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/TestUtils.java
    index a45bf2bdae1b..562d0731bef0 100644
    --- a/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/TestUtils.java
    +++ b/sdk/maps/azure-maps-geolocation/src/test/java/com/azure/maps/geolocation/TestUtils.java
    @@ -22,7 +22,7 @@
     import org.junit.jupiter.params.provider.Arguments;
     
     public class TestUtils {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
         /**
    @@ -53,7 +53,7 @@ static IpAddressToLocationResult getExpectedLocation() throws IOException {
             SerializerEncoding.JSON);
         }
     
    -    // Code referenced from 
    +    // Code referenced from
         // https://www.techiedelight.com/convert-inputstream-byte-array-java/#:~:text=Convert%20InputStream%20to%20byte%20array%20in%20Java%201,Commons%20IO%20...%204%204.%20Using%20sun.misc.IOUtils%20
         public static byte[] toByteArray(InputStream in) throws IOException {
             ByteArrayOutputStream os = new ByteArrayOutputStream();
    diff --git a/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/MapsRenderClientTestBase.java b/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/MapsRenderClientTestBase.java
    index 7462e9a2f089..76728be3c696 100644
    --- a/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/MapsRenderClientTestBase.java
    +++ b/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/MapsRenderClientTestBase.java
    @@ -34,7 +34,7 @@
     import com.azure.maps.render.models.MapTileset;
     
     public class MapsRenderClientTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    diff --git a/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/TestUtils.java b/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/TestUtils.java
    index 046fc2be4d37..01496eadbbc5 100644
    --- a/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/TestUtils.java
    +++ b/sdk/maps/azure-maps-render/src/test/java/com/azure/maps/render/TestUtils.java
    @@ -27,7 +27,6 @@
     import org.junit.jupiter.params.provider.Arguments;
     
     public class TestUtils {
    -    static final String FAKE_API_KEY = "1234567890";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
         static MapTileset getExpectedMapTileset() throws IOException {
    @@ -46,7 +45,7 @@ static MapAttribution getExpectedMapAttribution() throws IOException {
             JsonSerializer jsonProvider = JsonSerializerProviders.createInstance(true);
             is.close();
             return jsonProvider.deserializeFromBytes(data, TypeReference.createInstance(MapAttribution.class));
    -       
    +
         }
     
         static CopyrightCaption getExpectedCopyrightCaption() throws IOException {
    diff --git a/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/MapsRouteTestBase.java b/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/MapsRouteTestBase.java
    index fbff8db5e824..3bf398700be4 100644
    --- a/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/MapsRouteTestBase.java
    +++ b/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/MapsRouteTestBase.java
    @@ -35,7 +35,7 @@
     import com.azure.maps.route.models.RouteRangeResult;
     
     public class MapsRouteTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    diff --git a/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/TestUtils.java b/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/TestUtils.java
    index 870b94ead893..883170579df0 100644
    --- a/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/TestUtils.java
    +++ b/sdk/maps/azure-maps-route/src/test/java/com/azure/maps/route/TestUtils.java
    @@ -25,7 +25,7 @@
     import org.junit.jupiter.params.provider.Arguments;
     
     public class TestUtils {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
         /**
    diff --git a/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/MapsSearchClientTestBase.java b/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/MapsSearchClientTestBase.java
    index 86697d04013c..64224d0ae6e9 100644
    --- a/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/MapsSearchClientTestBase.java
    +++ b/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/MapsSearchClientTestBase.java
    @@ -39,7 +39,7 @@
     import com.azure.maps.search.models.SearchAddressResultItem;
     
     public class MapsSearchClientTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    diff --git a/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/TestUtils.java b/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/TestUtils.java
    index 3846299d5fcc..bd66c0fbe21b 100644
    --- a/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/TestUtils.java
    +++ b/sdk/maps/azure-maps-search/src/test/java/com/azure/maps/search/TestUtils.java
    @@ -39,10 +39,10 @@
     
     public class TestUtils {
     
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
    -    static MapsPolygon getPolygon(InputStream is) throws IOException { 
    +    static MapsPolygon getPolygon(InputStream is) throws IOException {
             JsonSerializer serializer = JsonSerializerProviders.createInstance(true);
             TypeReference interimType = new TypeReference() { };
             byte[] data = null;
    diff --git a/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TestUtils.java b/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TestUtils.java
    index afb8abf039a9..b194a72eef4a 100644
    --- a/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TestUtils.java
    +++ b/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TestUtils.java
    @@ -30,7 +30,7 @@
     import org.junit.jupiter.params.provider.Arguments;
     
     public class TestUtils {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
         public static final Duration DEFAULT_POLL_INTERVAL = Duration.ofSeconds(30);
     
         /**
    @@ -70,7 +70,7 @@ static TimeZoneResult getExpectedTimezoneByCoordinates() throws IOException {
             return jacksonAdapter.deserialize(data, interimType.getJavaType(),
             SerializerEncoding.JSON);
         }
    -    
    +
         static List getExpectedWindowsTimezoneIds() throws IOException {
             InputStream is = ClassLoader.getSystemResourceAsStream("getwindowstimezonesids.json");
             String jsonArrayString = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n"));
    @@ -123,7 +123,7 @@ static List getExpectedConvertWindowsTimezoneToIana() throws IOException
             return expectedResult;
         }
     
    -    // Code referenced from 
    +    // Code referenced from
         // https://www.techiedelight.com/convert-inputstream-byte-array-java/#:~:text=Convert%20InputStream%20to%20byte%20array%20in%20Java%201,Commons%20IO%20...%204%204.%20Using%20sun.misc.IOUtils%20
         public static byte[] toByteArray(InputStream in) throws IOException {
             ByteArrayOutputStream os = new ByteArrayOutputStream();
    diff --git a/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TimeZoneClientTestBase.java b/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TimeZoneClientTestBase.java
    index 987f9e534b24..f9579b17f1ce 100644
    --- a/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TimeZoneClientTestBase.java
    +++ b/sdk/maps/azure-maps-timezone/src/test/java/com/azure/maps/timezone/TimeZoneClientTestBase.java
    @@ -31,7 +31,7 @@
     import com.azure.maps.timezone.models.TimeZoneWindows;
     
     public class TimeZoneClientTestBase extends TestBase {
    -    static final String FAKE_API_KEY = "1234567890";
    +    static final String FAKE_API_KEY = "fakeKeyPlaceholder";
     
         private final String endpoint = Configuration.getGlobalConfiguration().get("API-LEARN_ENDPOINT");
         Duration durationTestMode;
    @@ -87,7 +87,7 @@ HttpPipeline getHttpPipeline(HttpClient httpClient) {
                 .policies(policies.toArray(new HttpPipelinePolicy[0]))
                 .httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient)
                 .build();
    -        
    +
             return pipeline;
         }
     
    diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/CHANGELOG.md b/sdk/metricsadvisor/azure-ai-metricsadvisor/CHANGELOG.md
    index d866c2bca1ba..b5b5c45b45fc 100644
    --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/CHANGELOG.md
    +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/CHANGELOG.md
    @@ -1,5 +1,15 @@
     # Release History
     
    +## 1.2.0-beta.1 (Unreleased)
    +
    +### Features Added
    +
    +### Breaking Changes
    +
    +### Bugs Fixed
    +
    +### Other Changes
    +
     ## 1.1.8 (2022-10-12)
     
     ### Other Changes
    @@ -172,7 +182,7 @@ For more information about this, and preview releases of other Azure SDK librari
     https://azure.github.io/azure-sdk/releases/latest/java.html.
     
     - Two client design:
    -    - `MetricsAdvisorAdministrationClient` to perform creation, updation and deletion of Metrics Advisor resources.
    +    - `MetricsAdvisorAdministrationClient` to perform creation, update and deletion of Metrics Advisor resources.
         - `MetricsAdvisorClient` helps with querying API's to helps with listing incidents, listing root causes of incidents
         and adding feedback to tune your model.
     - Authentication with API key supported using `MetricsAdvisorKeyCredential("", "")`.
    diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClient.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClient.java
    index 3c58583e2847..f2190c75bd72 100644
    --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClient.java
    +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClient.java
    @@ -97,7 +97,7 @@ public final class MetricsAdvisorAdministrationAsyncClient {
         /**
          * Create a {@link MetricsAdvisorAdministrationAsyncClient} that sends requests to the Metrics Advisor
          * service's endpoint. Each service call goes through the
    -     * {@link MetricsAdvisorAdministrationClientBuilder#pipeline(HttpPipeline)} http pipeline}.
    +     * {@link MetricsAdvisorAdministrationClientBuilder#pipeline(HttpPipeline)} http pipeline.
          *
          * @param service The proxy service used to perform REST calls.
          * @param serviceVersion The versions of Azure Metrics Advisor supported by this client library.
    @@ -764,7 +764,7 @@ private Mono> listDataFeedIngestionStatus
         /**
          * Refresh data ingestion for a period.
          * 

    - * The data in the data source for the given period will be reingested + * The data in the data source for the given period will be re-ingested * and any ingested data for the same period will be overwritten. *

    * @@ -801,7 +801,7 @@ public Mono refreshDataFeedIngestion( /** * Refresh data ingestion for a period. *

    - * The data in the data source for the given period will be reingested + * The data in the data source for the given period will be re-ingested * and any ingested data for the same period will be overwritten. *

    * @@ -2579,13 +2579,14 @@ public Mono updateAlertConfig( * }).subscribe(alertConfigurationResponse -> { * System.out.printf("Update anomaly alert operation status: %s%n", * alertConfigurationResponse.getStatusCode()); - * final AnomalyAlertConfiguration updatAnomalyAlertConfiguration = alertConfigurationResponse.getValue(); + * final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration + * = alertConfigurationResponse.getValue(); * System.out.printf("Updated anomaly alert configuration Id: %s%n", - * updatAnomalyAlertConfiguration.getId()); + * updatedAnomalyAlertConfiguration.getId()); * System.out.printf("Updated anomaly alert configuration description: %s%n", - * updatAnomalyAlertConfiguration.getDescription()); + * updatedAnomalyAlertConfiguration.getDescription()); * System.out.printf("Updated anomaly alert configuration hook ids: %s%n", - * updatAnomalyAlertConfiguration.getHookIdsToAlert()); + * updatedAnomalyAlertConfiguration.getHookIdsToAlert()); * }); *
    * @@ -2798,11 +2799,11 @@ private Mono> listAnomalyAlertConfigsNe * final String name = "sample_name" + UUID.randomUUID(); * final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; * final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - * final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + * final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; * * datasourceCredential = new DataSourceServicePrincipalInKeyVault() * .setName(name) - * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) * .setTenantId(tId) * .setSecretNameForDataSourceClientId("DSClientID_1") * .setSecretNameForDataSourceClientSecret("DSClientSer_1"); @@ -2847,11 +2848,11 @@ public Mono createDataSourceCredential( * final String name = "sample_name" + UUID.randomUUID(); * final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; * final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - * final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + * final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; * * datasourceCredential = new DataSourceServicePrincipalInKeyVault() * .setName(name) - * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) * .setTenantId(tId) * .setSecretNameForDataSourceClientId("DSClientID_1") * .setSecretNameForDataSourceClientSecret("DSClientSer_1"); diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClient.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClient.java index f593502e7205..eef93c8c8839 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClient.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClient.java @@ -443,7 +443,7 @@ public PagedIterable listDataFeedIngestionStatus( /** * Refresh data ingestion for a period. *

    - * The data in the data source for the given period will be reingested + * The data in the data source for the given period will be re-ingested * and any ingested data for the same period will be overwritten. *

    * @@ -476,7 +476,7 @@ public void refreshDataFeedIngestion( /** * Refresh data ingestion for a period. *

    - * The data in the data source for the given period will be reingested + * The data in the data source for the given period will be re-ingested * and any ingested data for the same period will be overwritten. *

    * @@ -1831,18 +1831,18 @@ public Response getAlertConfigWithResponse( * = metricsAdvisorAdminClient.getAlertConfig(alertConfigId); * List<String> hookIds = new ArrayList<>(existingAnomalyConfig.getHookIdsToAlert()); * hookIds.add(additionalHookId); - * final AnomalyAlertConfiguration updatAnomalyAlertConfiguration + * final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration * = metricsAdvisorAdminClient.updateAlertConfig( * existingAnomalyConfig * .setHookIdsToAlert(hookIds) * .setDescription("updated to add more hook ids") * ); * - * System.out.printf("Updated anomaly alert configuration Id: %s%n", updatAnomalyAlertConfiguration.getId()); + * System.out.printf("Updated anomaly alert configuration Id: %s%n", updatedAnomalyAlertConfiguration.getId()); * System.out.printf("Updated anomaly alert configuration description: %s%n", - * updatAnomalyAlertConfiguration.getDescription()); + * updatedAnomalyAlertConfiguration.getDescription()); * System.out.printf("Updated anomaly alert configuration hook ids: %s%n", - * updatAnomalyAlertConfiguration.getHookIdsToAlert()); + * updatedAnomalyAlertConfiguration.getHookIdsToAlert()); *
    * * @@ -1864,7 +1864,7 @@ public AnomalyAlertConfiguration updateAlertConfig( * Update anomaly alert configuration. * *

    Code sample

    - * + * *
          *
          * String alertConfigId = "1p0f8er30-6e6e-4391-b78f-bpfdfee1e6f5";
    @@ -1881,12 +1881,12 @@ public AnomalyAlertConfiguration updateAlertConfig(
          *         .setDescription("updated to add more hook ids"), Context.NONE);
          *
          * System.out.printf("Update anomaly alert operation status: %s%n", alertConfigurationResponse.getStatusCode());
    -     * final AnomalyAlertConfiguration updatAnomalyAlertConfiguration = alertConfigurationResponse.getValue();
    -     * System.out.printf("Updated anomaly alert configuration Id: %s%n", updatAnomalyAlertConfiguration.getId());
    +     * final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration = alertConfigurationResponse.getValue();
    +     * System.out.printf("Updated anomaly alert configuration Id: %s%n", updatedAnomalyAlertConfiguration.getId());
          * System.out.printf("Updated anomaly alert configuration description: %s%n",
    -     *     updatAnomalyAlertConfiguration.getDescription());
    +     *     updatedAnomalyAlertConfiguration.getDescription());
          * System.out.printf("Updated anomaly alert configuration hook ids: %sf%n",
    -     *     updatAnomalyAlertConfiguration.getHookIdsToAlert());
    +     *     updatedAnomalyAlertConfiguration.getHookIdsToAlert());
          * 
    * * @@ -2038,11 +2038,11 @@ public PagedIterable listAlertConfigs( * final String name = "sample_name" + UUID.randomUUID(); * final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; * final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - * final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + * final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; * * datasourceCredential = new DataSourceServicePrincipalInKeyVault() * .setName(name) - * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) * .setTenantId(tId) * .setSecretNameForDataSourceClientId("DSClientID_1") * .setSecretNameForDataSourceClientSecret("DSClientSer_1"); @@ -2084,11 +2084,11 @@ public DataSourceCredentialEntity createDataSourceCredential(DataSourceCredentia * final String name = "sample_name" + UUID.randomUUID(); * final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; * final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - * final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + * final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; * * datasourceCredential = new DataSourceServicePrincipalInKeyVault() * .setName(name) - * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + * .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) * .setTenantId(tId) * .setSecretNameForDataSourceClientId("DSClientID_1") * .setSecretNameForDataSourceClientSecret("DSClientSer_1"); diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/AnomalySeverity.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/AnomalySeverity.java index 2b061067e0ce..d49ed2e60bde 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/AnomalySeverity.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/AnomalySeverity.java @@ -16,7 +16,7 @@ public final class AnomalySeverity extends ExpandableStringEnum /** Static value Medium for AnomalySeverity. */ public static final AnomalySeverity MEDIUM = fromString("Medium"); - /** Static value High for AnomalySeveDrity. */ + /** Static value High for AnomalySeverity. */ public static final AnomalySeverity HIGH = fromString("High"); /** diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/DataSourceServicePrincipal.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/DataSourceServicePrincipal.java index cb2139eb46c5..18a4dc0ed3d5 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/DataSourceServicePrincipal.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/main/java/com/azure/ai/metricsadvisor/administration/models/DataSourceServicePrincipal.java @@ -118,7 +118,7 @@ public DataSourceServicePrincipal setClientSecret(String clientSecret) { * Sets the tenant id. * * @param tenantId The tenant id - * @return an updated object with client teant id set + * @return an updated object with client tenant id set */ public DataSourceServicePrincipal setTenantId(String tenantId) { this.tenantId = tenantId; diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DataFeedIngestionAsyncSample.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DataFeedIngestionAsyncSample.java index e33e8702eb51..c6d23ba27a09 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DataFeedIngestionAsyncSample.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DataFeedIngestionAsyncSample.java @@ -57,7 +57,7 @@ public static void main(String[] args) { .block(); /* - Each of the above sample a varient of block() operator which will block + Each of the above sample a variant of block() operator which will block until the operation is completed. This is strongly discouraged for use in production as it eliminates the benefits of asynchronous IO. It is used here to ensure the sample runs to completion. diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialAsyncSample.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialAsyncSample.java index ff2531943ce2..d9ce5b06fac5 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialAsyncSample.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialAsyncSample.java @@ -27,11 +27,11 @@ public static void main(String[] args) { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; DataSourceCredentialEntity datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); @@ -74,7 +74,7 @@ public static void main(String[] args) { }); // Update the datasource credential entity. - Mono updateDatasourcCredMono = fetchDataFeedMono + Mono updateDatasourceCredMono = fetchDataFeedMono .flatMap(datasourceCredEntity -> { DataSourceServicePrincipalInKeyVault actualCredentialSPInKV = null; if (datasourceCredEntity instanceof DataSourceServicePrincipalInKeyVault) { @@ -95,7 +95,7 @@ public static void main(String[] args) { }); // Delete the datasource credential entity. - Mono deleteDatasourceCredMono = updateDatasourcCredMono.flatMap(datasourceCredEntity -> { + Mono deleteDatasourceCredMono = updateDatasourceCredMono.flatMap(datasourceCredEntity -> { return advisorAdministrationAsyncClient.deleteDataSourceCredential(datasourceCredEntity.getId()) .doOnSubscribe(__ -> System.out.printf("Deleting datasource credential entity: %s%n", datasourceCredEntity.getId())) diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialSample.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialSample.java index 291e3ac4be41..4895389d21b4 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialSample.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/DatasourceCredentialSample.java @@ -26,11 +26,11 @@ public static void main(String[] args) { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; DataSourceCredentialEntity datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClientJavaDocCodeSnippets.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClientJavaDocCodeSnippets.java index 20a4c4adbe98..6d1189be9db6 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClientJavaDocCodeSnippets.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationAsyncClientJavaDocCodeSnippets.java @@ -1359,13 +1359,14 @@ public void updateAnomalyAlertConfigurationWithResponse() { }).subscribe(alertConfigurationResponse -> { System.out.printf("Update anomaly alert operation status: %s%n", alertConfigurationResponse.getStatusCode()); - final AnomalyAlertConfiguration updatAnomalyAlertConfiguration = alertConfigurationResponse.getValue(); + final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration + = alertConfigurationResponse.getValue(); System.out.printf("Updated anomaly alert configuration Id: %s%n", - updatAnomalyAlertConfiguration.getId()); + updatedAnomalyAlertConfiguration.getId()); System.out.printf("Updated anomaly alert configuration description: %s%n", - updatAnomalyAlertConfiguration.getDescription()); + updatedAnomalyAlertConfiguration.getDescription()); System.out.printf("Updated anomaly alert configuration hook ids: %s%n", - updatAnomalyAlertConfiguration.getHookIdsToAlert()); + updatedAnomalyAlertConfiguration.getHookIdsToAlert()); }); // END: com.azure.ai.metricsadvisor.administration.MetricsAdvisorAdministrationAsyncClient.updateAlertConfigWithResponse#AnomalyAlertConfiguration } @@ -1423,11 +1424,11 @@ public void createDatasourceCredential() { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); @@ -1460,11 +1461,11 @@ public void createDatasourceCredentialWithResponse() { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClientJavaDocCodeSnippets.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClientJavaDocCodeSnippets.java index cac4b8850e27..292bb1260154 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClientJavaDocCodeSnippets.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/java/com/azure/ai/metricsadvisor/administration/MetricsAdvisorAdministrationClientJavaDocCodeSnippets.java @@ -1335,18 +1335,18 @@ public void updateAnomalyAlertConfiguration() { = metricsAdvisorAdminClient.getAlertConfig(alertConfigId); List hookIds = new ArrayList<>(existingAnomalyConfig.getHookIdsToAlert()); hookIds.add(additionalHookId); - final AnomalyAlertConfiguration updatAnomalyAlertConfiguration + final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration = metricsAdvisorAdminClient.updateAlertConfig( existingAnomalyConfig .setHookIdsToAlert(hookIds) .setDescription("updated to add more hook ids") ); - System.out.printf("Updated anomaly alert configuration Id: %s%n", updatAnomalyAlertConfiguration.getId()); + System.out.printf("Updated anomaly alert configuration Id: %s%n", updatedAnomalyAlertConfiguration.getId()); System.out.printf("Updated anomaly alert configuration description: %s%n", - updatAnomalyAlertConfiguration.getDescription()); + updatedAnomalyAlertConfiguration.getDescription()); System.out.printf("Updated anomaly alert configuration hook ids: %s%n", - updatAnomalyAlertConfiguration.getHookIdsToAlert()); + updatedAnomalyAlertConfiguration.getHookIdsToAlert()); // END: com.azure.ai.metricsadvisor.administration.MetricsAdvisorAdministrationClient.updateAlertConfig#AnomalyAlertConfiguration } @@ -1370,12 +1370,12 @@ public void updateAnomalyAlertConfigurationWithResponse() { .setDescription("updated to add more hook ids"), Context.NONE); System.out.printf("Update anomaly alert operation status: %s%n", alertConfigurationResponse.getStatusCode()); - final AnomalyAlertConfiguration updatAnomalyAlertConfiguration = alertConfigurationResponse.getValue(); - System.out.printf("Updated anomaly alert configuration Id: %s%n", updatAnomalyAlertConfiguration.getId()); + final AnomalyAlertConfiguration updatedAnomalyAlertConfiguration = alertConfigurationResponse.getValue(); + System.out.printf("Updated anomaly alert configuration Id: %s%n", updatedAnomalyAlertConfiguration.getId()); System.out.printf("Updated anomaly alert configuration description: %s%n", - updatAnomalyAlertConfiguration.getDescription()); + updatedAnomalyAlertConfiguration.getDescription()); System.out.printf("Updated anomaly alert configuration hook ids: %sf%n", - updatAnomalyAlertConfiguration.getHookIdsToAlert()); + updatedAnomalyAlertConfiguration.getHookIdsToAlert()); // END: com.azure.ai.metricsadvisor.administration.MetricsAdvisorAdministrationClient.updateAlertConfigWithResponse#AnomalyAlertConfiguration-Context } @@ -1450,11 +1450,11 @@ public void createDatasourceCredential() { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); @@ -1486,11 +1486,11 @@ public void createDatasourceCredentialWithResponse() { final String name = "sample_name" + UUID.randomUUID(); final String cId = "f45668b2-bffa-11eb-8529-0246ac130003"; final String tId = "67890ded-5e07-4e52-b225-4ae8f905afb5"; - final String mockSecr = "890hy69-5e07-4e52-b225-4ae8f905afb5"; + final String mockSecret = "890hy69-5e07-4e52-b225-4ae8f905afb5"; datasourceCredential = new DataSourceServicePrincipalInKeyVault() .setName(name) - .setKeyVaultForDataSourceSecrets("kv", cId, mockSecr) + .setKeyVaultForDataSourceSecrets("kv", cId, mockSecret) .setTenantId(tId) .setSecretNameForDataSourceClientId("DSClientID_1") .setSecretNameForDataSourceClientSecret("DSClientSer_1"); diff --git a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/NotificationHookTestBase.java b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/NotificationHookTestBase.java index 5c6cf5715c27..88654cef380a 100644 --- a/sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/NotificationHookTestBase.java +++ b/sdk/metricsadvisor/azure-ai-metricsadvisor/src/test/java/com/azure/ai/metricsadvisor/NotificationHookTestBase.java @@ -65,15 +65,15 @@ protected static class CreateWebHookInput { String endpoint = "https://httpbin.org/post"; String description = "alert_us!"; String externalLink = "https://github.com/Azure/azure-sdk-for-java/wiki"; - String userName = "test"; - String password = "testpwd!@#"; + String username = "username"; + String fakePasswordPlaceholder = "fakePasswordPlaceholder"; HttpHeaders httpHeaders = new HttpHeaders() .put("x-contoso-id", "123") .put("x-contoso-name", "contoso"); WebNotificationHook hook = new WebNotificationHook(name, endpoint) .setDescription(description) .setExternalLink(externalLink) - .setUserCredentials(userName, password) + .setUserCredentials(username, fakePasswordPlaceholder) .setHttpHeaders(httpHeaders); } diff --git a/sdk/monitor/azure-monitor-ingestion/README.md b/sdk/monitor/azure-monitor-ingestion/README.md index 5a85ca249561..474954e505c7 100644 --- a/sdk/monitor/azure-monitor-ingestion/README.md +++ b/sdk/monitor/azure-monitor-ingestion/README.md @@ -97,6 +97,11 @@ workspace. The target table must exist before you can send data to it. The follo - [Syslog](https://docs.microsoft.com/azure/azure-monitor/reference/tables/syslog) - [WindowsEvents](https://docs.microsoft.com/azure/azure-monitor/reference/tables/windowsevent) +### Logs retrieval +The logs that were uploaded using this library can be queried using the +[Azure Monitor Query](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/monitor/azure-monitor-query#readme) +client library. + ## Examples - [Upload custom logs](#upload-custom-logs) @@ -139,6 +144,18 @@ UploadLogsResult result = client.upload("", " * * - * @param dataCollectionRuleId the data collection rule id that is configured to collect and transform the logs. + * @param ruleId the data collection rule id that is configured to collect and transform the logs. * @param streamName the stream name configured in data collection rule that matches defines the structure of the * logs sent in this request. * @param logs the collection of logs to be uploaded. * @return the result of the logs upload request. - * @throws NullPointerException if any of {@code dataCollectionRuleId}, {@code streamName} or {@code logs} are null. + * @throws NullPointerException if any of {@code ruleId}, {@code streamName} or {@code logs} are null. * @throws IllegalArgumentException if {@code logs} is empty. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Mono upload(String dataCollectionRuleId, String streamName, List logs) { - return upload(dataCollectionRuleId, streamName, logs, new UploadLogsOptions()); + public Mono upload(String ruleId, String streamName, List logs) { + return upload(ruleId, streamName, logs, new UploadLogsOptions()); } /** @@ -116,19 +116,19 @@ public Mono upload(String dataCollectionRuleId, String streamN * * * - * @param dataCollectionRuleId the data collection rule id that is configured to collect and transform the logs. + * @param ruleId the data collection rule id that is configured to collect and transform the logs. * @param streamName the stream name configured in data collection rule that matches defines the structure of the * logs sent in this request. * @param logs the collection of logs to be uploaded. * @param options the options to configure the upload request. * @return the result of the logs upload request. - * @throws NullPointerException if any of {@code dataCollectionRuleId}, {@code streamName} or {@code logs} are null. + * @throws NullPointerException if any of {@code ruleId}, {@code streamName} or {@code logs} are null. * @throws IllegalArgumentException if {@code logs} is empty. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Mono upload(String dataCollectionRuleId, String streamName, + public Mono upload(String ruleId, String streamName, List logs, UploadLogsOptions options) { - return withContext(context -> upload(dataCollectionRuleId, streamName, logs, options, context)); + return withContext(context -> upload(ruleId, streamName, logs, options, context)); } /** @@ -151,7 +151,7 @@ public Mono upload(String dataCollectionRuleId, String streamN * ] * } * - * @param dataCollectionRuleId The immutable Id of the Data Collection Rule resource. + * @param ruleId The immutable Id of the Data Collection Rule resource. * @param streamName The streamDeclaration name as defined in the Data Collection Rule. * @param logs An array of objects matching the schema defined by the provided stream. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. @@ -163,10 +163,10 @@ public Mono upload(String dataCollectionRuleId, String streamN */ @ServiceMethod(returns = ReturnType.SINGLE) public Mono> uploadWithResponse( - String dataCollectionRuleId, String streamName, BinaryData logs, RequestOptions requestOptions) { - Objects.requireNonNull(dataCollectionRuleId, "'dataCollectionRuleId' cannot be null."); - Objects.requireNonNull(dataCollectionRuleId, "'streamName' cannot be null."); - Objects.requireNonNull(dataCollectionRuleId, "'logs' cannot be null."); + String ruleId, String streamName, BinaryData logs, RequestOptions requestOptions) { + Objects.requireNonNull(ruleId, "'ruleId' cannot be null."); + Objects.requireNonNull(streamName, "'streamName' cannot be null."); + Objects.requireNonNull(logs, "'logs' cannot be null."); if (requestOptions == null) { requestOptions = new RequestOptions(); @@ -179,20 +179,20 @@ public Mono> uploadWithResponse( request.setHeader(CONTENT_ENCODING, GZIP); } }); - return service.uploadWithResponse(dataCollectionRuleId, streamName, logs, requestOptions); + return service.uploadWithResponse(ruleId, streamName, logs, requestOptions); } - Mono upload(String dataCollectionRuleId, String streamName, + Mono upload(String ruleId, String streamName, List logs, UploadLogsOptions options, Context context) { - return Mono.defer(() -> splitAndUpload(dataCollectionRuleId, streamName, logs, options, context)); + return Mono.defer(() -> splitAndUpload(ruleId, streamName, logs, options, context)); } - private Mono splitAndUpload(String dataCollectionRuleId, String streamName, List logs, UploadLogsOptions options, Context context) { + private Mono splitAndUpload(String ruleId, String streamName, List logs, UploadLogsOptions options, Context context) { try { - Objects.requireNonNull(dataCollectionRuleId, "'dataCollectionRuleId' cannot be null."); - Objects.requireNonNull(dataCollectionRuleId, "'streamName' cannot be null."); - Objects.requireNonNull(dataCollectionRuleId, "'logs' cannot be null."); + Objects.requireNonNull(ruleId, "'ruleId' cannot be null."); + Objects.requireNonNull(streamName, "'streamName' cannot be null."); + Objects.requireNonNull(logs, "'logs' cannot be null."); if (logs.isEmpty()) { throw LOGGER.logExceptionAsError(new IllegalArgumentException("'logs' cannot be empty.")); @@ -222,7 +222,7 @@ private Mono splitAndUpload(String dataCollectionRuleId, Strin Iterator> logBatchesIterator = logBatches.iterator(); return Flux.fromIterable(requests) .flatMapSequential(bytes -> - uploadToService(dataCollectionRuleId, streamName, requestOptions, bytes), concurrency) + uploadToService(ruleId, streamName, requestOptions, bytes), concurrency) .map(responseHolder -> mapResult(logBatchesIterator, responseHolder)) .collectList() .map(this::createResponse); @@ -240,8 +240,8 @@ private UploadLogsResult mapResult(Iterator> logBatchesIterator, Up return new UploadLogsResult(UploadLogsStatus.SUCCESS, null); } - private Mono uploadToService(String dataCollectionRuleId, String streamName, RequestOptions requestOptions, byte[] bytes) { - return service.uploadWithResponse(dataCollectionRuleId, streamName, + private Mono uploadToService(String ruleId, String streamName, RequestOptions requestOptions, byte[] bytes) { + return service.uploadWithResponse(ruleId, streamName, BinaryData.fromBytes(bytes), requestOptions) .map(response -> new UploadLogsResponseHolder(UploadLogsStatus.SUCCESS, null)) .onErrorResume(HttpResponseException.class, @@ -278,18 +278,15 @@ private ResponseError mapToResponseError(HttpResponseException ex) { private UploadLogsResult createResponse(List results) { int failureCount = 0; - List errors = null; + List errors = new ArrayList<>(); for (UploadLogsResult result : results) { if (result.getStatus() != UploadLogsStatus.SUCCESS) { failureCount++; - if (errors == null) { - errors = new ArrayList<>(); - } errors.addAll(result.getErrors()); } } if (failureCount == 0) { - return new UploadLogsResult(UploadLogsStatus.SUCCESS, null); + return new UploadLogsResult(UploadLogsStatus.SUCCESS, errors); } if (failureCount < results.size()) { return new UploadLogsResult(UploadLogsStatus.PARTIAL_FAILURE, errors); diff --git a/sdk/monitor/azure-monitor-ingestion/src/main/java/com/azure/monitor/ingestion/LogsIngestionClient.java b/sdk/monitor/azure-monitor-ingestion/src/main/java/com/azure/monitor/ingestion/LogsIngestionClient.java index 31380f9cbfeb..676eb6abc20c 100644 --- a/sdk/monitor/azure-monitor-ingestion/src/main/java/com/azure/monitor/ingestion/LogsIngestionClient.java +++ b/sdk/monitor/azure-monitor-ingestion/src/main/java/com/azure/monitor/ingestion/LogsIngestionClient.java @@ -55,17 +55,17 @@ public final class LogsIngestionClient { * * * - * @param dataCollectionRuleId the data collection rule id that is configured to collect and transform the logs. + * @param ruleId the data collection rule id that is configured to collect and transform the logs. * @param streamName the stream name configured in data collection rule that matches defines the structure of the * logs sent in this request. * @param logs the collection of logs to be uploaded. * @return the result of the logs upload request. - * @throws NullPointerException if any of {@code dataCollectionRuleId}, {@code streamName} or {@code logs} are null. + * @throws NullPointerException if any of {@code ruleId}, {@code streamName} or {@code logs} are null. * @throws IllegalArgumentException if {@code logs} is empty. */ @ServiceMethod(returns = ReturnType.SINGLE) - public UploadLogsResult upload(String dataCollectionRuleId, String streamName, List logs) { - return asyncClient.upload(dataCollectionRuleId, streamName, logs).block(); + public UploadLogsResult upload(String ruleId, String streamName, List logs) { + return asyncClient.upload(ruleId, streamName, logs).block(); } /** @@ -83,19 +83,19 @@ public UploadLogsResult upload(String dataCollectionRuleId, String streamName, L * System.out.println("Logs upload result status " + result.getStatus()); * * - * @param dataCollectionRuleId the data collection rule id that is configured to collect and transform the logs. + * @param ruleId the data collection rule id that is configured to collect and transform the logs. * @param streamName the stream name configured in data collection rule that matches defines the structure of the * logs sent in this request. * @param logs the collection of logs to be uploaded. * @param options the options to configure the upload request. * @return the result of the logs upload request. - * @throws NullPointerException if any of {@code dataCollectionRuleId}, {@code streamName} or {@code logs} are null. + * @throws NullPointerException if any of {@code ruleId}, {@code streamName} or {@code logs} are null. * @throws IllegalArgumentException if {@code logs} is empty. */ @ServiceMethod(returns = ReturnType.SINGLE) - public UploadLogsResult upload(String dataCollectionRuleId, String streamName, + public UploadLogsResult upload(String ruleId, String streamName, List logs, UploadLogsOptions options) { - return asyncClient.upload(dataCollectionRuleId, streamName, logs, options, Context.NONE).block(); + return asyncClient.upload(ruleId, streamName, logs, options, Context.NONE).block(); } /** @@ -103,7 +103,7 @@ public UploadLogsResult upload(String dataCollectionRuleId, String streamName, * too large to be sent as a single request to the Azure Monitor service. In such cases, this method will split * the input logs into multiple smaller requests before sending to the service. * - * @param dataCollectionRuleId the data collection rule id that is configured to collect and transform the logs. + * @param ruleId the data collection rule id that is configured to collect and transform the logs. * @param streamName the stream name configured in data collection rule that matches defines the structure of the * logs sent in this request. * @param logs the collection of logs to be uploaded. @@ -111,13 +111,13 @@ public UploadLogsResult upload(String dataCollectionRuleId, String streamName, * @param context additional context that is passed through the Http pipeline during the service call. If no * additional context is required, pass {@link Context#NONE} instead. * @return the result of the logs upload request. - * @throws NullPointerException if any of {@code dataCollectionRuleId}, {@code streamName} or {@code logs} are null. + * @throws NullPointerException if any of {@code ruleId}, {@code streamName} or {@code logs} are null. * @throws IllegalArgumentException if {@code logs} is empty. */ @ServiceMethod(returns = ReturnType.SINGLE) - public UploadLogsResult upload(String dataCollectionRuleId, String streamName, + public UploadLogsResult upload(String ruleId, String streamName, List logs, UploadLogsOptions options, Context context) { - return asyncClient.upload(dataCollectionRuleId, streamName, logs, options, context).block(); + return asyncClient.upload(ruleId, streamName, logs, options, context).block(); } /** @@ -140,7 +140,7 @@ public UploadLogsResult upload(String dataCollectionRuleId, String streamName, * ] * } * - * @param dataCollectionRuleId The immutable Id of the Data Collection Rule resource. + * @param ruleId The immutable Id of the Data Collection Rule resource. * @param streamName The streamDeclaration name as defined in the Data Collection Rule. * @param logs An array of objects matching the schema defined by the provided stream. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. @@ -152,7 +152,7 @@ public UploadLogsResult upload(String dataCollectionRuleId, String streamName, */ @ServiceMethod(returns = ReturnType.SINGLE) public Response uploadWithResponse( - String dataCollectionRuleId, String streamName, BinaryData logs, RequestOptions requestOptions) { - return asyncClient.uploadWithResponse(dataCollectionRuleId, streamName, logs, requestOptions).block(); + String ruleId, String streamName, BinaryData logs, RequestOptions requestOptions) { + return asyncClient.uploadWithResponse(ruleId, streamName, logs, requestOptions).block(); } } diff --git a/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomLogSerializer.java b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomLogSerializer.java new file mode 100644 index 000000000000..c6f186a45f5d --- /dev/null +++ b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomLogSerializer.java @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.monitor.ingestion; + +import com.azure.core.util.serializer.ObjectSerializer; +import com.azure.core.util.serializer.TypeReference; +import com.fasterxml.jackson.core.JsonEncoding; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import reactor.core.publisher.Mono; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.time.format.DateTimeFormatter; + +/*** + * Custom serializer sample for the `CustomLogData` class. + * Only the `serialize` method is implemented as we are not expected to deserialize the data here. + */ +public class CustomLogSerializer implements ObjectSerializer { + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ssZZZ"); + private final JsonFactory jsonFactory; + + public CustomLogSerializer() { + jsonFactory = JsonFactory.builder().build(); + } + + @Override + public T deserialize(InputStream stream, TypeReference typeReference) { + // This method will never be called + throw new UnsupportedOperationException("Deserialize called on custom serializer. Which should not happen."); + } + + @Override + public Mono deserializeAsync(InputStream stream, TypeReference typeReference) { + return Mono.fromCallable(() -> deserialize(stream, typeReference)); + } + + @Override + public void serialize(OutputStream stream, Object value) { + if (!(value instanceof CustomLogData)) { + throw new RuntimeException("Unknown object type passed to custom serializer"); + } + + final JsonGenerator gen; + final CustomLogData data = (CustomLogData) value; + try { + gen = jsonFactory.createGenerator(stream, JsonEncoding.UTF8); + gen.writeStartObject(); + gen.writeStringField("logTime", FORMATTER.format(data.getTime())); + gen.writeStringField("extendedColumn", data.getExtendedColumn()); + gen.writeStringField("additionalContext", data.getAdditionalContext()); + gen.writeEndObject(); + } catch (IOException e) { + throw new RuntimeException("Unexpected IO exception.", e); + } + } + + @Override + public Mono serializeAsync(OutputStream stream, Object value) { + return Mono.fromRunnable(() -> serialize(stream, value)); + } +} diff --git a/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomSerializerSample.java b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomSerializerSample.java new file mode 100644 index 000000000000..f52a587e3e1c --- /dev/null +++ b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/CustomSerializerSample.java @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.monitor.ingestion; + +import com.azure.core.util.serializer.ObjectSerializer; +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.monitor.ingestion.models.UploadLogsOptions; +import com.azure.monitor.ingestion.models.UploadLogsResult; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; + +public class CustomSerializerSample { + /** + * Main method to run the sample. + * @param args ignore args. + */ + public static void main(String[] args) { + LogsIngestionClient client = new LogsIngestionClientBuilder() + .endpoint("") + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + + List dataList = getLogs(); + + ObjectSerializer customSerializer = new CustomLogSerializer(); + + UploadLogsOptions options = new UploadLogsOptions() + .setObjectSerializer(customSerializer); + + UploadLogsResult result = client.upload("", + "", + dataList, + options); + System.out.println(result.getStatus()); + } + + private static List getLogs() { + List logs = new ArrayList<>(); + + for (int i = 0; i < 10; i++) { + CustomLogData e = new CustomLogData() + .setTime(OffsetDateTime.now()) + .setExtendedColumn("extend column data" + i) + .setAdditionalContext("more logs context"); + logs.add(e); + } + return logs; + } +} diff --git a/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/UploadLogsAsyncClientSample.java b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/UploadLogsAsyncClientSample.java new file mode 100644 index 000000000000..0d2dfa9151c5 --- /dev/null +++ b/sdk/monitor/azure-monitor-ingestion/src/samples/java/com/azure/monitor/ingestion/UploadLogsAsyncClientSample.java @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.monitor.ingestion; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.monitor.ingestion.models.UploadLogsResult; +import reactor.core.Disposable; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Sample to demonstrate uploading logs to Azure Monitor using the Async client. + */ +public class UploadLogsAsyncClientSample { + + private static final Duration TIMEOUT = Duration.ofSeconds(10); + /** + * Main method to run the sample. + * @param args ignore args. + */ + public static void main(String[] args) throws InterruptedException { + UploadLogsAsyncClientSample sample = new UploadLogsAsyncClientSample(); + sample.run(); + } + + private void run() throws InterruptedException { + LogsIngestionAsyncClient client = new LogsIngestionClientBuilder() + .endpoint("") + .credential(new DefaultAzureCredentialBuilder().build()) + .buildAsyncClient(); + + CountDownLatch countdownLatch = new CountDownLatch(1); + List dataList = getLogs(); + try { + + // More details on Mono<> can be found in the project reactor documentation at : + // https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html + + Mono resultMono = client.upload("", + "", dataList); + + Disposable subscription = resultMono.subscribe( + uploadLogsResult -> { + // Upload operation has finished and the result object is populated. + if (uploadLogsResult == null) { + throw new RuntimeException(); + } + System.out.println(uploadLogsResult.getStatus()); + }, + error -> { + // If any exceptions are throw, they are handled here. + throw new RuntimeException("Unexpected error calling upload.", error); + }); + + // Subscribe is not a blocking call, so we wait here so the program does not terminate. + countdownLatch.await(TIMEOUT.getSeconds(), TimeUnit.SECONDS); + + // Disposing of the subscription will cancel the upload() operation. + subscription.dispose(); + + } catch (RuntimeException runtimeException) { + // RuntimeException can be thrown by calling Mono.block() if an error occurs or if the operation times out. + // Handling operation timeout, logging and so on would go here. + } + } + + private static List getLogs() { + List logs = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + CustomLogData e = new CustomLogData() + .setTime(OffsetDateTime.now()) + .setExtendedColumn("extend column data" + i); + logs.add(e); + } + return logs; + } +} diff --git a/sdk/parents/azure-client-sdk-parent/pom.xml b/sdk/parents/azure-client-sdk-parent/pom.xml index 9147421eb48b..a44942905388 100644 --- a/sdk/parents/azure-client-sdk-parent/pom.xml +++ b/sdk/parents/azure-client-sdk-parent/pom.xml @@ -230,6 +230,9 @@ - + + + @@ -649,6 +652,12 @@ spotbugs 4.2.2 + + + org.ow2.asm + asm + 9.3 + ${spotbugs.skip} @@ -661,6 +670,9 @@ ${spotbugs.failOnError} ${spotbugs.includeTests} + + ${java.security.manager.configuration} + @@ -1164,6 +1176,7 @@ --add-opens java.base/java.lang.invoke=com.azure.core ${additionalFailsafeArgLine} + ${java.security.manager.configuration} @@ -1606,5 +1619,16 @@ + + + java-18-plus-allow-securitymanager + + [18,) + + + + -Djava.security.manager=allow + + diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/CHANGELOG.md b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/CHANGELOG.md index 98c9dc1a4a82..1f2a3fd41efe 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/CHANGELOG.md +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 1.0.0-beta.4 (Unreleased) +## 1.1.0-beta.1 (Unreleased) ### Features Added @@ -10,6 +10,10 @@ ### Other Changes +## 1.0.0 (2022-11-02) + +- Azure Resource Manager ResourceGraph client library for Java. This package contains Microsoft Azure SDK for ResourceGraph Management SDK. Azure Resource Graph API Reference. Package tag package-2021-03. For documentation on how to use this package, please see [Azure Management Libraries for Java](https://aka.ms/azsdk/java/mgmt). + ## 1.0.0-beta.3 (2022-04-07) - Azure Resource Manager ResourceGraph client library for Java. This package contains Microsoft Azure SDK for ResourceGraph Management SDK. Azure Resource Graph API Reference. Package tag package-2021-03. For documentation on how to use this package, please see [Azure Management Libraries for Java](https://aka.ms/azsdk/java/mgmt). diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/README.md b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/README.md index c7e4150e722d..6006edf2b3cf 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/README.md +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/README.md @@ -32,7 +32,7 @@ Various documentation is available to help you get started com.azure.resourcemanager azure-resourcemanager-resourcegraph - 1.0.0-beta.3 + 1.0.0 ``` [//]: # ({x-version-update-end}) @@ -41,19 +41,19 @@ Various documentation is available to help you get started Azure Management Libraries require a `TokenCredential` implementation for authentication and an `HttpClient` implementation for HTTP client. -[Azure Identity][azure_identity] package and [Azure Core Netty HTTP][azure_core_http_netty] package provide the default implementation. +[Azure Identity][azure_identity] and [Azure Core Netty HTTP][azure_core_http_netty] packages provide the default implementation. ### Authentication -By default, Azure Active Directory token authentication depends on correct configure of following environment variables. +By default, Azure Active Directory token authentication depends on correct configuration of the following environment variables. - `AZURE_CLIENT_ID` for Azure client ID. - `AZURE_TENANT_ID` for Azure tenant ID. - `AZURE_CLIENT_SECRET` or `AZURE_CLIENT_CERTIFICATE_PATH` for client secret or client certificate. -In addition, Azure subscription ID can be configured via environment variable `AZURE_SUBSCRIPTION_ID`. +In addition, Azure subscription ID can be configured via `AZURE_SUBSCRIPTION_ID` environment variable. -With above configuration, `azure` client can be authenticated by following code: +With above configuration, `azure` client can be authenticated using the following code: ```java AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE); @@ -97,13 +97,13 @@ response = manager.resourceProviders().resources(queryRequest); ## Contributing -For details on contributing to this repository, see the [contributing guide](https://github.com/Azure/azure-sdk-for-java/blob/main/CONTRIBUTING.md). +For details on contributing to this repository, see the [contributing guide][cg]. -1. Fork it -1. Create your feature branch (`git checkout -b my-new-feature`) -1. Commit your changes (`git commit -am 'Add some feature'`) -1. Push to the branch (`git push origin my-new-feature`) -1. Create new Pull Request +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit . + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repositories using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct][coc]. For more information see the [Code of Conduct FAQ][coc_faq] or contact with any additional questions or comments. [survey]: https://microsoft.qualtrics.com/jfe/form/SV_ehN0lIk2FKEBkwd?Q_CHL=DOCS @@ -114,3 +114,6 @@ For details on contributing to this repository, see the [contributing guide](htt [azure_core_http_netty]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core-http-netty [authenticate]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/resourcemanager/docs/AUTH.md [design]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/resourcemanager/docs/DESIGN.md +[cg]: https://github.com/Azure/azure-sdk-for-java/blob/main/CONTRIBUTING.md +[coc]: https://opensource.microsoft.com/codeofconduct/ +[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/pom.xml b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/pom.xml index 6abfff49ea49..0bb784c0bc09 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/pom.xml +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/pom.xml @@ -9,7 +9,7 @@ com.azure.resourcemanager azure-resourcemanager-resourcegraph - 1.0.0-beta.4 + 1.1.0-beta.1 jar Microsoft Azure SDK for ResourceGraph Management @@ -51,6 +51,12 @@ azure-core-management 1.8.1 + + com.azure + azure-core-test + 1.12.1 + test + com.azure azure-identity @@ -58,9 +64,15 @@ test - com.azure - azure-core-test - 1.12.1 + org.junit.jupiter + junit-jupiter-engine + 5.9.1 + test + + + org.mockito + mockito-core + 4.8.1 test diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/ResourceGraphManager.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/ResourceGraphManager.java index dbc13510472b..77221a00072b 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/ResourceGraphManager.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/ResourceGraphManager.java @@ -206,7 +206,7 @@ public ResourceGraphManager authenticate(TokenCredential credential, AzureProfil .append("-") .append("com.azure.resourcemanager.resourcegraph") .append("/") - .append("1.0.0-beta.3"); + .append("1.0.0"); if (!Configuration.getGlobalConfiguration().get("AZURE_TELEMETRY_DISABLED", false)) { userAgentBuilder .append(" (") @@ -263,7 +263,11 @@ public ResourceGraphManager authenticate(TokenCredential credential, AzureProfil } } - /** @return Resource collection API of ResourceProviders. */ + /** + * Gets the resource collection API of ResourceProviders. + * + * @return Resource collection API of ResourceProviders. + */ public ResourceProviders resourceProviders() { if (this.resourceProviders == null) { this.resourceProviders = new ResourceProvidersImpl(clientObject.getResourceProviders(), this); @@ -271,7 +275,11 @@ public ResourceProviders resourceProviders() { return resourceProviders; } - /** @return Resource collection API of Operations. */ + /** + * Gets the resource collection API of Operations. + * + * @return Resource collection API of Operations. + */ public Operations operations() { if (this.operations == null) { this.operations = new OperationsImpl(clientObject.getOperations(), this); diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/ResourceProvidersClient.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/ResourceProvidersClient.java index e78b538a4bfc..0c06911802d0 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/ResourceProvidersClient.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/ResourceProvidersClient.java @@ -17,24 +17,24 @@ public interface ResourceProvidersClient { * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. + * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result. + * @return query result along with {@link Response}. */ @ServiceMethod(returns = ReturnType.SINGLE) - QueryResponseInner resources(QueryRequest query); + Response resourcesWithResponse(QueryRequest query, Context context); /** * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. - * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result along with {@link Response}. + * @return query result. */ @ServiceMethod(returns = ReturnType.SINGLE) - Response resourcesWithResponse(QueryRequest query, Context context); + QueryResponseInner resources(QueryRequest query); } diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/OperationInner.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/OperationInner.java index 3807d8330214..283fbd362e7e 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/OperationInner.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/OperationInner.java @@ -29,6 +29,10 @@ public final class OperationInner { @JsonProperty(value = "origin") private String origin; + /** Creates an instance of OperationInner class. */ + public OperationInner() { + } + /** * Get the name property: Operation name: {provider}/{resource}/{operation}. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/QueryResponseInner.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/QueryResponseInner.java index 499340d6c1f3..9d693eed3168 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/QueryResponseInner.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/fluent/models/QueryResponseInner.java @@ -21,8 +21,8 @@ public final class QueryResponseInner { private long totalRecords; /* - * Number of records returned in the current response. In the case of - * paging, this is the number of records in the current page. + * Number of records returned in the current response. In the case of paging, this is the number of records in the + * current page. */ @JsonProperty(value = "count", required = true) private long count; @@ -34,9 +34,8 @@ public final class QueryResponseInner { private ResultTruncated resultTruncated; /* - * When present, the value can be passed to a subsequent query call - * (together with the same query and scopes used in the current request) to - * retrieve the next page of data. + * When present, the value can be passed to a subsequent query call (together with the same query and scopes used + * in the current request) to retrieve the next page of data. */ @JsonProperty(value = "$skipToken") private String skipToken; @@ -53,6 +52,10 @@ public final class QueryResponseInner { @JsonProperty(value = "facets") private List facets; + /** Creates an instance of QueryResponseInner class. */ + public QueryResponseInner() { + } + /** * Get the totalRecords property: Number of total records matching the query. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientBuilder.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientBuilder.java index 8712af38576c..5620f7fc0065 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientBuilder.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientBuilder.java @@ -103,26 +103,21 @@ public ResourceGraphClientBuilder serializerAdapter(SerializerAdapter serializer * @return an instance of ResourceGraphClientImpl. */ public ResourceGraphClientImpl buildClient() { - if (pipeline == null) { - this.pipeline = new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(); - } - if (endpoint == null) { - this.endpoint = "https://management.azure.com"; - } - if (environment == null) { - this.environment = AzureEnvironment.AZURE; - } - if (pipeline == null) { - this.pipeline = new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(); - } - if (defaultPollInterval == null) { - this.defaultPollInterval = Duration.ofSeconds(30); - } - if (serializerAdapter == null) { - this.serializerAdapter = SerializerFactory.createDefaultManagementSerializerAdapter(); - } + String localEndpoint = (endpoint != null) ? endpoint : "https://management.azure.com"; + AzureEnvironment localEnvironment = (environment != null) ? environment : AzureEnvironment.AZURE; + HttpPipeline localPipeline = + (pipeline != null) + ? pipeline + : new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(); + Duration localDefaultPollInterval = + (defaultPollInterval != null) ? defaultPollInterval : Duration.ofSeconds(30); + SerializerAdapter localSerializerAdapter = + (serializerAdapter != null) + ? serializerAdapter + : SerializerFactory.createDefaultManagementSerializerAdapter(); ResourceGraphClientImpl client = - new ResourceGraphClientImpl(pipeline, serializerAdapter, defaultPollInterval, environment, endpoint); + new ResourceGraphClientImpl( + localPipeline, localSerializerAdapter, localDefaultPollInterval, localEnvironment, localEndpoint); return client; } } diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientImpl.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientImpl.java index 334dc3c6d7a4..1a59844481ff 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientImpl.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceGraphClientImpl.java @@ -15,6 +15,7 @@ import com.azure.core.management.polling.PollResult; import com.azure.core.management.polling.PollerFactory; import com.azure.core.util.Context; +import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.polling.AsyncPollResponse; import com.azure.core.util.polling.LongRunningOperationStatus; @@ -30,7 +31,6 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.Map; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -161,10 +161,7 @@ public Context getContext() { * @return the merged context. */ public Context mergeContext(Context context) { - for (Map.Entry entry : this.getContext().getValues().entrySet()) { - context = context.addData(entry.getKey(), entry.getValue()); - } - return context; + return CoreUtils.mergeContexts(this.getContext(), context); } /** diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersClientImpl.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersClientImpl.java index 173159447bea..dbeb1f57f27d 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersClientImpl.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersClientImpl.java @@ -133,43 +133,35 @@ private Mono> resourcesWithResponseAsync(QueryReque */ @ServiceMethod(returns = ReturnType.SINGLE) private Mono resourcesAsync(QueryRequest query) { - return resourcesWithResponseAsync(query) - .flatMap( - (Response res) -> { - if (res.getValue() != null) { - return Mono.just(res.getValue()); - } else { - return Mono.empty(); - } - }); + return resourcesWithResponseAsync(query).flatMap(res -> Mono.justOrEmpty(res.getValue())); } /** * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. + * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result. + * @return query result along with {@link Response}. */ @ServiceMethod(returns = ReturnType.SINGLE) - public QueryResponseInner resources(QueryRequest query) { - return resourcesAsync(query).block(); + public Response resourcesWithResponse(QueryRequest query, Context context) { + return resourcesWithResponseAsync(query, context).block(); } /** * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. - * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result along with {@link Response}. + * @return query result. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Response resourcesWithResponse(QueryRequest query, Context context) { - return resourcesWithResponseAsync(query, context).block(); + public QueryResponseInner resources(QueryRequest query) { + return resourcesWithResponse(query, Context.NONE).getValue(); } } diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersImpl.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersImpl.java index e0a6ae542ea0..ae32593ba755 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersImpl.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/implementation/ResourceProvidersImpl.java @@ -28,15 +28,6 @@ public ResourceProvidersImpl( this.serviceManager = serviceManager; } - public QueryResponse resources(QueryRequest query) { - QueryResponseInner inner = this.serviceClient().resources(query); - if (inner != null) { - return new QueryResponseImpl(inner, this.manager()); - } else { - return null; - } - } - public Response resourcesWithResponse(QueryRequest query, Context context) { Response inner = this.serviceClient().resourcesWithResponse(query, context); if (inner != null) { @@ -50,6 +41,15 @@ public Response resourcesWithResponse(QueryRequest query, Context } } + public QueryResponse resources(QueryRequest query) { + QueryResponseInner inner = this.serviceClient().resources(query); + if (inner != null) { + return new QueryResponseImpl(inner, this.manager()); + } else { + return null; + } + } + private ResourceProvidersClient serviceClient() { return this.innerClient; } diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ErrorDetails.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ErrorDetails.java index 4737e577634e..501869d84d30 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ErrorDetails.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ErrorDetails.java @@ -33,6 +33,10 @@ public final class ErrorDetails { */ @JsonIgnore private Map additionalProperties; + /** Creates an instance of ErrorDetails class. */ + public ErrorDetails() { + } + /** * Get the code property: Error code identifying the specific error. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/Facet.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/Facet.java index 86e4778394e2..d3c773d058c1 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/Facet.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/Facet.java @@ -30,6 +30,10 @@ public class Facet { @JsonProperty(value = "expression", required = true) private String expression; + /** Creates an instance of Facet class. */ + public Facet() { + } + /** * Get the expression property: Facet expression, same as in the corresponding facet request. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetError.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetError.java index d74851ac29af..e13948879087 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetError.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetError.java @@ -22,6 +22,10 @@ public final class FacetError extends Facet { @JsonProperty(value = "errors", required = true) private List errors; + /** Creates an instance of FacetError class. */ + public FacetError() { + } + /** * Get the errors property: An array containing detected facet errors with details. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequest.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequest.java index 0e24a6a14f1d..b1a29ec231c6 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequest.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequest.java @@ -23,6 +23,10 @@ public final class FacetRequest { @JsonProperty(value = "options") private FacetRequestOptions options; + /** Creates an instance of FacetRequest class. */ + public FacetRequest() { + } + /** * Get the expression property: The column or list of columns to summarize by. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequestOptions.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequestOptions.java index d8c9e77c0790..a5da137822ec 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequestOptions.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetRequestOptions.java @@ -11,8 +11,7 @@ @Fluent public final class FacetRequestOptions { /* - * The column name or query expression to sort on. Defaults to count if not - * present. + * The column name or query expression to sort on. Defaults to count if not present. */ @JsonProperty(value = "sortBy") private String sortBy; @@ -24,8 +23,8 @@ public final class FacetRequestOptions { private FacetSortOrder sortOrder; /* - * Specifies the filter condition for the 'where' clause which will be run - * on main query's result, just before the actual faceting. + * Specifies the filter condition for the 'where' clause which will be run on main query's result, just before the + * actual faceting. */ @JsonProperty(value = "filter") private String filter; @@ -36,6 +35,10 @@ public final class FacetRequestOptions { @JsonProperty(value = "$top") private Integer top; + /** Creates an instance of FacetRequestOptions class. */ + public FacetRequestOptions() { + } + /** * Get the sortBy property: The column name or query expression to sort on. Defaults to count if not present. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetResult.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetResult.java index 257e12a4207f..5e5bdc9d860e 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetResult.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetResult.java @@ -28,12 +28,15 @@ public final class FacetResult extends Facet { private int count; /* - * A JObject array or Table containing the desired facets. Only present if - * the facet is valid. + * A JObject array or Table containing the desired facets. Only present if the facet is valid. */ @JsonProperty(value = "data", required = true) private Object data; + /** Creates an instance of FacetResult class. */ + public FacetResult() { + } + /** * Get the totalRecords property: Number of total records in the facet results. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetSortOrder.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetSortOrder.java index 03d27b3b22b8..c50fbe86827a 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetSortOrder.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/FacetSortOrder.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -/** Defines values for FacetSortOrder. */ +/** The sorting order by the selected column (count by default). */ public enum FacetSortOrder { /** Enum value asc. */ ASC("asc"), @@ -30,6 +30,9 @@ public enum FacetSortOrder { */ @JsonCreator public static FacetSortOrder fromString(String value) { + if (value == null) { + return null; + } FacetSortOrder[] items = FacetSortOrder.values(); for (FacetSortOrder item : items) { if (item.toString().equalsIgnoreCase(value)) { @@ -39,6 +42,7 @@ public static FacetSortOrder fromString(String value) { return null; } + /** {@inheritDoc} */ @JsonValue @Override public String toString() { diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationDisplay.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationDisplay.java index 6ae26220ffce..27a233a48443 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationDisplay.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationDisplay.java @@ -34,6 +34,10 @@ public final class OperationDisplay { @JsonProperty(value = "description") private String description; + /** Creates an instance of OperationDisplay class. */ + public OperationDisplay() { + } + /** * Get the provider property: Service provider: Microsoft Resource Graph. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationListResult.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationListResult.java index 918f1093b5cd..e352f47df2b3 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationListResult.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/OperationListResult.java @@ -16,12 +16,15 @@ @Fluent public final class OperationListResult { /* - * List of Resource Graph operations supported by the Resource Graph - * resource provider. + * List of Resource Graph operations supported by the Resource Graph resource provider. */ @JsonProperty(value = "value") private List value; + /** Creates an instance of OperationListResult class. */ + public OperationListResult() { + } + /** * Get the value property: List of Resource Graph operations supported by the Resource Graph resource provider. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequest.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequest.java index 8fd1ab1c7347..19506a00ca5d 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequest.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequest.java @@ -19,8 +19,7 @@ public final class QueryRequest { private List subscriptions; /* - * Azure management groups against which to execute the query. Example: [ - * 'mg1', 'mg2' ] + * Azure management groups against which to execute the query. Example: [ 'mg1', 'mg2' ] */ @JsonProperty(value = "managementGroups") private List managementGroups; @@ -43,6 +42,10 @@ public final class QueryRequest { @JsonProperty(value = "facets") private List facets; + /** Creates an instance of QueryRequest class. */ + public QueryRequest() { + } + /** * Get the subscriptions property: Azure subscriptions against which to execute the query. * diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequestOptions.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequestOptions.java index fd367a645844..4d3a2c177577 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequestOptions.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/QueryRequestOptions.java @@ -11,22 +11,21 @@ @Fluent public final class QueryRequestOptions { /* - * Continuation token for pagination, capturing the next page size and - * offset, as well as the context of the query. + * Continuation token for pagination, capturing the next page size and offset, as well as the context of the query. */ @JsonProperty(value = "$skipToken") private String skipToken; /* - * The maximum number of rows that the query should return. Overrides the - * page size when ```$skipToken``` property is present. + * The maximum number of rows that the query should return. Overrides the page size when ```$skipToken``` property + * is present. */ @JsonProperty(value = "$top") private Integer top; /* - * The number of rows to skip from the beginning of the results. Overrides - * the next page offset when ```$skipToken``` property is present. + * The number of rows to skip from the beginning of the results. Overrides the next page offset when + * ```$skipToken``` property is present. */ @JsonProperty(value = "$skip") private Integer skip; @@ -38,13 +37,16 @@ public final class QueryRequestOptions { private ResultFormat resultFormat; /* - * Only applicable for tenant and management group level queries to decide - * whether to allow partial scopes for result in case the number of - * subscriptions exceed allowed limits. + * Only applicable for tenant and management group level queries to decide whether to allow partial scopes for + * result in case the number of subscriptions exceed allowed limits. */ @JsonProperty(value = "allowPartialScopes") private Boolean allowPartialScopes; + /** Creates an instance of QueryRequestOptions class. */ + public QueryRequestOptions() { + } + /** * Get the skipToken property: Continuation token for pagination, capturing the next page size and offset, as well * as the context of the query. diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResourceProviders.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResourceProviders.java index fe99a66d5c8d..e01b3ef4a0fb 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResourceProviders.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResourceProviders.java @@ -13,22 +13,22 @@ public interface ResourceProviders { * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. + * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result. + * @return query result along with {@link Response}. */ - QueryResponse resources(QueryRequest query); + Response resourcesWithResponse(QueryRequest query, Context context); /** * Queries the resources managed by Azure Resource Manager for scopes specified in the request. * * @param query Request specifying query and its options. - * @param context The context to associate with this operation. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return query result along with {@link Response}. + * @return query result. */ - Response resourcesWithResponse(QueryRequest query, Context context); + QueryResponse resources(QueryRequest query); } diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultFormat.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultFormat.java index 1c4046e89b81..bcf741091869 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultFormat.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultFormat.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -/** Defines values for ResultFormat. */ +/** Defines in which format query result returned. */ public enum ResultFormat { /** Enum value table. */ TABLE("table"), @@ -30,6 +30,9 @@ public enum ResultFormat { */ @JsonCreator public static ResultFormat fromString(String value) { + if (value == null) { + return null; + } ResultFormat[] items = ResultFormat.values(); for (ResultFormat item : items) { if (item.toString().equalsIgnoreCase(value)) { @@ -39,6 +42,7 @@ public static ResultFormat fromString(String value) { return null; } + /** {@inheritDoc} */ @JsonValue @Override public String toString() { diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultTruncated.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultTruncated.java index ff78599437fc..cb12b8de9de1 100644 --- a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultTruncated.java +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/main/java/com/azure/resourcemanager/resourcegraph/models/ResultTruncated.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -/** Defines values for ResultTruncated. */ +/** Indicates whether the query results are truncated. */ public enum ResultTruncated { /** Enum value true. */ TRUE("true"), @@ -30,6 +30,9 @@ public enum ResultTruncated { */ @JsonCreator public static ResultTruncated fromString(String value) { + if (value == null) { + return null; + } ResultTruncated[] items = ResultTruncated.values(); for (ResultTruncated item : items) { if (item.toString().equalsIgnoreCase(value)) { @@ -39,6 +42,7 @@ public static ResultTruncated fromString(String value) { return null; } + /** {@inheritDoc} */ @JsonValue @Override public String toString() { diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestOptionsTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestOptionsTests.java new file mode 100644 index 000000000000..4721c5f99b54 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestOptionsTests.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.models.FacetRequestOptions; +import com.azure.resourcemanager.resourcegraph.models.FacetSortOrder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class FacetRequestOptionsTests { + @Test + public void testDeserialize() { + FacetRequestOptions model = + BinaryData + .fromString("{\"sortBy\":\"ufo\",\"sortOrder\":\"asc\",\"filter\":\"wifsq\",\"$top\":1701108276}") + .toObject(FacetRequestOptions.class); + Assertions.assertEquals("ufo", model.sortBy()); + Assertions.assertEquals(FacetSortOrder.ASC, model.sortOrder()); + Assertions.assertEquals("wifsq", model.filter()); + Assertions.assertEquals(1701108276, model.top()); + } + + @Test + public void testSerialize() { + FacetRequestOptions model = + new FacetRequestOptions() + .withSortBy("ufo") + .withSortOrder(FacetSortOrder.ASC) + .withFilter("wifsq") + .withTop(1701108276); + model = BinaryData.fromObject(model).toObject(FacetRequestOptions.class); + Assertions.assertEquals("ufo", model.sortBy()); + Assertions.assertEquals(FacetSortOrder.ASC, model.sortOrder()); + Assertions.assertEquals("wifsq", model.filter()); + Assertions.assertEquals(1701108276, model.top()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestTests.java new file mode 100644 index 000000000000..175cafeb1d12 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetRequestTests.java @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.models.FacetRequest; +import com.azure.resourcemanager.resourcegraph.models.FacetRequestOptions; +import com.azure.resourcemanager.resourcegraph.models.FacetSortOrder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class FacetRequestTests { + @Test + public void testDeserialize() { + FacetRequest model = + BinaryData + .fromString( + "{\"expression\":\"soqijg\",\"options\":{\"sortBy\":\"bpazlobcufpdzn\",\"sortOrder\":\"asc\",\"filter\":\"qqjnqgl\",\"$top\":2127527772}}") + .toObject(FacetRequest.class); + Assertions.assertEquals("soqijg", model.expression()); + Assertions.assertEquals("bpazlobcufpdzn", model.options().sortBy()); + Assertions.assertEquals(FacetSortOrder.ASC, model.options().sortOrder()); + Assertions.assertEquals("qqjnqgl", model.options().filter()); + Assertions.assertEquals(2127527772, model.options().top()); + } + + @Test + public void testSerialize() { + FacetRequest model = + new FacetRequest() + .withExpression("soqijg") + .withOptions( + new FacetRequestOptions() + .withSortBy("bpazlobcufpdzn") + .withSortOrder(FacetSortOrder.ASC) + .withFilter("qqjnqgl") + .withTop(2127527772)); + model = BinaryData.fromObject(model).toObject(FacetRequest.class); + Assertions.assertEquals("soqijg", model.expression()); + Assertions.assertEquals("bpazlobcufpdzn", model.options().sortBy()); + Assertions.assertEquals(FacetSortOrder.ASC, model.options().sortOrder()); + Assertions.assertEquals("qqjnqgl", model.options().filter()); + Assertions.assertEquals(2127527772, model.options().top()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetResultTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetResultTests.java new file mode 100644 index 000000000000..80643f0ccaf5 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetResultTests.java @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.models.FacetResult; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class FacetResultTests { + @Test + public void testDeserialize() { + FacetResult model = + BinaryData + .fromString( + "{\"resultType\":\"FacetResult\",\"totalRecords\":8819753813869121711,\"count\":1725970823,\"expression\":\"qnjaqwix\"}") + .toObject(FacetResult.class); + Assertions.assertEquals("qnjaqwix", model.expression()); + Assertions.assertEquals(8819753813869121711L, model.totalRecords()); + Assertions.assertEquals(1725970823, model.count()); + } + + @Test + public void testSerialize() { + FacetResult model = + new FacetResult().withExpression("qnjaqwix").withTotalRecords(8819753813869121711L).withCount(1725970823); + model = BinaryData.fromObject(model).toObject(FacetResult.class); + Assertions.assertEquals("qnjaqwix", model.expression()); + Assertions.assertEquals(8819753813869121711L, model.totalRecords()); + Assertions.assertEquals(1725970823, model.count()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetTests.java new file mode 100644 index 000000000000..b4eb70e5bf54 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/FacetTests.java @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.models.Facet; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class FacetTests { + @Test + public void testDeserialize() { + Facet model = BinaryData.fromString("{\"resultType\":\"Facet\",\"expression\":\"j\"}").toObject(Facet.class); + Assertions.assertEquals("j", model.expression()); + } + + @Test + public void testSerialize() { + Facet model = new Facet().withExpression("j"); + model = BinaryData.fromObject(model).toObject(Facet.class); + Assertions.assertEquals("j", model.expression()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationDisplayTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationDisplayTests.java new file mode 100644 index 000000000000..1e9fae20a9dc --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationDisplayTests.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.models.OperationDisplay; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class OperationDisplayTests { + @Test + public void testDeserialize() { + OperationDisplay model = + BinaryData + .fromString( + "{\"provider\":\"nchgej\",\"resource\":\"odmailzyd\",\"operation\":\"o\",\"description\":\"yahux\"}") + .toObject(OperationDisplay.class); + Assertions.assertEquals("nchgej", model.provider()); + Assertions.assertEquals("odmailzyd", model.resource()); + Assertions.assertEquals("o", model.operation()); + Assertions.assertEquals("yahux", model.description()); + } + + @Test + public void testSerialize() { + OperationDisplay model = + new OperationDisplay() + .withProvider("nchgej") + .withResource("odmailzyd") + .withOperation("o") + .withDescription("yahux"); + model = BinaryData.fromObject(model).toObject(OperationDisplay.class); + Assertions.assertEquals("nchgej", model.provider()); + Assertions.assertEquals("odmailzyd", model.resource()); + Assertions.assertEquals("o", model.operation()); + Assertions.assertEquals("yahux", model.description()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationInnerTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationInnerTests.java new file mode 100644 index 000000000000..17fe01cbd71e --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationInnerTests.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.fluent.models.OperationInner; +import com.azure.resourcemanager.resourcegraph.models.OperationDisplay; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class OperationInnerTests { + @Test + public void testDeserialize() { + OperationInner model = + BinaryData + .fromString( + "{\"name\":\"iwbybrkxvdumjg\",\"display\":{\"provider\":\"wvukx\",\"resource\":\"udccsnhsjc\",\"operation\":\"ejhkry\",\"description\":\"napczwlokjy\"},\"origin\":\"kkvnipjox\"}") + .toObject(OperationInner.class); + Assertions.assertEquals("iwbybrkxvdumjg", model.name()); + Assertions.assertEquals("wvukx", model.display().provider()); + Assertions.assertEquals("udccsnhsjc", model.display().resource()); + Assertions.assertEquals("ejhkry", model.display().operation()); + Assertions.assertEquals("napczwlokjy", model.display().description()); + Assertions.assertEquals("kkvnipjox", model.origin()); + } + + @Test + public void testSerialize() { + OperationInner model = + new OperationInner() + .withName("iwbybrkxvdumjg") + .withDisplay( + new OperationDisplay() + .withProvider("wvukx") + .withResource("udccsnhsjc") + .withOperation("ejhkry") + .withDescription("napczwlokjy")) + .withOrigin("kkvnipjox"); + model = BinaryData.fromObject(model).toObject(OperationInner.class); + Assertions.assertEquals("iwbybrkxvdumjg", model.name()); + Assertions.assertEquals("wvukx", model.display().provider()); + Assertions.assertEquals("udccsnhsjc", model.display().resource()); + Assertions.assertEquals("ejhkry", model.display().operation()); + Assertions.assertEquals("napczwlokjy", model.display().description()); + Assertions.assertEquals("kkvnipjox", model.origin()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationListResultTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationListResultTests.java new file mode 100644 index 000000000000..bb0b7d2c5318 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationListResultTests.java @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.util.BinaryData; +import com.azure.resourcemanager.resourcegraph.fluent.models.OperationInner; +import com.azure.resourcemanager.resourcegraph.models.OperationDisplay; +import com.azure.resourcemanager.resourcegraph.models.OperationListResult; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class OperationListResultTests { + @Test + public void testDeserialize() { + OperationListResult model = + BinaryData + .fromString( + "{\"value\":[{\"name\":\"siznto\",\"display\":{\"provider\":\"a\",\"resource\":\"ajpsquc\",\"operation\":\"o\",\"description\":\"dkfo\"},\"origin\":\"nygj\"},{\"name\":\"jddeqsrdeupewnw\",\"display\":{\"provider\":\"tjzyflus\",\"resource\":\"hmofc\",\"operation\":\"smy\",\"description\":\"kdtmlxhekuk\"},\"origin\":\"txukcdmp\"},{\"name\":\"cryuan\",\"display\":{\"provider\":\"xzdxtayrlhmwh\",\"resource\":\"mrqobmtukknr\",\"operation\":\"tihfx\",\"description\":\"jbpzvgnwzsymg\"},\"origin\":\"uf\"},{\"name\":\"zk\",\"display\":{\"provider\":\"bihanuf\",\"resource\":\"cbjy\",\"operation\":\"git\",\"description\":\"qhabifpikxwcz\"},\"origin\":\"scnpqxuhivy\"}]}") + .toObject(OperationListResult.class); + Assertions.assertEquals("siznto", model.value().get(0).name()); + Assertions.assertEquals("a", model.value().get(0).display().provider()); + Assertions.assertEquals("ajpsquc", model.value().get(0).display().resource()); + Assertions.assertEquals("o", model.value().get(0).display().operation()); + Assertions.assertEquals("dkfo", model.value().get(0).display().description()); + Assertions.assertEquals("nygj", model.value().get(0).origin()); + } + + @Test + public void testSerialize() { + OperationListResult model = + new OperationListResult() + .withValue( + Arrays + .asList( + new OperationInner() + .withName("siznto") + .withDisplay( + new OperationDisplay() + .withProvider("a") + .withResource("ajpsquc") + .withOperation("o") + .withDescription("dkfo")) + .withOrigin("nygj"), + new OperationInner() + .withName("jddeqsrdeupewnw") + .withDisplay( + new OperationDisplay() + .withProvider("tjzyflus") + .withResource("hmofc") + .withOperation("smy") + .withDescription("kdtmlxhekuk")) + .withOrigin("txukcdmp"), + new OperationInner() + .withName("cryuan") + .withDisplay( + new OperationDisplay() + .withProvider("xzdxtayrlhmwh") + .withResource("mrqobmtukknr") + .withOperation("tihfx") + .withDescription("jbpzvgnwzsymg")) + .withOrigin("uf"), + new OperationInner() + .withName("zk") + .withDisplay( + new OperationDisplay() + .withProvider("bihanuf") + .withResource("cbjy") + .withOperation("git") + .withDescription("qhabifpikxwcz")) + .withOrigin("scnpqxuhivy"))); + model = BinaryData.fromObject(model).toObject(OperationListResult.class); + Assertions.assertEquals("siznto", model.value().get(0).name()); + Assertions.assertEquals("a", model.value().get(0).display().provider()); + Assertions.assertEquals("ajpsquc", model.value().get(0).display().resource()); + Assertions.assertEquals("o", model.value().get(0).display().operation()); + Assertions.assertEquals("dkfo", model.value().get(0).display().description()); + Assertions.assertEquals("nygj", model.value().get(0).origin()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationsListMockTests.java b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationsListMockTests.java new file mode 100644 index 000000000000..f2d03196642d --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/java/com/azure/resourcemanager/resourcegraph/generated/OperationsListMockTests.java @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.resourcemanager.resourcegraph.generated; + +import com.azure.core.credential.AccessToken; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.HttpRequest; +import com.azure.core.http.HttpResponse; +import com.azure.core.http.rest.PagedIterable; +import com.azure.core.management.AzureEnvironment; +import com.azure.core.management.profile.AzureProfile; +import com.azure.core.util.Context; +import com.azure.resourcemanager.resourcegraph.ResourceGraphManager; +import com.azure.resourcemanager.resourcegraph.models.Operation; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public final class OperationsListMockTests { + @Test + public void testList() throws Exception { + HttpClient httpClient = Mockito.mock(HttpClient.class); + HttpResponse httpResponse = Mockito.mock(HttpResponse.class); + ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); + + String responseStr = + "{\"value\":[{\"name\":\"t\",\"display\":{\"provider\":\"dvpjhulsuuvmk\",\"resource\":\"zkrwfn\",\"operation\":\"odjpslwejd\",\"description\":\"wryoqpsoacc\"},\"origin\":\"zakljlahbc\"}]}"; + + Mockito.when(httpResponse.getStatusCode()).thenReturn(200); + Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); + Mockito + .when(httpResponse.getBody()) + .thenReturn(Flux.just(ByteBuffer.wrap(responseStr.getBytes(StandardCharsets.UTF_8)))); + Mockito + .when(httpResponse.getBodyAsByteArray()) + .thenReturn(Mono.just(responseStr.getBytes(StandardCharsets.UTF_8))); + Mockito + .when(httpClient.send(httpRequest.capture(), Mockito.any())) + .thenReturn( + Mono + .defer( + () -> { + Mockito.when(httpResponse.getRequest()).thenReturn(httpRequest.getValue()); + return Mono.just(httpResponse); + })); + + ResourceGraphManager manager = + ResourceGraphManager + .configure() + .withHttpClient(httpClient) + .authenticate( + tokenRequestContext -> Mono.just(new AccessToken("this_is_a_token", OffsetDateTime.MAX)), + new AzureProfile("", "", AzureEnvironment.AZURE)); + + PagedIterable response = manager.operations().list(Context.NONE); + + Assertions.assertEquals("t", response.iterator().next().name()); + Assertions.assertEquals("dvpjhulsuuvmk", response.iterator().next().display().provider()); + Assertions.assertEquals("zkrwfn", response.iterator().next().display().resource()); + Assertions.assertEquals("odjpslwejd", response.iterator().next().display().operation()); + Assertions.assertEquals("wryoqpsoacc", response.iterator().next().display().description()); + Assertions.assertEquals("zakljlahbc", response.iterator().next().origin()); + } +} diff --git a/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000000..1f0955d450f0 --- /dev/null +++ b/sdk/resourcegraph/azure-resourcemanager-resourcegraph/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/sdk/resourcemanager/azure-resourcemanager-samples/src/main/java/com/azure/resourcemanager/dns/samples/ManageDns.java b/sdk/resourcemanager/azure-resourcemanager-samples/src/main/java/com/azure/resourcemanager/dns/samples/ManageDns.java index b8483db62225..fc024f4a23a5 100644 --- a/sdk/resourcemanager/azure-resourcemanager-samples/src/main/java/com/azure/resourcemanager/dns/samples/ManageDns.java +++ b/sdk/resourcemanager/azure-resourcemanager-samples/src/main/java/com/azure/resourcemanager/dns/samples/ManageDns.java @@ -142,7 +142,7 @@ public static boolean runSample(AzureResourceManager azureResourceManager) throw .withNewPrimaryPublicIPAddress(Utils.randomResourceName(azureResourceManager, "empip-", 20)) .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4")) .create(); System.out.println("Virtual machine created"); @@ -224,7 +224,7 @@ public static boolean runSample(AzureResourceManager azureResourceManager) throw .withNewPrimaryPublicIPAddress(Utils.randomResourceName(azureResourceManager, "ptnerpip-", 20)) .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4")) .create(); System.out.println("Virtual machine created"); diff --git a/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerInstanceTests.testManageContainerInstanceZeroToOneAndOneToManyUsingContainerServiceOrchestrator.json b/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerInstanceTests.testManageContainerInstanceZeroToOneAndOneToManyUsingContainerServiceOrchestrator.json index c40579eb74a1..1284cdc0a902 100644 --- a/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerInstanceTests.testManageContainerInstanceZeroToOneAndOneToManyUsingContainerServiceOrchestrator.json +++ b/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerInstanceTests.testManageContainerInstanceZeroToOneAndOneToManyUsingContainerServiceOrchestrator.json @@ -75,7 +75,7 @@ "content-type" : "application/json; charset=utf-8", "cache-control" : "no-cache", "x-ms-request-id" : "154f2b49-1d98-4272-910e-6f04d19bd136", - "Body" : "{\"username\":\"acrd57221498718\",\"passwords\":[{\"name\":\"password\",\"value\":\"LuypqE8j874V/IiOi5w5qm8p4ydwoBKw\"},{\"name\":\"password2\",\"value\":\"l5ZZay6FHkc5XPiZlB44JPch0YBFsdc+\"}]}" + "Body" : "{\"username\":\"acrd57221498718\",\"passwords\":[{\"name\":\"password\",\"value\":\"fakePasswordPlaceholder\"},{\"name\":\"password2\",\"value\":\"fakePasswordPlaceholder\"}]}" } }, { "Method" : "POST", @@ -102,7 +102,7 @@ "content-type" : "application/json; charset=utf-8", "cache-control" : "no-cache", "x-ms-request-id" : "39d5cda8-b800-4e76-8154-f7df3436192b", - "Body" : "{\"username\":\"acrd57221498718\",\"passwords\":[{\"name\":\"password\",\"value\":\"LuypqE8j874V/IiOi5w5qm8p4ydwoBKw\"},{\"name\":\"password2\",\"value\":\"l5ZZay6FHkc5XPiZlB44JPch0YBFsdc+\"}]}" + "Body" : "{\"username\":\"acrd57221498718\",\"passwords\":[{\"name\":\"password\",\"value\":\"fakePasswordPlaceholder\"},{\"name\":\"password2\",\"value\":\"fakePasswordPlaceholder\"}]}" } }, { "Method" : "PUT", @@ -722,4 +722,4 @@ } } ], "variables" : [ "rgaci9a7509643", "acrd57221498718", "acisample81b47578f", "acssample63c4826651ffc4", "b820f89e-2e09-4877-bffd-ca2aceb48570", "2d0241e2-739e-4988-a508-3989b7d2df47", "dockervm71194c", "pip670383", "47df7b06-5d87-42dc-9338-ff20ab9253a6", "nic10605690f5e", "a34dd435-0a6d-4f0a-8134-c165ac5dc863", "vnet396828d03f", "c86be45a-c6c8-47a9-bf53-c4fda3fb2e0b", "pip39640a74", "06a4e062-eb60-42c9-994d-6069fc702e4b", "95759480-4ee4-470b-9aec-f1a8f11bd2d8", "d55e2476-8643-4942-890a-5dbbda489d6c", "3a27035a-1696-4479-99ac-7ee22a2dacca", "809dee22-61a4-4689-9464-75f11fbf3fe8", "701b1f35-1c97-4afe-b17b-ceb79435c193", "00d2dbaa-de2c-4ac4-a02c-b4ba0a9d25b0" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerRegistryTests.testManageContainerRegistryWithWebhooks.json b/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerRegistryTests.testManageContainerRegistryWithWebhooks.json index edfc63273eee..eeabf3b7123e 100644 --- a/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerRegistryTests.testManageContainerRegistryWithWebhooks.json +++ b/sdk/resourcemanager/azure-resourcemanager-samples/src/test/resources/session-records/ContainerRegistryTests.testManageContainerRegistryWithWebhooks.json @@ -183,7 +183,7 @@ "content-type" : "application/json; charset=utf-8", "cache-control" : "no-cache", "x-ms-request-id" : "2bd4c2f4-5041-4c25-9c29-e306d9a56758", - "Body" : "{\"username\":\"acrsample749517752\",\"passwords\":[{\"name\":\"password\",\"value\":\"JcB6yARXFlu8lae6O/YMvnsFKyJeY31Q\"},{\"name\":\"password2\",\"value\":\"XcBbA5GdxjCR3hJG=NNG1mrskwe6BHv1\"}]}" + "Body" : "{\"username\":\"acrsample749517752\",\"passwords\":[{\"name\":\"password\",\"value\":\"fakePasswordPlaceholder\"},{\"name\":\"password2\",\"value\":\"fakePasswordPlaceholder\"}]}" } }, { "Method" : "GET", @@ -318,7 +318,7 @@ "content-type" : "application/json; charset=utf-8", "cache-control" : "no-cache", "x-ms-request-id" : "db240836-f1bb-40f4-86a0-fc5ba8770634", - "Body" : "{\"username\":\"acrsample749517752\",\"passwords\":[{\"name\":\"password\",\"value\":\"JcB6yARXFlu8lae6O/YMvnsFKyJeY31Q\"},{\"name\":\"password2\",\"value\":\"XcBbA5GdxjCR3hJG=NNG1mrskwe6BHv1\"}]}" + "Body" : "{\"username\":\"acrsample749517752\",\"passwords\":[{\"name\":\"password\",\"value\":\"fakePasswordPlaceholder\"},{\"name\":\"password2\",\"value\":\"fakePasswordPlaceholder\"}]}" } }, { "Method" : "PUT", @@ -869,4 +869,4 @@ } } ], "variables" : [ "rgacr5e748538e", "acrsample749517752", "579b1de8-becc-4611-be12-e133f8842b97", "79a5ab15-0f7c-4c0a-ac20-7e658f9c31ca", "600ccdb5-55a4-45bd-bf32-d5caf1cd87cf", "b1c4c652-7a51-45c0-962a-add6f40db3b0", "e8bead9c-a5cf-48bf-8a19-e5e73c214a5c", "dockervm57918b", "pip049999", "e911e6f8-8b67-43b3-a8c6-a4c44343ac9e", "nic48835156295", "869a7ad4-977c-4cc7-9dab-1dbecbb6e7e0", "vnet458431fe00", "c9fc7195-0cd3-44f4-b417-39a2ba5478c3", "pip29980031", "d5d48dad-9687-4804-9232-d8e224082f67", "a8d57efa-4768-4272-9aca-a9ca5e120e5c", "0c799d10-4c89-4952-9103-bc8837b30968", "b99ea507-e262-4807-8f2b-f8793efa964a" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksCreateSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksCreateSamples.java index 7049d977026e..2e2dd6115b28 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksCreateSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksCreateSamples.java @@ -37,7 +37,7 @@ public static void webhookCreate(com.azure.resourcemanager.AzureResourceManager .withLocation("westus") .withServiceUri("http://myservice.com") .withCustomHeaders( - mapOf("Authorization", "Basic 000000000000000000000000000000000000000000000000000")) + mapOf("Authorization", "Basic FakeCredentialPlaceholder")) .withStatus(WebhookStatus.ENABLED) .withScope("myRepository") .withActions(Arrays.asList(WebhookAction.PUSH)), diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksUpdateSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksUpdateSamples.java index 08fb0a1650e9..acabc58b1d67 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksUpdateSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerregistry/generated/WebhooksUpdateSamples.java @@ -36,7 +36,7 @@ public static void webhookUpdate(com.azure.resourcemanager.AzureResourceManager .withTags(mapOf("key", "value")) .withServiceUri("http://myservice.com") .withCustomHeaders( - mapOf("Authorization", "Basic 000000000000000000000000000000000000000000000000000")) + mapOf("Authorization", "Basic FakeCredentialPlaceHolder")) .withStatus(WebhookStatus.ENABLED) .withScope("myRepository") .withActions(Arrays.asList(WebhookAction.PUSH)), diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerservice/generated/ManagedClustersResetAadProfileSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerservice/generated/ManagedClustersResetAadProfileSamples.java index 2d448acea0d5..4fd9bca3a51b 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerservice/generated/ManagedClustersResetAadProfileSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/containerservice/generated/ManagedClustersResetAadProfileSamples.java @@ -29,7 +29,7 @@ public static void resetAADProfile(com.azure.resourcemanager.AzureResourceManage new ManagedClusterAadProfile() .withClientAppId("clientappid") .withServerAppId("serverappid") - .withServerAppSecret("serverappsecret") + .withServerAppSecret("fakeServerAppSecretPlaceholder") .withTenantId("tenantid"), Context.NONE); } diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtActionGroupResourceLevelSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtActionGroupResourceLevelSamples.java index d530e2102569..469e9d4beb45 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtActionGroupResourceLevelSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtActionGroupResourceLevelSamples.java @@ -57,7 +57,7 @@ public static void createNotificationsAtResourceGroupLevel(com.azure.resourceman new SmsReceiver() .withName("John Doe's mobile") .withCountryCode("1") - .withPhoneNumber("1234567890"), + .withPhoneNumber("fakePhoneNumberPlaceholder"), new SmsReceiver() .withName("Jane Smith's mobile") .withCountryCode("1") @@ -113,7 +113,7 @@ public static void createNotificationsAtResourceGroupLevel(com.azure.resourceman new VoiceReceiver() .withName("Sample voice") .withCountryCode("1") - .withPhoneNumber("1234567890"))) + .withPhoneNumber("fakePhoneNumberPlaceholder"))) .withLogicAppReceivers( Arrays .asList( diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtResourceGroupLevelSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtResourceGroupLevelSamples.java index 85e0e917120e..2891dcd0b465 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtResourceGroupLevelSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateNotificationsAtResourceGroupLevelSamples.java @@ -56,7 +56,7 @@ public static void createNotificationsAtResourceGroupLevel(com.azure.resourceman new SmsReceiver() .withName("John Doe's mobile") .withCountryCode("1") - .withPhoneNumber("1234567890"), + .withPhoneNumber("fakePhoneNumberPlaceholder"), new SmsReceiver() .withName("Jane Smith's mobile") .withCountryCode("1") @@ -112,7 +112,7 @@ public static void createNotificationsAtResourceGroupLevel(com.azure.resourceman new VoiceReceiver() .withName("Sample voice") .withCountryCode("1") - .withPhoneNumber("1234567890"))) + .withPhoneNumber("fakePhoneNumberPlaceholder"))) .withLogicAppReceivers( Arrays .asList( diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateOrUpdateSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateOrUpdateSamples.java index 0bb91656cad6..4b7a21c37873 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateOrUpdateSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsCreateOrUpdateSamples.java @@ -62,7 +62,7 @@ public static void createOrUpdateAnActionGroup(com.azure.resourcemanager.AzureRe new SmsReceiver() .withName("John Doe's mobile") .withCountryCode("1") - .withPhoneNumber("1234567890"), + .withPhoneNumber("fakePhoneNumberPlaceholder"), new SmsReceiver() .withName("Jane Smith's mobile") .withCountryCode("1") @@ -118,7 +118,7 @@ public static void createOrUpdateAnActionGroup(com.azure.resourcemanager.AzureRe new VoiceReceiver() .withName("Sample voice") .withCountryCode("1") - .withPhoneNumber("1234567890"))) + .withPhoneNumber("fakePhoneNumberPlaceholder"))) .withLogicAppReceivers( Arrays .asList( diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsPostTestNotificationsSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsPostTestNotificationsSamples.java index 9580099c0cd3..0364bb30d100 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsPostTestNotificationsSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/monitor/generated/ActionGroupsPostTestNotificationsSamples.java @@ -55,7 +55,7 @@ public static void createNotificationsAtSubscriptionLevel(com.azure.resourcemana new SmsReceiver() .withName("John Doe's mobile") .withCountryCode("1") - .withPhoneNumber("1234567890"), + .withPhoneNumber("fakePhoneNumberPlaceholder"), new SmsReceiver() .withName("Jane Smith's mobile") .withCountryCode("1") @@ -111,7 +111,7 @@ public static void createNotificationsAtSubscriptionLevel(com.azure.resourcemana new VoiceReceiver() .withName("Sample voice") .withCountryCode("1") - .withPhoneNumber("1234567890"))) + .withPhoneNumber("fakePhoneNumberPlaceholder"))) .withLogicAppReceivers( Arrays .asList( diff --git a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/storage/generated/FileSharesRestoreSamples.java b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/storage/generated/FileSharesRestoreSamples.java index 7d6d79cce5a9..50d94222a78b 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/storage/generated/FileSharesRestoreSamples.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/samples/java/com/azure/resourcemanager/storage/generated/FileSharesRestoreSamples.java @@ -27,7 +27,7 @@ public static void restoreShares(com.azure.resourcemanager.AzureResourceManager "res3376", "sto328", "share1249", - new DeletedShare().withDeletedShareName("share1249").withDeletedShareVersion("1234567890"), + new DeletedShare().withDeletedShareName("share1249").withDeletedShareVersion("fakeVersionPlaceholder"), Context.NONE); } } diff --git a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java index 97ae3f601f92..773165b22680 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java @@ -54,7 +54,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc virtualMachines.manager().resourceManager().internalContext().randomResourceName("pip", 20)) .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4")) .withNewStorageAccount(storageCreatable) .withNewAvailabilitySet(virtualMachines.manager().resourceManager().internalContext().randomResourceName("avset", 10)) diff --git a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java index ae367a3180f3..6ed7da9ffe0d 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java @@ -26,7 +26,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc .withoutPrimaryPublicIPAddress() .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withUnmanagedDisks() .withNewUnmanagedDataDisk(30) .defineUnmanagedDataDisk("disk2") diff --git a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java index 5e69aa7b8379..764b92f1c2d0 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java +++ b/sdk/resourcemanager/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java @@ -30,7 +30,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc .withoutPrimaryPublicIPAddress() .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(availableSize.name()) // Use the first size .create(); diff --git a/sdk/resourcemanager/azure-resourcemanager/src/test/resources/session-records/AzureResourceManagerTests.testDeployments.json b/sdk/resourcemanager/azure-resourcemanager/src/test/resources/session-records/AzureResourceManagerTests.testDeployments.json index a3a3a10d0bd7..7675046e54c4 100644 --- a/sdk/resourcemanager/azure-resourcemanager/src/test/resources/session-records/AzureResourceManagerTests.testDeployments.json +++ b/sdk/resourcemanager/azure-resourcemanager/src/test/resources/session-records/AzureResourceManagerTests.testDeployments.json @@ -3583,7 +3583,7 @@ "Expires" : "-1", "Content-Length" : "442213", "x-ms-request-id" : "c9227e05-dfe5-42b5-bd7c-8fd17281848f", - "Body" : "{\"value\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy\",\"name\":\"simple_deploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5572566982511788950\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2021-01-19T06:41:28.5466449Z\",\"duration\":\"PT6.7539767S\",\"correlationId\":\"dd392d35-d729-45b7-a6ad-5ce7573bdb02\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"d42c7b9d-a6dd-4119-ab27-173a3f606c58\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/test_deploy\",\"name\":\"test_deploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"15642643252953848480\",\"parameters\":{\"groupLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"groupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appSecret\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botSku\":{\"type\":\"String\",\"value\":\"westus\"},\"newAppServicePlanName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"newAppServicePlanSku\":{\"type\":\"Object\",\"value\":{\"name\":\"S1\",\"tier\":\"Standard\",\"size\":\"S1\",\"family\":\"S\",\"capacity\":1}},\"newAppServicePlanLocation\":{\"type\":\"String\",\"value\":\"\"},\"newWebAppName\":{\"type\":\"String\",\"value\":\"\"},\"slackVerificationToken\":{\"type\":\"String\",\"value\":\"\"},\"slackBotToken\":{\"type\":\"String\",\"value\":\"\"},\"slackClientSigningSecret\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2021-01-19T02:08:26.7466325Z\",\"duration\":\"PT6.6188544S\",\"correlationId\":\"d0b1dbcb-ba26-4317-b6f8-c07c936e4a78\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"resourceGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"resourceType\":\"Microsoft.Resources/resourceGroups\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageDeployment\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"No HTTP resource was found that matches the request URI 'http://localhost:1234/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Resources/resourceGroups/zhoxing-test?api-version=2018-05-01'.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple-template\",\"name\":\"simple-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"6178499644389956004\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"azure-cli-deploy-test-nsg1\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2021-01-18T09:44:40.6671482Z\",\"duration\":\"PT5.7297721S\",\"correlationId\":\"d2adafde-03cb-4387-8189-52ab1954ac21\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"0a2a1272-9dfd-476f-98d9-5fc56428ac2b\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/japaneast-template\",\"name\":\"japaneast-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"66330334233569263\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-12-28T02:35:11.0210177Z\",\"duration\":\"PT3.858351S\",\"correlationId\":\"6661594c-3428-4661-b24e-ba1445485d77\",\"providers\":[{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"scheduledQueryRules\",\"locations\":[\"japaneast\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"LinkedAuthorizationFailed\",\"message\":\"The client has permission to perform action 'microsoft.insights/actiongroups/read' on scope '/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Insights/scheduledQueryRules/armtemplate-alert-japanese-utf8', however the linked subscription '00000000-0000-0000-00000000' was not found. \"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201209143840\",\"name\":\"Microsoft.StorageAccount-20201209143840\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/largefiletest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"8884837994967140257\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"largefiletest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-09T06:40:02.7787226Z\",\"duration\":\"PT35.334902S\",\"correlationId\":\"76aebba0-555a-4e2a-af9f-e6fb74f8b50b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/largefiletest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201209142141\",\"name\":\"Microsoft.StorageAccount-20201209142141\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/bigfiletest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"8884837994967140257\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"bigfiletest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-09T06:23:20.6640647Z\",\"duration\":\"PT1M4.8999807S\",\"correlationId\":\"83c1ba4c-79b5-4431-859d-b1b084d5e717\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/bigfiletest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201207153508\",\"name\":\"Microsoft.StorageAccount-20201207153508\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"16676323329717024192\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-07T07:36:19.2631223Z\",\"duration\":\"PT42.4706589S\",\"correlationId\":\"e2ea5a7b-b1e0-4d39-a41c-28fb3e526aa8\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-19a843bc\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-19a843bc\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1769012333693356871\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-11-20T06:03:42.7642531Z\",\"duration\":\"PT4.4980342S\",\"correlationId\":\"67f9dcd4-d3ae-4810-a19b-71c9b86e0662\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - aiqkmwurjsg3x5k\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/pid-bd911d2b-cf92-472f-aeee-7d1123b36b98\",\"name\":\"pid-bd911d2b-cf92-472f-aeee-7d1123b36b98\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1785727386360713170\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-11-20T05:53:26.0899211Z\",\"duration\":\"PT0.2237105S\",\"correlationId\":\"ed0b4d69-d990-4aa4-a4cf-c02de42c61b5\",\"providers\":[],\"dependencies\":[],\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/mainTemplate.anon\",\"name\":\"mainTemplate.anon\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10732264190512868704\",\"parameters\":{\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"sku\":{\"type\":\"String\",\"value\":\"Basic\"},\"resourceDeploymentRegion\":{\"type\":\"String\",\"value\":\"eastus\"},\"notebookVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_D3_V2\"},\"headClusterVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_NC6\"},\"maxHeadNodes\":{\"type\":\"Int\",\"value\":2},\"workerClusterVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_D2_V2\"},\"maxWorkerNodes\":{\"type\":\"Int\",\"value\":4},\"timeValueForRandomSuffix\":{\"type\":\"String\",\"value\":\"20201120T055316Z\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-11-20T06:04:53.1950966Z\",\"duration\":\"PT11M35.6598321S\",\"correlationId\":\"ed0b4d69-d990-4aa4-a4cf-c02de42c61b5\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]},{\"resourceType\":\"deploymentScripts\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.ContainerRegistry\",\"resourceTypes\":[{\"resourceType\":\"registries\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"eastus\"]},{\"resourceType\":\"virtualNetworks\",\"locations\":[\"eastus\"]},{\"resourceType\":\"virtualNetworks/subnets\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.KeyVault\",\"resourceTypes\":[{\"resourceType\":\"vaults\",\"locations\":[\"eastus\"]},{\"resourceType\":\"vaults/secrets\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.MachineLearningServices\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"eastus\"]},{\"resourceType\":\"workspaces/computes\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Maps\",\"resourceTypes\":[{\"resourceType\":\"accounts\",\"locations\":[\"global\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"eastus\"]},{\"resourceType\":\"sites\",\"locations\":[\"eastus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.ManagedIdentity\",\"resourceTypes\":[{\"resourceType\":\"userAssignedIdentities\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Authorization\",\"resourceTypes\":[{\"resourceType\":\"roleAssignments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/nsgqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"nsgqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/virtualNetworks\",\"resourceName\":\"vnetqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/virtualNetworks\",\"resourceName\":\"vnetqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/nsgqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"nsgqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\",\"apiVersion\":\"2018-02-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/aiqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"aiqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/ciqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/ciqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/head-gpu\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/head-gpu\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/worker-cpu\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/worker-cpu\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/appSPqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"appSPqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2020-02-01-preview\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/AzureMapPrimaryKey\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/AzureMapPrimaryKey\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/STORAGE-ACCOUNT-CONNECTION-STRING\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/STORAGE-ACCOUNT-CONNECTION-STRING\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/APP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/APP-KEY\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2020-02-01-preview\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/MAP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/MAP-KEY\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\",\"apiVersion\":\"2018-11-30\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\",\"apiVersion\":\"2018-02-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/17436b13-0e9f-52cd-93d3-c520957d4b44\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"17436b13-0e9f-52cd-93d3-c520957d4b44\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/APP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/APP-KEY\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/MAP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/MAP-KEY\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/STORAGE-ACCOUNT-CONNECTION-STRING\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/STORAGE-ACCOUNT-CONNECTION-STRING\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"appSiteqkmwurjsg3x5k/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/ciqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/ciqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deploymentScripts/retriveSimulatorCode\",\"resourceType\":\"Microsoft.Resources/deploymentScripts\",\"resourceName\":\"retriveSimulatorCode\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deploymentScripts/configureWebApp\",\"resourceType\":\"Microsoft.Resources/deploymentScripts\",\"resourceName\":\"configureWebApp\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"DeploymentScriptDownloadFailure\",\"message\":\"The deployment script execution failed because the primary or supporting scripts could not be downloaded successfully due to multiple errors. First error:\\r\\nMicrosoft.PowerShell.Commands.HttpResponseException: Response status code does not indicate success: 403 (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.).\\n at System.Management.Automation.MshCommandRuntime.ThrowTerminatingError(ErrorRecord errorRecord)\\r\\nat Start-SystemDeploymentScriptDownloadFile, /mnt/azscripts/azscriptinput/DeploymentScript.ps1: line 69\\r\\nat , /mnt/azscripts/azscriptinput/DeploymentScript.ps1: line 170. Please refer to https://aka.ms/DeploymentScriptsTroubleshoot for more deployment script information.\"},{\"code\":\"DeploymentScriptError\",\"message\":\"The provided script failed with the following error:\\r\\n[Error] Signature verification failed for whatif-webapp-code.zip. Please refer to https://aka.ms/DeploymentScriptsTroubleshoot for more deployment script information.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zx\",\"name\":\"zx\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10662465836138684748\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"provisioningState\":\"Canceled\",\"timestamp\":\"2020-11-03T08:08:27.8712963Z\",\"duration\":\"PT13.251839S\",\"correlationId\":\"949af8ef-8c1f-4794-af5a-71458ce36df8\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/azuredeploy\",\"name\":\"azuredeploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10662465836138684748\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-11-03T08:06:38.3403154Z\",\"duration\":\"PT47.9793905S\",\"correlationId\":\"f1858719-e078-41ff-98b8-3113fca4a2fe\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"Website with given name orderProcessing already exists.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/validate_error_template\",\"name\":\"validate_error_template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"479398563487745336\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-10-26T02:36:22.208154Z\",\"duration\":\"PT35.462768S\",\"correlationId\":\"ffd8d210-0a76-404d-96a7-8a9e5c24c14b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/euwapiptdevst02\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy_multiline\",\"name\":\"simple_deploy_multiline\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"2667423895514669180\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-10-14T09:05:20.6753533Z\",\"duration\":\"PT9.0409803S\",\"correlationId\":\"74eda485-bbc0-402f-a8c1-14aa1a722cbd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"empty\":{\"type\":\"String\",\"value\":\"\"},\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"11cfe367-bf96-4aba-b083-8cb3fca534c4\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test\",\"name\":\"zhoxing-test\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5485076355534486564\",\"parameters\":{\"projectName\":{\"type\":\"String\",\"value\":\"get.it\"},\"getitDatabaseGroupName\":{\"type\":\"String\",\"value\":\"RG-GETIT-DB\"},\"getitDatabaseDeploymentName\":{\"type\":\"String\",\"value\":\"DEPLOY-GETIT-DB\"},\"getitNetworkGroupName\":{\"type\":\"String\",\"value\":\"RG-GETIT-NETWORK\"},\"getitNetworkDeploymentName\":{\"type\":\"String\",\"value\":\"DEPLOY-GETIT-NETWORK\"},\"apimName\":{\"type\":\"String\",\"value\":\"apim-zdf-getit\"},\"apimAdminEmail\":{\"type\":\"String\",\"value\":\"sebastian.gaertner@accso.de\"},\"apimOrgName\":{\"type\":\"String\",\"value\":\"ZDF\"},\"apimProductServiceApiName\":{\"type\":\"String\",\"value\":\"product-api\"},\"apimEditionServiceApiName\":{\"type\":\"String\",\"value\":\"edition-api\"},\"apimResourceServiceApiName\":{\"type\":\"String\",\"value\":\"resource-api\"},\"apimPublicationEventServiceApiName\":{\"type\":\"String\",\"value\":\"publicationevent-api\"},\"apimGroupServiceApiName\":{\"type\":\"String\",\"value\":\"group-api\"},\"apimGraphQLApiName\":{\"type\":\"String\",\"value\":\"graphql-api\"},\"apimProductionApiName\":{\"type\":\"String\",\"value\":\"production-api\"},\"appServerFarmName\":{\"type\":\"String\",\"value\":\"plan-zdf-getit\"},\"logAnalyticsWorkspaceName\":{\"type\":\"String\",\"value\":\"log-zdf-getit-api2\"},\"productServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-product\"},\"productServiceRuntime\":{\"type\":\"String\",\"value\":\"java\"},\"editionServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-edition\"},\"editionServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"resourceServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-resource\"},\"resourceServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"publicationEventServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-publicationevent\"},\"publicationEventServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"groupServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-group\"},\"groupServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"graphQLServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-graphql\"},\"graphQLServiceRuntime\":{\"type\":\"String\",\"value\":\"node\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-08-14T02:33:39.9455691Z\",\"duration\":\"PT12.8454385S\",\"correlationId\":\"835c2bee-c9e0-4662-9152-015fc9a6e646\",\"providers\":[{\"namespace\":\"Microsoft.ApiManagement\",\"resourceTypes\":[{\"resourceType\":\"service\",\"locations\":[\"westus\"]},{\"resourceType\":\"service/tags\",\"locations\":[null]},{\"resourceType\":\"service/apis\",\"locations\":[null]},{\"resourceType\":\"service/apis/tags\",\"locations\":[null]},{\"resourceType\":\"service/subscriptions\",\"locations\":[null]},{\"resourceType\":\"service/products\",\"locations\":[null]},{\"resourceType\":\"service/products/apis\",\"locations\":[null]},{\"resourceType\":\"service/products/policies\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"westus\"]},{\"resourceType\":\"sites\",\"locations\":[\"westus\"]},{\"resourceType\":\"sites/networkConfig\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"westeurope\"]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/publicationEvent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionPermit\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionProposal\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/product\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/product-api/product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/edition\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/edition-api/edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/resource\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/resource-api/resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/publicationEvent\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/publicationevent-api/publicationEvent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/group\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/group-api/group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/graphql\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/graphql-api/graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionPermit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/production-api/productionPermit\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionProposal\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/production-api/productionProposal\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/planit-import\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/planit-import\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/doit-import\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/doit-import\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/policies/policy\",\"resourceType\":\"Microsoft.ApiManagement/service/products/policies\",\"resourceName\":\"apim-zdf-getit/starter/policy\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/policies/policy\",\"resourceType\":\"Microsoft.ApiManagement/service/products/policies\",\"resourceName\":\"apim-zdf-getit/standard/policy\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-product-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-product-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-product-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-product-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-product\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-product/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-edition-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-edition-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-edition-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-edition-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-edition\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-edition/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-resource-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-resource-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-resource-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-resource-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-resource\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-resource/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-publicationevent-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-publicationevent-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-publicationevent-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-publicationevent-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-publicationevent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-publicationevent\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-publicationevent/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-group-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-group-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-group-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-group-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-group\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-group/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-graphql-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-graphql-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-graphql-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-graphql-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-graphql\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-graphql/virtualNetwork\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ServiceAlreadyExists\",\"message\":\"Api service already exists: apim-zdf-getit\"},{\"code\":\"ResourceGroupNotFound\",\"message\":\"Resource group 'RG-GETIT-DB' could not be found.\"},{\"code\":\"ResourceGroupNotFound\",\"message\":\"Resource group 'RG-GETIT-NETWORK' could not be found.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-b2c970b3\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-b2c970b3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"13728839536848772392\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:58.6717661Z\",\"duration\":\"PT6.2505024S\",\"correlationId\":\"15282324-0af8-462b-a510-44af180a9fca\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-group-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-a7cd0d23\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-a7cd0d23\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"11008178750715012999\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:56.3163568Z\",\"duration\":\"PT4.6419329S\",\"correlationId\":\"2982921b-9678-4d4f-a56e-1abf794921b9\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-graphql-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-88d7d7bd\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-88d7d7bd\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"16733204837828727382\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:57.9818234Z\",\"duration\":\"PT6.3610864S\",\"correlationId\":\"45c90228-f8b9-4db0-8c66-76a037085704\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-edition-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-4b72882f\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-4b72882f\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"851689626023111966\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:55.1755059Z\",\"duration\":\"PT3.6922649S\",\"correlationId\":\"e0678ab0-3b3b-4c3e-bcb4-4871660ba044\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-resource-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-3f5366ed\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-3f5366ed\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1561114309446397737\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:55.8251522Z\",\"duration\":\"PT4.9057511S\",\"correlationId\":\"400b209e-8de2-4536-bccd-c070ecd048ec\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-publicationevent-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-4e05da17\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-4e05da17\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"8029190641605507225\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:52.6382412Z\",\"duration\":\"PT2.1789515S\",\"correlationId\":\"bd8ed02e-2208-4dcd-a584-94965af3e707\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-product-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test2\",\"name\":\"zhoxing-test2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.StorageCache/caches/zhoxing-test2\",\"marketplaceItemId\":\"Microsoft.StorageCache\"},\"properties\":{\"templateHash\":\"6137140797134419149\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"subnetName\":{\"type\":\"String\",\"value\":\"default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing\"},\"storageCacheName\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"cacheSizeGB\":{\"type\":\"Int\",\"value\":3072},\"storageCacheSkuName\":{\"type\":\"String\",\"value\":\"Standard_2G\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-08-07T09:42:02.8806214Z\",\"duration\":\"PT11M2.8851179S\",\"correlationId\":\"fbd071b6-cacb-4761-85ce-fb85ddf833ab\",\"providers\":[{\"namespace\":\"Microsoft.StorageCache\",\"resourceTypes\":[{\"resourceType\":\"caches\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"AscInternalError\",\"message\":\"Error encountered deploying the cache.\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200731143851\",\"name\":\"Microsoft.VirtualNetwork-20200731143851\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork\"},\"properties\":{\"templateHash\":\"13381686255721391901\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.12.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.12.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-31T06:39:26.0818169Z\",\"duration\":\"PT13.5092281S\",\"correlationId\":\"9024bd3f-0d65-49a7-b9e9-f76cceea13ef\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing\",\"name\":\"zhoxing\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"9913373836689765749\",\"parameters\":{\"groupLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"groupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appSecret\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botSku\":{\"type\":\"String\",\"value\":\"westus\"},\"newAppServicePlanName\":{\"type\":\"String\",\"value\":\"***\"},\"newAppServicePlanSku\":{\"type\":\"Object\",\"value\":{\"name\":\"S1\",\"tier\":\"Standard\",\"size\":\"S1\",\"family\":\"S\",\"capacity\":1}},\"newAppServicePlanLocation\":{\"type\":\"String\",\"value\":\"\"},\"newWebAppName\":{\"type\":\"String\",\"value\":\"\"},\"slackVerificationToken\":{\"type\":\"String\",\"value\":\"\"},\"slackBotToken\":{\"type\":\"String\",\"value\":\"\"},\"slackClientSigningSecret\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-07-24T02:09:57.2934537Z\",\"duration\":\"PT2.6251093S\",\"correlationId\":\"63a2a95c-8cc3-4b26-b0d1-05c19704468a\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"resourceGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"resourceType\":\"Microsoft.Resources/resourceGroups\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageDeployment\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"No HTTP resource was found that matches the request URI 'http://localhost:1234/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Resources/resourceGroups/zhoxing-test?api-version=2018-05-01'.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache_2\",\"name\":\"redis.cache_2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing3\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"16475047503873081288\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:30:18.0728672Z\",\"duration\":\"PT18M29.2379003S\",\"correlationId\":\"27a8f757-b8ac-440f-8126-c3c867edf7c5\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache_1\",\"name\":\"redis.cache_1\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing2\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"576582858980762143\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:39:22.6586917Z\",\"duration\":\"PT28M3.7821048S\",\"correlationId\":\"02c9224d-e521-4797-8aef-da551e14948d\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache\",\"name\":\"redis.cache\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"6801733663408905830\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:23:16.2959839Z\",\"duration\":\"PT18M21.6882908S\",\"correlationId\":\"4d616a52-417e-4b20-832b-a427dc4fbae7\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/NoMarketplace-20200713174155\",\"name\":\"NoMarketplace-20200713174155\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"10419476445083869131\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest.com\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-13T09:44:06.9606591Z\",\"duration\":\"PT47.6452397S\",\"correlationId\":\"fa90b1a8-96ef-4f44-aba2-13ad7a03d84d\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/NoMarketplace-20200713173655\",\"name\":\"NoMarketplace-20200713173655\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"10419476445083869131\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest.com\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-13T09:38:18.4729953Z\",\"duration\":\"PT50.8715S\",\"correlationId\":\"565d3a98-d796-41ca-856e-5640767142ff\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ApplianceDefinition\",\"name\":\"Microsoft.ApplianceDefinition\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Solutions/applicationDefinitions/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.ApplianceDefinition\"},\"properties\":{\"templateHash\":\"7328759817283875413\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"managementPolicy\":{\"type\":\"Object\",\"value\":{\"mode\":\"Managed\"}},\"lockLevel\":{\"type\":\"String\",\"value\":\"none\"},\"authorizations\":{\"type\":\"Array\",\"value\":[]},\"description\":{\"type\":\"String\",\"value\":\"\"},\"displayName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"packageFileUri\":{\"type\":\"String\",\"value\":\"https://containername.blob.core.windows.net/package.zip\"},\"lockingPolicy\":{\"type\":\"Object\",\"value\":{\"allowedActions\":[]}},\"notificationPolicy\":{\"type\":\"Object\",\"value\":{\"notificationEndpoints\":[]}},\"deploymentPolicy\":{\"type\":\"Object\",\"value\":{\"deploymentMode\":\"Complete\"}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-07-13T08:59:53.7509226Z\",\"duration\":\"PT10.0740069S\",\"correlationId\":\"e0f2cd1b-6183-4bae-9be6-a3b51d824254\",\"providers\":[{\"namespace\":\"Microsoft.Solutions\",\"resourceTypes\":[{\"resourceType\":\"applicationDefinitions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"DownloadItemFromBlobFailed\",\"message\":\"Download of the item from blob at 'https://containername.blob.core.windows.net/package.zip' failed due to a failed connection.\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200617163543\",\"name\":\"Microsoft.StorageAccount-20200617163543\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingpage\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingpage\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-17T08:38:17.9332656Z\",\"duration\":\"PT35.3608729S\",\"correlationId\":\"a6010c85-0ebf-4007-8e00-0a0a553a0cb9\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingpage\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200605161418\",\"name\":\"Microsoft.StorageAccount-20200605161418\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtestv2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtestv2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T08:15:19.9706428Z\",\"duration\":\"PT29.9345928S\",\"correlationId\":\"183bd12b-7ce3-47af-91da-f806eddcaa30\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtestv2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200605161221\",\"name\":\"Microsoft.StorageAccount-20200605161221\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest3\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T08:13:27.2729317Z\",\"duration\":\"PT33.6979316S\",\"correlationId\":\"66cd9283-18a3-42e1-beea-db534516fd09\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test-6511134\",\"name\":\"zhoxing-test-6511134\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.IotHub\",\"provisioningHash\":\"zhoxing-test-6511134\"},\"properties\":{\"templateHash\":\"14500782064966916276\",\"parameters\":{\"hubname\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"sku_name\":{\"type\":\"String\",\"value\":\"S1\"},\"sku_units\":{\"type\":\"String\",\"value\":\"1\"},\"d2c_partitions\":{\"type\":\"String\",\"value\":\"4\"},\"features\":{\"type\":\"String\",\"value\":\"None\"},\"tags\":{\"type\":\"Object\",\"value\":{}},\"cloudEnvironment\":{\"type\":\"String\",\"value\":\"public\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T03:04:26.3289398Z\",\"duration\":\"PT2M45.3270964S\",\"correlationId\":\"23672a2f-a5a0-4935-9e4b-28b954b309e1\",\"providers\":[{\"namespace\":\"Microsoft.Devices\",\"resourceTypes\":[{\"resourceType\":\"IotHubs\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Security\",\"resourceTypes\":[{\"resourceType\":\"IoTSecuritySolutions\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"resourceType\":\"Microsoft.Devices/IotHubs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"resourceType\":\"Microsoft.Devices/IotHubs\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Security/IoTSecuritySolutions/zhoxing-test\",\"resourceType\":\"Microsoft.Security/IoTSecuritySolutions\",\"resourceName\":\"zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Security/IoTSecuritySolutions/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604182734\",\"name\":\"Microsoft.StorageAccount-20200604182734\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest3\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"Storage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T10:28:34.861346Z\",\"duration\":\"PT33.442841S\",\"correlationId\":\"d9cdc3a8-6629-4779-a6f9-a572107da649\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604182518\",\"name\":\"Microsoft.StorageAccount-20200604182518\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"FileStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T10:26:20.9378925Z\",\"duration\":\"PT30.4986271S\",\"correlationId\":\"1bc5999e-8ad1-40eb-9ce9-9bd7f41f2469\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604174616\",\"name\":\"Microsoft.StorageAccount-20200604174616\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"BlockBlobStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T09:47:54.9354542Z\",\"duration\":\"PT31.7385616S\",\"correlationId\":\"b64730bd-3441-40a1-b0c8-8a2a28b2373b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604174207\",\"name\":\"Microsoft.StorageAccount-20200604174207\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T09:44:02.7554567Z\",\"duration\":\"PT36.4150378S\",\"correlationId\":\"2daa0bea-baba-47fd-911d-3f032fcb4f12\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworklink-3d99afdb-b016-4341-b822-35863300404c\",\"name\":\"VirtualNetworklink-3d99afdb-b016-4341-b822-35863300404c\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1961003837028567226\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:23.6683592Z\",\"duration\":\"PT43.4583406S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones/virtualNetworkLinks\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworkLink-20200528103815\",\"name\":\"VirtualNetworkLink-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"17624723031993013323\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:25.2537755Z\",\"duration\":\"PT48.5949876S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/DnsZoneGroup-20200528103815\",\"name\":\"DnsZoneGroup-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"17179788593214746780\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:44.8948026Z\",\"duration\":\"PT8.4190742S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateEndpoints/privateDnsZoneGroups\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3/privateDnsZoneGroups/default\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDnsZone-3d99afdb-b016-4341-b822-35863300404b\",\"name\":\"PrivateDnsZone-3d99afdb-b016-4341-b822-35863300404b\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"2250866243485167996\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:28.9956706Z\",\"duration\":\"PT51.326253S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"name\":\"PrivateDns-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"9908679191686152932\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:32.5715095Z\",\"duration\":\"PT59.4559786S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/UpdateSubnetDeployment-20200528103815\",\"name\":\"UpdateSubnetDeployment-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"16875532642000494520\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:39:49.6423303Z\",\"duration\":\"PT9.8150316S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"virtualNetworks/subnets\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.PrivateEndpoint-20200528103530\",\"name\":\"Microsoft.PrivateEndpoint-20200528103530\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"12801401672929746764\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"privateEndpointName\":{\"type\":\"String\",\"value\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},\"privateLinkResource\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"},\"targetSubResource\":{\"type\":\"Array\",\"value\":[\"table\"]},\"requestMessage\":{\"type\":\"String\",\"value\":\"\"},\"subnet\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest\"},\"virtualNetworkResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subnetDeploymentName\":{\"type\":\"String\",\"value\":\"UpdateSubnetDeployment-20200528103815\"},\"privateDnsDeploymentName\":{\"type\":\"String\",\"value\":\"PrivateDns-20200528103815\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:30.7104493Z\",\"duration\":\"PT3M0.9325005S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateEndpoints\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/UpdateSubnetDeployment-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"UpdateSubnetDeployment-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworkLink-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"VirtualNetworkLink-20200528103815\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/DnsZoneGroup-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DnsZoneGroup-20200528103815\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3/privateDnsZoneGroups/default\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200528103154\",\"name\":\"Microsoft.VirtualNetwork-20200528103154\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork-ARM\"},\"properties\":{\"templateHash\":\"7310725565247910838\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.17.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.17.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:34:12.7114768Z\",\"duration\":\"PT21.3925748S\",\"correlationId\":\"7f24cb63-adb7-4672-8138-4dce3757aa9b\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ContainerRegistry\",\"name\":\"Microsoft.ContainerRegistry\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.ContainerRegistry/registries/zhoxingtest/webhooks/zhoxingtest\"},\"properties\":{\"templateHash\":\"8202610767534201205\",\"parameters\":{\"registryName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"webhookName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"webhookLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"webhookApiVersion\":{\"type\":\"String\",\"value\":\"2019-12-01-preview\"},\"serviceUri\":{\"type\":\"SecureString\"},\"customHeaders\":{\"type\":\"SecureObject\"},\"actions\":{\"type\":\"Array\",\"value\":[\"push\"]},\"status\":{\"type\":\"String\",\"value\":\"enabled\"},\"scope\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-14T05:47:58.9717589Z\",\"duration\":\"PT17.5659974S\",\"correlationId\":\"c4fc9e92-912e-465f-8469-2342255d2335\",\"providers\":[{\"namespace\":\"Microsoft.ContainerRegistry\",\"resourceTypes\":[{\"resourceType\":\"registries/webhooks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ContainerRegistry/registries/zhoxingtest/webhooks/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/lumagatena.resourcescheduler-20200514132040\",\"name\":\"lumagatena.resourcescheduler-20200514132040\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"marketplaceItemId\":\"lumagatena.resourceschedulerent\"},\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/lumagatena.resourcescheduler-b0655f11-493e-40aa-b54e-9229ae04f5fc-ent/Artifacts/DefaultTemplate\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"17406019195718949633\",\"parameters\":{\"resourcePrefix\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"appInsightsLocation\":{\"type\":\"String\",\"value\":\"westcentralus\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"_artifactsLocation\":{\"type\":\"String\",\"value\":\"https://catalogartifact.azureedge.net/publicartifacts/lumagatena.resourcescheduler-b0655f11-493e-40aa-b54e-9229ae04f5fc-ent/Artifacts/DefaultTemplate\"},\"_artifactsLocationSasToken\":{\"type\":\"SecureString\"},\"applicationResourceName\":{\"type\":\"String\",\"value\":\"ManagedResourceScheduler\"},\"managedResourceGroupId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mrg-resourcescheduler-20200514132040\"},\"managedIdentity\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-05-14T05:28:41.6327612Z\",\"duration\":\"PT12.101002S\",\"correlationId\":\"315b4dd9-a0ca-4dc8-a455-0a0cbc76bc9b\",\"providers\":[{\"namespace\":\"Microsoft.Solutions\",\"resourceTypes\":[{\"resourceType\":\"applications\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"ResourcePurchaseValidationFailed\",\"message\":\"User failed validation to purchase resources. Error message: '{\\\"error\\\":{\\\"code\\\":\\\"AccountSetupError\\\",\\\"message\\\":\\\"You cannot purchase reservation because required AAD tenant information is missing. Please ask your tenant admin to fill this form: https://aka.ms/orgprofile\\\"}}'\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.LogAnalyticsOMS\",\"name\":\"Microsoft.LogAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test11\",\"marketplaceItemId\":\"Microsoft.LogAnalyticsOMS\"},\"properties\":{\"templateHash\":\"11463598216708868146\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test11\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"sku\":{\"type\":\"String\",\"value\":\"pergb2018\"},\"tags\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-11T02:46:11.2613852Z\",\"duration\":\"PT27.5799751S\",\"correlationId\":\"ef0d9b73-6d41-4e4a-8d72-14bb23335fbe\",\"providers\":[{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test11\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/mainTemplate\",\"name\":\"mainTemplate\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3218180314351156874\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-06T08:12:40.0695696Z\",\"duration\":\"PT3.0700022S\",\"correlationId\":\"780ef5f1-25d3-427c-b4f8-065b75ebd193\",\"providers\":[],\"dependencies\":[],\"outputs\":{\"deploymentOutput\":{\"type\":\"Object\",\"value\":{\"name\":\"mainTemplate\",\"properties\":{\"template\":{\"$schema\":\"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\"contentVersion\":\"1.0.0.0\",\"resources\":[],\"outputs\":{\"deploymentOutput\":{\"type\":\"Object\",\"value\":\"[deployment()]\"}}},\"templateHash\":\"3218180314351156874\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Accepted\"}}}},\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/specially-encoded-template\",\"name\":\"specially-encoded-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1888782782781528452\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-04-30T07:03:23.7207451Z\",\"duration\":\"PT4.0436353S\",\"correlationId\":\"bfb6b403-aaf7-45fa-a24f-d6f55381b616\",\"providers\":[{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"scheduledQueryRules\",\"locations\":[\"japaneast\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"LinkedAuthorizationFailed\",\"message\":\"The client has permission to perform action 'microsoft.insights/actiongroups/read' on scope '/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Insights/scheduledQueryRules/armtemplate-alert-japanese-utf8', however the linked subscription '{subscriptionId}' was not found. \"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421145256\",\"name\":\"Microsoft.StorageAccount-20200421145256\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T06:54:42.0368957Z\",\"duration\":\"PT33.1713846S\",\"correlationId\":\"41acf011-d899-4a7d-afa8-cb184a71b868\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421145114\",\"name\":\"Microsoft.StorageAccount-20200421145114\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount-ARM\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T06:53:03.6973431Z\",\"duration\":\"PT32.8398506S\",\"correlationId\":\"e599a79d-ca38-4d53-a312-783dcd52892b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421134632\",\"name\":\"Microsoft.StorageAccount-20200421134632\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"FileStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T05:51:14.8318342Z\",\"duration\":\"PT34.9084997S\",\"correlationId\":\"3027cf64-8a93-4cfe-b676-0cc36f44cd62\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200420165822\",\"name\":\"Microsoft.StorageAccount-20200420165822\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"1076588640741720503\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"isHnsEnabled\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-20T09:02:06.2473506Z\",\"duration\":\"PT2M4.9663424S\",\"correlationId\":\"f0fc9ae7-540f-4024-9599-910ec442b728\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AlertManagementOMS\",\"name\":\"Microsoft.AlertManagementOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AlertManagement(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.AlertManagementOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AlertManagementOMS.1.0.21/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AlertManagement\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-20T02:46:25.1922657Z\",\"duration\":\"PT10.0635592S\",\"correlationId\":\"ff16ce44-6269-4887-8657-1339b2c0e993\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AlertManagement(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/CreateVm-Canonical.UbuntuServer-18.04-LTS-20200417160045\",\"name\":\"CreateVm-Canonical.UbuntuServer-18.04-LTS-20200417160045\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualMachine\",\"provisioningHash\":\"SolutionProvider\"},\"properties\":{\"templateHash\":\"7172804404965899907\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"networkInterfaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test801\"},\"subnetName\":{\"type\":\"String\",\"value\":\"default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing-test\"},\"virtualMachineName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"virtualMachineRG\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"osDiskType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"virtualMachineSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagnosticsStorageAccountName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"diagnosticsStorageAccountId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-17T08:04:15.7864236Z\",\"duration\":\"PT48.1102756S\",\"correlationId\":\"01ac1c40-8120-4df9-bf04-a1e246c34fba\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test801\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test801\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"resourceType\":\"Microsoft.Compute/virtualMachines\",\"resourceName\":\"zhoxing-test\"}],\"outputs\":{\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test801\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/SolutionDeployment-20200416192508\",\"name\":\"SolutionDeployment-20200416192508\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3423151013820430908\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-16T17:23:55.056176Z\",\"duration\":\"PT9.5703329S\",\"correlationId\":\"ad2ceb37-60e5-4809-aea7-536c8da31de2\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"australiacentral\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/ContainerInsights(zhoxing-test2)\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200415165139\",\"name\":\"Microsoft.StorageAccount-20200415165139\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"11961669741847493773\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-15T08:54:38.0110053Z\",\"duration\":\"PT1M43.6998278S\",\"correlationId\":\"b693853a-6a38-4b8f-87bc-f5d2f6fe889d\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ContainersOMS\",\"name\":\"Microsoft.ContainersOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/Containers(zhoxing-workspace)\",\"marketplaceItemId\":\"Microsoft.ContainersOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.ContainersOMS.1.1.16/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-workspace\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"Containers\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-11T07:47:27.1639894Z\",\"duration\":\"PT17.5510901S\",\"correlationId\":\"f4dcc639-0fc4-4282-aa8d-ffc272fceb81\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/Containers(zhoxing-workspace)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AzureActivityOMS\",\"name\":\"Microsoft.AzureActivityOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureActivity(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.AzureActivityOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AzureActivityOMS.1.0.24/Artifacts/CreateResourcesDS2.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"2824832969719392094\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AzureActivity\"]},\"subscriptions\":{\"type\":\"Array\",\"value\":[{\"name\":\"0b1f64711bf04ddaaec3cb9272f09590\",\"value\":\"00000000-0000-0000-0000-000000000000\"}]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:33:45.2430768Z\",\"duration\":\"PT59.8719665S\",\"correlationId\":\"3e4ddc68-cf08-4767-9be7-60d8afb66c51\",\"providers\":[{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"westus\"]},{\"resourceType\":\"workspaces/datasources\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test/datasources/0b1f64711bf04ddaaec3cb9272f09590\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces/datasources\",\"resourceName\":\"zhoxing-test/0b1f64711bf04ddaaec3cb9272f09590\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test/datasources/0b1f64711bf04ddaaec3cb9272f09590\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureActivity(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.KeyVaultAnalyticsOMS\",\"name\":\"Microsoft.KeyVaultAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/KeyVaultAnalytics(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.KeyVaultAnalyticsOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.KeyVaultAnalyticsOMS.1.0.3/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"KeyVaultAnalytics\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:31:14.5063619Z\",\"duration\":\"PT1M57.3764608S\",\"correlationId\":\"e06589b6-9999-46b0-acd8-746d94a7929e\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/KeyVaultAnalytics(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AzureSQLAnalyticsOMS\",\"name\":\"Microsoft.AzureSQLAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureSQLAnalytics(zhoxing-test2)\",\"marketplaceItemId\":\"Microsoft.AzureSQLAnalyticsOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AzureSQLAnalyticsOMS.1.0.4/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"australiacentral\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AzureSQLAnalytics\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:28:49.7614647Z\",\"duration\":\"PT14.0840378S\",\"correlationId\":\"e9334b54-aa8b-40f6-aa91-57407411b296\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"australiacentral\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureSQLAnalytics(zhoxing-test2)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.RecoveryServicesV2\",\"name\":\"Microsoft.RecoveryServicesV2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.RecoveryServices/vaults/zhoxing-test3\",\"marketplaceItemId\":\"Microsoft.RecoveryServices\"},\"properties\":{\"templateHash\":\"3053162932619023657\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test3\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2016-06-01\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T06:25:27.3405945Z\",\"duration\":\"PT1M48.3942152S\",\"correlationId\":\"2deaa1e6-0adc-46a3-b111-fe8f37f1b398\",\"providers\":[{\"namespace\":\"Microsoft.RecoveryServices\",\"resourceTypes\":[{\"resourceType\":\"vaults\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.RecoveryServices/vaults/zhoxing-test3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AutomationAccount\",\"name\":\"Microsoft.AutomationAccount\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"marketplaceItemId\":\"Microsoft.AutomationAccount\"},\"properties\":{\"templateHash\":\"5138374320965475375\",\"parameters\":{\"accountName\":{\"type\":\"String\",\"value\":\"zhoxingtest-account\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"sampleGraphicalRunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorial\"},\"sampleGraphicalRunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"sampleGraphicalRunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorial.graphrunbook\"},\"samplePowerShellRunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorialScript\"},\"samplePowerShellRunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"samplePowerShellRunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorial.ps1\"},\"samplePython2RunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorialPython2\"},\"samplePython2RunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"samplePython2RunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorialPython2.py\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-07T05:48:49.7005559Z\",\"duration\":\"PT18.8833457S\",\"correlationId\":\"ee614d1b-52ab-4ef0-afdf-d922915f2b3e\",\"providers\":[{\"namespace\":\"Microsoft.Automation\",\"resourceTypes\":[{\"resourceType\":\"automationAccounts\",\"locations\":[\"westus\"]},{\"resourceType\":\"automationAccounts/runbooks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorial\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorial\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialScript\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorialScript\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialPython2\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorialPython2\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorial\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialPython2\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialScript\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment2\",\"name\":\"vmDiagDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:42.5985993Z\",\"duration\":\"PT1M26.6277747S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgSQL-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment0\",\"name\":\"vmDiagDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:11.4939667Z\",\"duration\":\"PT56.0439465S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgProv-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment3\",\"name\":\"vmDiagDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:58:54.7494606Z\",\"duration\":\"PT1M20.2135439S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgSSIS-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment1\",\"name\":\"vmDiagDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:07.2319602Z\",\"duration\":\"PT2M38.7113347S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgBridge-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"name\":\"vmDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:57:30.3562117Z\",\"duration\":\"PT1M29.1949855S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"name\":\"vmDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:56:55.9936166Z\",\"duration\":\"PT1M3.9200963S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"name\":\"vmDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:57:34.837224Z\",\"duration\":\"PT1M48.2756885S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"name\":\"vmDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:56:23.0087151Z\",\"duration\":\"PT51.2902622S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"name\":\"nicDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:37.7038947Z\",\"duration\":\"PT17.584134S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgProv-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"name\":\"nicDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:25.6276069Z\",\"duration\":\"PT5.5078479S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgBridge-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"name\":\"nicDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:29.9412006Z\",\"duration\":\"PT9.825009S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSQL-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"name\":\"nicDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:30.4694553Z\",\"duration\":\"PT10.630804S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSSIS-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"name\":\"vnetDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualNetworks.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"5494195655921763108\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"idgAppVnetCidr\":{\"type\":\"String\",\"value\":\"192.168.1.0/24\"},\"dnsServer\":{\"type\":\"String\",\"value\":\"127.0.0.1\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:05.4129775Z\",\"duration\":\"PT2M41.4654211S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"virtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/IdgApp-vnet\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/pid-da2390a8-7157-4348-8621-c0976bd5f1c6\",\"name\":\"pid-da2390a8-7157-4348-8621-c0976bd5f1c6\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1785727386360713170\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:51:50.5099687Z\",\"duration\":\"PT1.8954266S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[],\"dependencies\":[],\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nsgDeployment\",\"name\":\"nsgDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkSecurityGroups.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10642932090194121923\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:52:13.8036944Z\",\"duration\":\"PT25.4723982S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/IdgApp-nsg\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"name\":\"storageAcctDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/storageAccounts.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"18339431791584614211\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:53:52.4748921Z\",\"duration\":\"PT2M4.9763098S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/imprivatainc1580479939967.imprivata-identity-gove-20200403164818\",\"name\":\"imprivatainc1580479939967.imprivata-identity-gove-20200403164818\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test\",\"marketplaceItemId\":\"imprivatainc1580479939967.imprivata-identity-governance-solutionidgstandardplan\"},\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/mainTemplate.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"859551663346694352\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"idgAppVnetCidr\":{\"type\":\"String\",\"value\":\"192.168.1.0/24\"},\"dnsServer\":{\"type\":\"String\",\"value\":\"127.0.0.1\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"_artifactsLocation\":{\"type\":\"String\",\"value\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/mainTemplate.json\"},\"_artifactsLocationSasToken\":{\"type\":\"SecureString\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T09:01:06.5682687Z\",\"duration\":\"PT9M29.2016413S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nsgDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nsgDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment0\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment1\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment2\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment3\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment0\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment1\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment2\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment3\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgBridge-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgProv-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSQL-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSSIS-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/IdgApp-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/IdgApp-vnet\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy_template\",\"name\":\"simple_deploy_template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3058235493749754305\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"test-lb\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"privateIPAllocationMethod\":{\"type\":\"String\",\"value\":\"Dynamic\"},\"tags\":{\"type\":\"Object\",\"value\":{\"key\":\"super=value\"}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-04-02T03:06:24.1818395Z\",\"duration\":\"PT14.8233657S\",\"correlationId\":\"ca708581-b371-4382-a6d6-5abec0f80d25\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"loadBalancers\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"InvalidTemplate\",\"message\":\"Unable to process template language expressions for resource '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/loadBalancers/test-lb' at line '1' and column '319'. 'The template parameter 'backendAddressPools' is not found. Please see https://aka.ms/arm-template/#parameters for usage details.'\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.CDN-Profilee5b1f1ba-1864-485e-9ad6-f8bd9a3ce039\",\"name\":\"Microsoft.CDN-Profilee5b1f1ba-1864-485e-9ad6-f8bd9a3ce039\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/microsoft.cdn/profiles/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.CDN\"},\"properties\":{\"templateHash\":\"14732945376673591230\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"Global\"},\"sku\":{\"type\":\"Object\",\"value\":{\"name\":\"Standard_Microsoft\"}},\"properties\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-02T03:06:06.8118181Z\",\"duration\":\"PT27.868616S\",\"correlationId\":\"ec814e94-c7c8-415e-b86f-9d7d9365a8e2\",\"providers\":[{\"namespace\":\"microsoft.cdn\",\"resourceTypes\":[{\"resourceType\":\"profiles\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.cdn/profiles/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-2f67a819-99c8\",\"name\":\"Microsoft.Web-WebApp-Portal-2f67a819-99c8\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"46673888788683167\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"DOTNETCORE|3.1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-21T05:03:38.610818Z\",\"duration\":\"PT1M56.1369546S\",\"correlationId\":\"23ea4696-8e18-4ddb-a5b6-41d7796bee9b\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.SSL\",\"name\":\"Microsoft.SSL\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.SSL\"},\"properties\":{\"templateHash\":\"12688158336463581370\",\"parameters\":{\"certificateOrderName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"distinguishedName\":{\"type\":\"String\",\"value\":\"CN=azure.com\"},\"validityInYears\":{\"type\":\"Int\",\"value\":1},\"productType\":{\"type\":\"String\",\"value\":\"StandardDomainValidatedSsl\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-16T02:40:16.9924212Z\",\"duration\":\"PT2M46.4663723S\",\"correlationId\":\"9471490e-7e59-467d-8f14-48f8ccd95222\",\"providers\":[{\"namespace\":\"Microsoft.CertificateRegistration\",\"resourceTypes\":[{\"resourceType\":\"certificateOrders\",\"locations\":[\"global\"]},{\"resourceType\":\"certificateOrders/providers/locks\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\",\"resourceType\":\"Microsoft.CertificateRegistration/certificateOrders\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test/providers/Microsoft.Authorization/locks/zhoxing-test\",\"resourceType\":\"Microsoft.CertificateRegistration/certificateOrders/providers/locks\",\"resourceName\":\"zhoxing-test/Microsoft.Authorization/zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test/providers/Microsoft.Authorization/locks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-a6e35847-84dc\",\"name\":\"Microsoft.Web-WebApp-Portal-a6e35847-84dc\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"3507869378131688434\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test3\"},\"location\":{\"type\":\"String\",\"value\":\"North Europe\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-a4dc\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"sku\":{\"type\":\"String\",\"value\":\"PremiumV2\"},\"skuCode\":{\"type\":\"String\",\"value\":\"P1v2\"},\"workerSize\":{\"type\":\"String\",\"value\":\"3\"},\"workerSizeId\":{\"type\":\"String\",\"value\":\"3\"},\"numberOfWorkers\":{\"type\":\"String\",\"value\":\"1\"},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"TOMCAT|8.5-java11\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:44:30.0394772Z\",\"duration\":\"PT2M14.3998742S\",\"correlationId\":\"e9c6365d-1b9d-47cb-88bc-2ff7a7aef6e2\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"northeurope\"]},{\"resourceType\":\"serverfarms\",\"locations\":[\"northeurope\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-a4dc\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-zhoxingtest-a4dc\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"zhoxing-test3\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-a4dc\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Azconfig_1\",\"name\":\"Microsoft.Azconfig_1\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxig-test\",\"marketplaceItemId\":\"Microsoft.Azconfig\"},\"properties\":{\"templateHash\":\"7820839542378675066\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxig-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2019-11-01-preview\"},\"sku\":{\"type\":\"String\",\"value\":\"standard\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:37:48.9475481Z\",\"duration\":\"PT1M9.4420097S\",\"correlationId\":\"309d8e1f-d83b-41af-a2b4-4fc2b8cf01f8\",\"providers\":[{\"namespace\":\"Microsoft.AppConfiguration\",\"resourceTypes\":[{\"resourceType\":\"configurationStores\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxig-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Azconfig\",\"name\":\"Microsoft.Azconfig\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.Azconfig\"},\"properties\":{\"templateHash\":\"7820839542378675066\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2019-11-01-preview\"},\"sku\":{\"type\":\"String\",\"value\":\"standard\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:36:45.6118614Z\",\"duration\":\"PT42.8616547S\",\"correlationId\":\"f6250c7e-1445-48f4-9a75-cb108ec016f2\",\"providers\":[{\"namespace\":\"Microsoft.AppConfiguration\",\"resourceTypes\":[{\"resourceType\":\"configurationStores\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-79a51ab5-9a12\",\"name\":\"Microsoft.Web-WebApp-Portal-79a51ab5-9a12\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test2\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"17885055924378240489\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"JAVA|11-java11\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T07:58:15.4849103Z\",\"duration\":\"PT2M54.4266008S\",\"correlationId\":\"f548362c-5720-4a35-aff0-6d85c593147b\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200306160007\",\"name\":\"Microsoft.VirtualNetwork-20200306160007\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork-ARM\"},\"properties\":{\"templateHash\":\"417543149591126485\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.13.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.13.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-06T08:01:51.58624Z\",\"duration\":\"PT52.5208802S\",\"correlationId\":\"7edf093d-47e5-491f-9168-3824b2f63bfe\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/template-file\",\"name\":\"template-file\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"702802757667029667\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{\"CI\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"1\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"},\"DEV\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"},\"QA\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"},\"STG\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"},\"TRN\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"},\"PROD\":{\"AzureWebJobsStorage\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsDashboard\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureWebJobsServiceBusSource\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ApplicationServiceBus\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MenuDataMobileDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDPDbConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbEndPointUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"OrdersDocDbAuthKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FunctionsAppKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"CosmosDBConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.MoBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.X-Company-Id\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.keyId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.secretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Xpient.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceEndpoint\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.MaxLane\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ShareFolderName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.ConnectionString\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"AzureStorage.OrderMenuFolder\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternateUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.UserId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.AlternatePort\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.ReversalTimeout\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Givex.MaxGiftCardBalance\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.BaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.SecretKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Paypal.Scope\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Cancel\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl.Return\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RedirectUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"PayPal.RefreshTokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"stripeapikeyprivatekey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeApiKeyPubKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"RetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"StripeCardLimit\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SignalNotificationHubUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"NotificationHubName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultFullSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DefaultListenSharedAccessSignature\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LoyaltyWebserviceAddress\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EnableValidation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"MaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.PortalBaseUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.BasicAuthenticationKey\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"DeploymentEnv\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.HonorLocalPriceCalculation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.DefaultItemQuantity\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.Terminal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Aloha.ValidateFailedItems\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"POS.ThresholdPercent\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.TokenUrl\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientId.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"IDP.ClientSecret.Internal\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"FromName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"SupportEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.UserName\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"LogOrderStep\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"EmergencyClosureMinutesToCancellation\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"ServiceBusMaxRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\",\"XpientMaxOrderRetryCount\":\"qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"}}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-03-04T10:14:30.6077838Z\",\"duration\":\"PT2M24.8861662S\",\"correlationId\":\"08fd1339-c062-4621-bef4-5e08fdc0c2c0\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"Website with given name orderProcessing already exists.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200303110739\",\"name\":\"Microsoft.StorageAccount-20200303110739\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount-ARM\"},\"properties\":{\"templateHash\":\"11961669741847493773\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-03T03:10:37.6643123Z\",\"duration\":\"PT2M0.5505696S\",\"correlationId\":\"7052b29c-5b03-4e4f-8454-72c45a2e3cdd\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-c5af8169\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-c5af8169\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5172196015951101467\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-27T08:34:39.2688632Z\",\"duration\":\"PT14.8304657S\",\"correlationId\":\"71919fa6-53e8-4069-bcf1-fe70e2bbd3ab\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - appInsights-6472qnxl3vv5o\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/ManagedDisk.zhoxing-test-20200226171012\",\"name\":\"ManagedDisk.zhoxing-test-20200226171012\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"},\"properties\":{\"templateHash\":\"12039005862602491955\",\"parameters\":{\"diskName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"sku\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"diskSizeGb\":{\"type\":\"Int\",\"value\":1024},\"sourceResourceId\":{\"type\":\"String\",\"value\":\"\"},\"sourceUri\":{\"type\":\"String\",\"value\":\"\"},\"osType\":{\"type\":\"String\",\"value\":\"\"},\"createOption\":{\"type\":\"String\",\"value\":\"empty\"},\"hyperVGeneration\":{\"type\":\"String\",\"value\":\"V1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T09:11:00.2182814Z\",\"duration\":\"PT38.6717939S\",\"correlationId\":\"3f30fb4e-5cd6-4d09-a86e-fe409e7cbf7f\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"disks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/CreateVm-Canonical.UbuntuServer-18.04-LTS-20200226163817\",\"name\":\"CreateVm-Canonical.UbuntuServer-18.04-LTS-20200226163817\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualMachine\",\"provisioningHash\":\"SolutionProvider\"},\"properties\":{\"templateHash\":\"1155335703276677740\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"networkInterfaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test115\"},\"networkSecurityGroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test-nsg\"},\"networkSecurityGroupRules\":{\"type\":\"Array\",\"value\":[{\"name\":\"SSH\",\"properties\":{\"priority\":300,\"protocol\":\"TCP\",\"access\":\"Allow\",\"direction\":\"Inbound\",\"sourceAddressPrefix\":\"*\",\"sourcePortRange\":\"*\",\"destinationAddressPrefix\":\"*\",\"destinationPortRange\":\"22\"}}]},\"subnetName\":{\"type\":\"String\",\"value\":\"Dtlzhoxing-testSubnet\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/Dtlzhoxing-test\"},\"publicIpAddressName\":{\"type\":\"String\",\"value\":\"zhoxing-test-ip\"},\"publicIpAddressType\":{\"type\":\"String\",\"value\":\"Dynamic\"},\"publicIpAddressSku\":{\"type\":\"String\",\"value\":\"Basic\"},\"virtualMachineName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"virtualMachineRG\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"osDiskType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"ephemeralDiskType\":{\"type\":\"String\",\"value\":\"Local\"},\"virtualMachineSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPublicKey\":{\"type\":\"SecureString\"},\"diagnosticsStorageAccountName\":{\"type\":\"String\",\"value\":\"azhoxingtest9851\"},\"diagnosticsStorageAccountId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/azhoxingtest9851\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T08:51:00.5987566Z\",\"duration\":\"PT5M19.5821373S\",\"correlationId\":\"e1c52866-133b-46c5-b44f-4b189342f502\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"westus\"]},{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"publicIpAddresses\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test-nsg\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"zhoxing-test-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/publicIpAddresses/zhoxing-test-ip\",\"resourceType\":\"Microsoft.Network/publicIpAddresses\",\"resourceName\":\"zhoxing-test-ip\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test115\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test115\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"resourceType\":\"Microsoft.Compute/virtualMachines\",\"resourceName\":\"zhoxing-test\"}],\"outputs\":{\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/publicIpAddresses/zhoxing-test-ip\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ManagedDisk-20200226152558\",\"name\":\"Microsoft.ManagedDisk-20200226152558\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.ManagedDisk\"},\"properties\":{\"templateHash\":\"12039005862602491955\",\"parameters\":{\"diskName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"sku\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"diskSizeGb\":{\"type\":\"Int\",\"value\":1024},\"sourceResourceId\":{\"type\":\"String\",\"value\":\"\"},\"sourceUri\":{\"type\":\"String\",\"value\":\"\"},\"osType\":{\"type\":\"String\",\"value\":\"\"},\"createOption\":{\"type\":\"String\",\"value\":\"empty\"},\"hyperVGeneration\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T07:29:17.6989646Z\",\"duration\":\"PT1M45.6036662S\",\"correlationId\":\"a3b05ab7-7067-42de-8a8f-69fb50d29cd6\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"disks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-f2c320be\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-f2c320be\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"13072379069581100190\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-25T07:05:18.4469125Z\",\"duration\":\"PT1M34.5604185S\",\"correlationId\":\"f8973acb-0579-488d-8030-394695952ab2\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-FunctionApp-Portal-6d97c7e0-9fde\",\"name\":\"Microsoft.Web-FunctionApp-Portal-6d97c7e0-9fde\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.FunctionApp\",\"provisioningHash\":\"customize-to-open-functionapp-iframe-blade\"},\"properties\":{\"templateHash\":\"9962553435085722188\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"storageAccountName\":{\"type\":\"String\",\"value\":\"storageaccountzhoxib2a8\"},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"DOCKER|mcr.microsoft.com/azure-functions/python:2.0-python3.7-appservice\"},\"sku\":{\"type\":\"String\",\"value\":\"PremiumV2\"},\"skuCode\":{\"type\":\"String\",\"value\":\"P1v2\"},\"workerSize\":{\"type\":\"String\",\"value\":\"3\"},\"workerSizeId\":{\"type\":\"String\",\"value\":\"3\"},\"numberOfWorkers\":{\"type\":\"String\",\"value\":\"1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-25T06:57:31.252644Z\",\"duration\":\"PT4M23.4856285S\",\"correlationId\":\"84740008-300c-4c04-9d61-fd48d35228fe\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]},{\"resourceType\":\"serverfarms\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"microsoft.insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-b6db\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-zhoxingtest-b6db\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"storageaccountzhoxib2a8\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"zhoxing-test\",\"apiVersion\":\"2015-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"storageaccountzhoxib2a8\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-b6db\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.DevTestLab.15822636708715723\",\"name\":\"Microsoft.DevTestLab.15822636708715723\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.DevTestLab\"},\"properties\":{\"templateHash\":\"12517873995286308294\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"regionId\":{\"type\":\"String\",\"value\":\"westus\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-21T05:45:01.3414833Z\",\"duration\":\"PT2M52.6804059S\",\"correlationId\":\"95ef1f49-1b94-40e5-ae49-7bd3dd57aca7\",\"providers\":[{\"namespace\":\"Microsoft.DevTestLab\",\"resourceTypes\":[{\"resourceType\":\"labs\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/schedules\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/virtualNetworks\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/artifactSources\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/schedules/LabVmsShutdown\",\"resourceType\":\"Microsoft.DevTestLab/labs/schedules\",\"resourceName\":\"zhoxing-test/LabVmsShutdown\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/virtualNetworks/Dtlzhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs/virtualNetworks\",\"resourceName\":\"zhoxing-test/Dtlzhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/artifactSources/Public Environment Repo\",\"resourceType\":\"Microsoft.DevTestLab/labs/artifactSources\",\"resourceName\":\"zhoxing-test/Public Environment Repo\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/artifactSources/Public Environment Repo\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/schedules/LabVmsShutdown\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/virtualNetworks/Dtlzhoxing-test\"}],\"validationLevel\":\"Template\"}}]}", + "Body" : "{\"value\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy\",\"name\":\"simple_deploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5572566982511788950\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2021-01-19T06:41:28.5466449Z\",\"duration\":\"PT6.7539767S\",\"correlationId\":\"dd392d35-d729-45b7-a6ad-5ce7573bdb02\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"d42c7b9d-a6dd-4119-ab27-173a3f606c58\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"a2027f19-4096-4bd3-8e6d-ac77b3996ead\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/test_deploy\",\"name\":\"test_deploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"15642643252953848480\",\"parameters\":{\"groupLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"groupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appSecret\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botSku\":{\"type\":\"String\",\"value\":\"westus\"},\"newAppServicePlanName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"newAppServicePlanSku\":{\"type\":\"Object\",\"value\":{\"name\":\"S1\",\"tier\":\"Standard\",\"size\":\"S1\",\"family\":\"S\",\"capacity\":1}},\"newAppServicePlanLocation\":{\"type\":\"String\",\"value\":\"\"},\"newWebAppName\":{\"type\":\"String\",\"value\":\"\"},\"slackVerificationToken\":{\"type\":\"String\",\"value\":\"\"},\"slackBotToken\":{\"type\":\"String\",\"value\":\"\"},\"slackClientSigningSecret\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2021-01-19T02:08:26.7466325Z\",\"duration\":\"PT6.6188544S\",\"correlationId\":\"d0b1dbcb-ba26-4317-b6f8-c07c936e4a78\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"resourceGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"resourceType\":\"Microsoft.Resources/resourceGroups\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageDeployment\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"No HTTP resource was found that matches the request URI 'http://localhost:1234/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Resources/resourceGroups/zhoxing-test?api-version=2018-05-01'.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple-template\",\"name\":\"simple-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"6178499644389956004\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"azure-cli-deploy-test-nsg1\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2021-01-18T09:44:40.6671482Z\",\"duration\":\"PT5.7297721S\",\"correlationId\":\"d2adafde-03cb-4387-8189-52ab1954ac21\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"0a2a1272-9dfd-476f-98d9-5fc56428ac2b\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"a6fd36f8-48be-4be7-a0ef-260620061faf\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/azure-cli-deploy-test-nsg1\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/japaneast-template\",\"name\":\"japaneast-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"66330334233569263\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-12-28T02:35:11.0210177Z\",\"duration\":\"PT3.858351S\",\"correlationId\":\"6661594c-3428-4661-b24e-ba1445485d77\",\"providers\":[{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"scheduledQueryRules\",\"locations\":[\"japaneast\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"LinkedAuthorizationFailed\",\"message\":\"The client has permission to perform action 'microsoft.insights/actiongroups/read' on scope '/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Insights/scheduledQueryRules/armtemplate-alert-japanese-utf8', however the linked subscription '00000000-0000-0000-00000000' was not found. \"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201209143840\",\"name\":\"Microsoft.StorageAccount-20201209143840\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/largefiletest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"8884837994967140257\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"largefiletest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-09T06:40:02.7787226Z\",\"duration\":\"PT35.334902S\",\"correlationId\":\"76aebba0-555a-4e2a-af9f-e6fb74f8b50b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/largefiletest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201209142141\",\"name\":\"Microsoft.StorageAccount-20201209142141\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/bigfiletest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"8884837994967140257\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"bigfiletest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-09T06:23:20.6640647Z\",\"duration\":\"PT1M4.8999807S\",\"correlationId\":\"83c1ba4c-79b5-4431-859d-b1b084d5e717\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/bigfiletest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20201207153508\",\"name\":\"Microsoft.StorageAccount-20201207153508\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\",\"marketplaceItemId\":\"Microsoft.StorageAccount\",\"provisioningHash\":\"Default\"},\"properties\":{\"templateHash\":\"16676323329717024192\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"minimumTlsVersion\":{\"type\":\"String\",\"value\":\"TLS1_2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"allowBlobPublicAccess\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-12-07T07:36:19.2631223Z\",\"duration\":\"PT42.4706589S\",\"correlationId\":\"e2ea5a7b-b1e0-4d39-a41c-28fb3e526aa8\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-19a843bc\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-19a843bc\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1769012333693356871\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-11-20T06:03:42.7642531Z\",\"duration\":\"PT4.4980342S\",\"correlationId\":\"67f9dcd4-d3ae-4810-a19b-71c9b86e0662\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - aiqkmwurjsg3x5k\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/pid-bd911d2b-cf92-472f-aeee-7d1123b36b98\",\"name\":\"pid-bd911d2b-cf92-472f-aeee-7d1123b36b98\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1785727386360713170\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-11-20T05:53:26.0899211Z\",\"duration\":\"PT0.2237105S\",\"correlationId\":\"ed0b4d69-d990-4aa4-a4cf-c02de42c61b5\",\"providers\":[],\"dependencies\":[],\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/mainTemplate.anon\",\"name\":\"mainTemplate.anon\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10732264190512868704\",\"parameters\":{\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"sku\":{\"type\":\"String\",\"value\":\"Basic\"},\"resourceDeploymentRegion\":{\"type\":\"String\",\"value\":\"eastus\"},\"notebookVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_D3_V2\"},\"headClusterVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_NC6\"},\"maxHeadNodes\":{\"type\":\"Int\",\"value\":2},\"workerClusterVMSize\":{\"type\":\"String\",\"value\":\"STANDARD_D2_V2\"},\"maxWorkerNodes\":{\"type\":\"Int\",\"value\":4},\"timeValueForRandomSuffix\":{\"type\":\"String\",\"value\":\"20201120T055316Z\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-11-20T06:04:53.1950966Z\",\"duration\":\"PT11M35.6598321S\",\"correlationId\":\"ed0b4d69-d990-4aa4-a4cf-c02de42c61b5\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]},{\"resourceType\":\"deploymentScripts\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.ContainerRegistry\",\"resourceTypes\":[{\"resourceType\":\"registries\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"eastus\"]},{\"resourceType\":\"virtualNetworks\",\"locations\":[\"eastus\"]},{\"resourceType\":\"virtualNetworks/subnets\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.KeyVault\",\"resourceTypes\":[{\"resourceType\":\"vaults\",\"locations\":[\"eastus\"]},{\"resourceType\":\"vaults/secrets\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.MachineLearningServices\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"eastus\"]},{\"resourceType\":\"workspaces/computes\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Maps\",\"resourceTypes\":[{\"resourceType\":\"accounts\",\"locations\":[\"global\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"eastus\"]},{\"resourceType\":\"sites\",\"locations\":[\"eastus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.ManagedIdentity\",\"resourceTypes\":[{\"resourceType\":\"userAssignedIdentities\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Authorization\",\"resourceTypes\":[{\"resourceType\":\"roleAssignments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/nsgqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"nsgqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/virtualNetworks\",\"resourceName\":\"vnetqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/virtualNetworks\",\"resourceName\":\"vnetqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/nsgqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"nsgqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\",\"apiVersion\":\"2018-02-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/aiqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"aiqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/ciqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/ciqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/head-gpu\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/head-gpu\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/vnetqkmwurjsg3x5k/subnets/default\",\"resourceType\":\"Microsoft.Network/virtualNetworks/subnets\",\"resourceName\":\"vnetqkmwurjsg3x5k/default\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/worker-cpu\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/worker-cpu\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/appSPqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"appSPqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2020-02-01-preview\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/AzureMapPrimaryKey\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/AzureMapPrimaryKey\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/STORAGE-ACCOUNT-CONNECTION-STRING\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/STORAGE-ACCOUNT-CONNECTION-STRING\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/APP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/APP-KEY\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.KeyVault/vaults\",\"resourceName\":\"kvqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2020-02-01-preview\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/MAP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/MAP-KEY\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\",\"apiVersion\":\"2018-11-30\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\",\"apiVersion\":\"2018-02-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/17436b13-0e9f-52cd-93d3-c520957d4b44\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"17436b13-0e9f-52cd-93d3-c520957d4b44\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Maps/accounts/azMapqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Maps/accounts\",\"resourceName\":\"azMapqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/APP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/APP-KEY\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/MAP-KEY\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/MAP-KEY\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.KeyVault/vaults/kvqkmwurjsg3x5k/secrets/STORAGE-ACCOUNT-CONNECTION-STRING\",\"resourceType\":\"Microsoft.KeyVault/vaults/secrets\",\"resourceName\":\"kvqkmwurjsg3x5k/STORAGE-ACCOUNT-CONNECTION-STRING\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"appSiteqkmwurjsg3x5k/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.MachineLearningServices/workspaces/zhoxing-test/computes/ciqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.MachineLearningServices/workspaces/computes\",\"resourceName\":\"zhoxing-test/ciqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deploymentScripts/retriveSimulatorCode\",\"resourceType\":\"Microsoft.Resources/deploymentScripts\",\"resourceName\":\"retriveSimulatorCode\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ManagedIdentity/userAssignedIdentities/idqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.ManagedIdentity/userAssignedIdentities\",\"resourceName\":\"idqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Authorization/roleAssignments/5f435e57-57c8-5be7-9653-f17aa95a9897\",\"resourceType\":\"Microsoft.Authorization/roleAssignments\",\"resourceName\":\"5f435e57-57c8-5be7-9653-f17aa95a9897\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/appSiteqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"appSiteqkmwurjsg3x5k\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/saqkmwurjsg3x5k\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"saqkmwurjsg3x5k\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-04-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deploymentScripts/configureWebApp\",\"resourceType\":\"Microsoft.Resources/deploymentScripts\",\"resourceName\":\"configureWebApp\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"DeploymentScriptDownloadFailure\",\"message\":\"The deployment script execution failed because the primary or supporting scripts could not be downloaded successfully due to multiple errors. First error:\\r\\nMicrosoft.PowerShell.Commands.HttpResponseException: Response status code does not indicate success: 403 (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.).\\n at System.Management.Automation.MshCommandRuntime.ThrowTerminatingError(ErrorRecord errorRecord)\\r\\nat Start-SystemDeploymentScriptDownloadFile, /mnt/azscripts/azscriptinput/DeploymentScript.ps1: line 69\\r\\nat , /mnt/azscripts/azscriptinput/DeploymentScript.ps1: line 170. Please refer to https://aka.ms/DeploymentScriptsTroubleshoot for more deployment script information.\"},{\"code\":\"DeploymentScriptError\",\"message\":\"The provided script failed with the following error:\\r\\n[Error] Signature verification failed for whatif-webapp-code.zip. Please refer to https://aka.ms/DeploymentScriptsTroubleshoot for more deployment script information.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zx\",\"name\":\"zx\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10662465836138684748\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"provisioningState\":\"Canceled\",\"timestamp\":\"2020-11-03T08:08:27.8712963Z\",\"duration\":\"PT13.251839S\",\"correlationId\":\"949af8ef-8c1f-4794-af5a-71458ce36df8\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/azuredeploy\",\"name\":\"azuredeploy\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"10662465836138684748\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-11-03T08:06:38.3403154Z\",\"duration\":\"PT47.9793905S\",\"correlationId\":\"f1858719-e078-41ff-98b8-3113fca4a2fe\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"Website with given name orderProcessing already exists.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/validate_error_template\",\"name\":\"validate_error_template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"479398563487745336\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-10-26T02:36:22.208154Z\",\"duration\":\"PT35.462768S\",\"correlationId\":\"ffd8d210-0a76-404d-96a7-8a9e5c24c14b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/euwapiptdevst02\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy_multiline\",\"name\":\"simple_deploy_multiline\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"2667423895514669180\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-10-14T09:05:20.6753533Z\",\"duration\":\"PT9.0409803S\",\"correlationId\":\"74eda485-bbc0-402f-a8c1-14aa1a722cbd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{\"empty\":{\"type\":\"String\",\"value\":\"\"},\"newNSG\":{\"type\":\"Object\",\"value\":{\"provisioningState\":\"Succeeded\",\"resourceGuid\":\"11cfe367-bf96-4aba-b083-8cb3fca534c4\",\"securityRules\":[],\"defaultSecurityRules\":[{\"name\":\"AllowVnetInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Inbound\"}},{\"name\":\"AllowAzureLoadBalancerInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowAzureLoadBalancerInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow inbound traffic from azure load balancer\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"AzureLoadBalancer\",\"destinationAddressPrefix\":\"*\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Inbound\"}},{\"name\":\"DenyAllInBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllInBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all inbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Inbound\"}},{\"name\":\"AllowVnetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowVnetOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to all VMs in VNET\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"VirtualNetwork\",\"destinationAddressPrefix\":\"VirtualNetwork\",\"access\":\"Allow\",\"priority\":65000,\"direction\":\"Outbound\"}},{\"name\":\"AllowInternetOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/AllowInternetOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Allow outbound traffic from all VMs to Internet\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"Internet\",\"access\":\"Allow\",\"priority\":65001,\"direction\":\"Outbound\"}},{\"name\":\"DenyAllOutBound\",\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test/defaultSecurityRules/DenyAllOutBound\",\"etag\":\"W/\\\"45abcd1a-f2d4-481b-aad3-039ddef356fb\\\"\",\"type\":\"Microsoft.Network/networkSecurityGroups/defaultSecurityRules\",\"properties\":{\"provisioningState\":\"Succeeded\",\"description\":\"Deny all outbound traffic\",\"protocol\":\"*\",\"sourcePortRange\":\"*\",\"destinationPortRange\":\"*\",\"sourceAddressPrefix\":\"*\",\"destinationAddressPrefix\":\"*\",\"access\":\"Deny\",\"priority\":65500,\"direction\":\"Outbound\"}}]}}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test\",\"name\":\"zhoxing-test\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5485076355534486564\",\"parameters\":{\"projectName\":{\"type\":\"String\",\"value\":\"get.it\"},\"getitDatabaseGroupName\":{\"type\":\"String\",\"value\":\"RG-GETIT-DB\"},\"getitDatabaseDeploymentName\":{\"type\":\"String\",\"value\":\"DEPLOY-GETIT-DB\"},\"getitNetworkGroupName\":{\"type\":\"String\",\"value\":\"RG-GETIT-NETWORK\"},\"getitNetworkDeploymentName\":{\"type\":\"String\",\"value\":\"DEPLOY-GETIT-NETWORK\"},\"apimName\":{\"type\":\"String\",\"value\":\"apim-zdf-getit\"},\"apimAdminEmail\":{\"type\":\"String\",\"value\":\"sebastian.gaertner@accso.de\"},\"apimOrgName\":{\"type\":\"String\",\"value\":\"ZDF\"},\"apimProductServiceApiName\":{\"type\":\"String\",\"value\":\"product-api\"},\"apimEditionServiceApiName\":{\"type\":\"String\",\"value\":\"edition-api\"},\"apimResourceServiceApiName\":{\"type\":\"String\",\"value\":\"resource-api\"},\"apimPublicationEventServiceApiName\":{\"type\":\"String\",\"value\":\"publicationevent-api\"},\"apimGroupServiceApiName\":{\"type\":\"String\",\"value\":\"group-api\"},\"apimGraphQLApiName\":{\"type\":\"String\",\"value\":\"graphql-api\"},\"apimProductionApiName\":{\"type\":\"String\",\"value\":\"production-api\"},\"appServerFarmName\":{\"type\":\"String\",\"value\":\"plan-zdf-getit\"},\"logAnalyticsWorkspaceName\":{\"type\":\"String\",\"value\":\"log-zdf-getit-api2\"},\"productServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-product\"},\"productServiceRuntime\":{\"type\":\"String\",\"value\":\"java\"},\"editionServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-edition\"},\"editionServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"resourceServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-resource\"},\"resourceServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"publicationEventServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-publicationevent\"},\"publicationEventServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"groupServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-group\"},\"groupServiceRuntime\":{\"type\":\"String\",\"value\":\"dotnet\"},\"graphQLServiceName\":{\"type\":\"String\",\"value\":\"func-zdf-getit-graphql\"},\"graphQLServiceRuntime\":{\"type\":\"String\",\"value\":\"node\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-08-14T02:33:39.9455691Z\",\"duration\":\"PT12.8454385S\",\"correlationId\":\"835c2bee-c9e0-4662-9152-015fc9a6e646\",\"providers\":[{\"namespace\":\"Microsoft.ApiManagement\",\"resourceTypes\":[{\"resourceType\":\"service\",\"locations\":[\"westus\"]},{\"resourceType\":\"service/tags\",\"locations\":[null]},{\"resourceType\":\"service/apis\",\"locations\":[null]},{\"resourceType\":\"service/apis/tags\",\"locations\":[null]},{\"resourceType\":\"service/subscriptions\",\"locations\":[null]},{\"resourceType\":\"service/products\",\"locations\":[null]},{\"resourceType\":\"service/products/apis\",\"locations\":[null]},{\"resourceType\":\"service/products/policies\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"westus\"]},{\"resourceType\":\"sites\",\"locations\":[\"westus\"]},{\"resourceType\":\"sites/networkConfig\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"westeurope\"]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/publicationEvent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionPermit\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionProposal\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/product\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api/tags/product\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/product-api/product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/edition\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api/tags/edition\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/edition-api/edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/resource\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api/tags/resource\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/resource-api/resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/publicationEvent\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api/tags/publicationEvent\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/publicationevent-api/publicationEvent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/group\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api/tags/group\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/group-api/group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/graphql\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api/tags/graphql\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/graphql-api/graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionPermit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api/tags/productionPermit\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/production-api/productionPermit\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/tags\",\"resourceName\":\"apim-zdf-getit/productionProposal\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api/tags/productionProposal\",\"resourceType\":\"Microsoft.ApiManagement/service/apis/tags\",\"resourceName\":\"apim-zdf-getit/production-api/productionProposal\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/planit-import\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/planit-import\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/doit-import\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/doit-import\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/starter/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/starter\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/starter/policies/policy\",\"resourceType\":\"Microsoft.ApiManagement/service/products/policies\",\"resourceName\":\"apim-zdf-getit/starter/policy\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/standard/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/standard\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/standard/policies/policy\",\"resourceType\":\"Microsoft.ApiManagement/service/products/policies\",\"resourceName\":\"apim-zdf-getit/standard/policy\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/product-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/edition-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/resource-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/publicationevent-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/group-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/graphql-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/graphql-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/graphql-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium\",\"resourceType\":\"Microsoft.ApiManagement/service/products\",\"resourceName\":\"apim-zdf-getit/premium\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/products/premium/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/products/apis\",\"resourceName\":\"apim-zdf-getit/premium/production-api\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-product-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-product-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-product-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-product-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-product\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-product\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-product/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-product/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-edition-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-edition-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-edition-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-edition-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-edition\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-edition\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-edition/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-edition/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-resource-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-resource-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-resource-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-resource-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-resource\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-resource\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-resource/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-resource/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-publicationevent-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-publicationevent-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-publicationevent-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-publicationevent-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-publicationevent\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-publicationevent\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-publicationevent/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-publicationevent/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-group-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-group-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-group-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-group-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\",\"apiVersion\":\"2019-01-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/product-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/product-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/edition-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/edition-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/resource-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/resource-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/publicationevent-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/publicationevent-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/group-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/group-api\",\"apiVersion\":\"2019-12-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/apis/production-api\",\"resourceType\":\"Microsoft.ApiManagement/service/apis\",\"resourceName\":\"apim-zdf-getit/production-api\",\"apiVersion\":\"2019-12-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-group\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-group\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-group/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-group/virtualNetwork\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/func-zdf-getit-graphql-application-insights\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"func-zdf-getit-graphql-application-insights\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/plan-zdf-getit\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"plan-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit\",\"resourceType\":\"Microsoft.ApiManagement/service\",\"resourceName\":\"apim-zdf-getit\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ApiManagement/service/apim-zdf-getit/subscriptions/getit-functions\",\"resourceType\":\"Microsoft.ApiManagement/service/subscriptions\",\"resourceName\":\"apim-zdf-getit/getit-functions\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/getitxxx6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"getitxxx6472qnxl3vv5o\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/func-zdf-getit-graphql-application-insights\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"func-zdf-getit-graphql-application-insights\",\"apiVersion\":\"2018-05-01-preview\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-DB/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-DB\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-DB\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-graphql\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"func-zdf-getit-graphql\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/RG-GETIT-NETWORK/providers/Microsoft.Resources/deployments/DEPLOY-GETIT-NETWORK\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DEPLOY-GETIT-NETWORK\",\"apiVersion\":\"2018-05-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/func-zdf-getit-graphql/networkConfig/virtualNetwork\",\"resourceType\":\"Microsoft.Web/sites/networkConfig\",\"resourceName\":\"func-zdf-getit-graphql/virtualNetwork\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ResourceNotFound\",\"message\":\"The Resource 'Microsoft.ApiManagement/service/apim-zdf-getit' under resource group 'zhoxing-test' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"},{\"code\":\"ServiceAlreadyExists\",\"message\":\"Api service already exists: apim-zdf-getit\"},{\"code\":\"ResourceGroupNotFound\",\"message\":\"Resource group 'RG-GETIT-DB' could not be found.\"},{\"code\":\"ResourceGroupNotFound\",\"message\":\"Resource group 'RG-GETIT-NETWORK' could not be found.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-b2c970b3\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-b2c970b3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"13728839536848772392\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:58.6717661Z\",\"duration\":\"PT6.2505024S\",\"correlationId\":\"15282324-0af8-462b-a510-44af180a9fca\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-group-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-a7cd0d23\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-a7cd0d23\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"11008178750715012999\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:56.3163568Z\",\"duration\":\"PT4.6419329S\",\"correlationId\":\"2982921b-9678-4d4f-a56e-1abf794921b9\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-graphql-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-88d7d7bd\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-88d7d7bd\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"16733204837828727382\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:57.9818234Z\",\"duration\":\"PT6.3610864S\",\"correlationId\":\"45c90228-f8b9-4db0-8c66-76a037085704\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-edition-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-4b72882f\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-4b72882f\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"851689626023111966\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:55.1755059Z\",\"duration\":\"PT3.6922649S\",\"correlationId\":\"e0678ab0-3b3b-4c3e-bcb4-4871660ba044\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-resource-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-3f5366ed\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-3f5366ed\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1561114309446397737\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:55.8251522Z\",\"duration\":\"PT4.9057511S\",\"correlationId\":\"400b209e-8de2-4536-bccd-c070ecd048ec\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-publicationevent-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-4e05da17\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-4e05da17\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"8029190641605507225\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-08-14T02:26:52.6382412Z\",\"duration\":\"PT2.1789515S\",\"correlationId\":\"bd8ed02e-2208-4dcd-a584-94965af3e707\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - func-zdf-getit-product-application-insights\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test2\",\"name\":\"zhoxing-test2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.StorageCache/caches/zhoxing-test2\",\"marketplaceItemId\":\"Microsoft.StorageCache\"},\"properties\":{\"templateHash\":\"6137140797134419149\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"subnetName\":{\"type\":\"String\",\"value\":\"default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing\"},\"storageCacheName\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"cacheSizeGB\":{\"type\":\"Int\",\"value\":3072},\"storageCacheSkuName\":{\"type\":\"String\",\"value\":\"Standard_2G\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-08-07T09:42:02.8806214Z\",\"duration\":\"PT11M2.8851179S\",\"correlationId\":\"fbd071b6-cacb-4761-85ce-fb85ddf833ab\",\"providers\":[{\"namespace\":\"Microsoft.StorageCache\",\"resourceTypes\":[{\"resourceType\":\"caches\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"AscInternalError\",\"message\":\"Error encountered deploying the cache.\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200731143851\",\"name\":\"Microsoft.VirtualNetwork-20200731143851\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork\"},\"properties\":{\"templateHash\":\"13381686255721391901\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.12.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.12.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-31T06:39:26.0818169Z\",\"duration\":\"PT13.5092281S\",\"correlationId\":\"9024bd3f-0d65-49a7-b9e9-f76cceea13ef\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing\",\"name\":\"zhoxing\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"9913373836689765749\",\"parameters\":{\"groupLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"groupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"appSecret\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botId\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"botSku\":{\"type\":\"String\",\"value\":\"westus\"},\"newAppServicePlanName\":{\"type\":\"String\",\"value\":\"***\"},\"newAppServicePlanSku\":{\"type\":\"Object\",\"value\":{\"name\":\"S1\",\"tier\":\"Standard\",\"size\":\"S1\",\"family\":\"S\",\"capacity\":1}},\"newAppServicePlanLocation\":{\"type\":\"String\",\"value\":\"\"},\"newWebAppName\":{\"type\":\"String\",\"value\":\"\"},\"slackVerificationToken\":{\"type\":\"String\",\"value\":\"\"},\"slackBotToken\":{\"type\":\"String\",\"value\":\"\"},\"slackClientSigningSecret\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-07-24T02:09:57.2934537Z\",\"duration\":\"PT2.6251093S\",\"correlationId\":\"63a2a95c-8cc3-4b26-b0d1-05c19704468a\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"resourceGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"resourceType\":\"Microsoft.Resources/resourceGroups\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageDeployment\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"No HTTP resource was found that matches the request URI 'http://localhost:1234/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Resources/resourceGroups/zhoxing-test?api-version=2018-05-01'.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache_2\",\"name\":\"redis.cache_2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing3\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"16475047503873081288\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:30:18.0728672Z\",\"duration\":\"PT18M29.2379003S\",\"correlationId\":\"27a8f757-b8ac-440f-8126-c3c867edf7c5\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache_1\",\"name\":\"redis.cache_1\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing2\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"576582858980762143\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:39:22.6586917Z\",\"duration\":\"PT28M3.7821048S\",\"correlationId\":\"02c9224d-e521-4797-8aef-da551e14948d\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/redis.cache\",\"name\":\"redis.cache\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.Cache\"},\"properties\":{\"templateHash\":\"6801733663408905830\",\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-17T02:23:16.2959839Z\",\"duration\":\"PT18M21.6882908S\",\"correlationId\":\"4d616a52-417e-4b20-832b-a427dc4fbae7\",\"providers\":[{\"namespace\":\"Microsoft.Cache\",\"resourceTypes\":[{\"resourceType\":\"Redis\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Cache/Redis/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/NoMarketplace-20200713174155\",\"name\":\"NoMarketplace-20200713174155\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"10419476445083869131\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest.com\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-13T09:44:06.9606591Z\",\"duration\":\"PT47.6452397S\",\"correlationId\":\"fa90b1a8-96ef-4f44-aba2-13ad7a03d84d\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/NoMarketplace-20200713173655\",\"name\":\"NoMarketplace-20200713173655\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"10419476445083869131\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest.com\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-07-13T09:38:18.4729953Z\",\"duration\":\"PT50.8715S\",\"correlationId\":\"565d3a98-d796-41ca-856e-5640767142ff\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/zhoxingtest.com\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ApplianceDefinition\",\"name\":\"Microsoft.ApplianceDefinition\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Solutions/applicationDefinitions/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.ApplianceDefinition\"},\"properties\":{\"templateHash\":\"7328759817283875413\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"managementPolicy\":{\"type\":\"Object\",\"value\":{\"mode\":\"Managed\"}},\"lockLevel\":{\"type\":\"String\",\"value\":\"none\"},\"authorizations\":{\"type\":\"Array\",\"value\":[]},\"description\":{\"type\":\"String\",\"value\":\"\"},\"displayName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"packageFileUri\":{\"type\":\"String\",\"value\":\"https://containername.blob.core.windows.net/package.zip\"},\"lockingPolicy\":{\"type\":\"Object\",\"value\":{\"allowedActions\":[]}},\"notificationPolicy\":{\"type\":\"Object\",\"value\":{\"notificationEndpoints\":[]}},\"deploymentPolicy\":{\"type\":\"Object\",\"value\":{\"deploymentMode\":\"Complete\"}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-07-13T08:59:53.7509226Z\",\"duration\":\"PT10.0740069S\",\"correlationId\":\"e0f2cd1b-6183-4bae-9be6-a3b51d824254\",\"providers\":[{\"namespace\":\"Microsoft.Solutions\",\"resourceTypes\":[{\"resourceType\":\"applicationDefinitions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"DownloadItemFromBlobFailed\",\"message\":\"Download of the item from blob at 'https://containername.blob.core.windows.net/package.zip' failed due to a failed connection.\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200617163543\",\"name\":\"Microsoft.StorageAccount-20200617163543\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingpage\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingpage\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-17T08:38:17.9332656Z\",\"duration\":\"PT35.3608729S\",\"correlationId\":\"a6010c85-0ebf-4007-8e00-0a0a553a0cb9\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingpage\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200605161418\",\"name\":\"Microsoft.StorageAccount-20200605161418\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtestv2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtestv2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T08:15:19.9706428Z\",\"duration\":\"PT29.9345928S\",\"correlationId\":\"183bd12b-7ce3-47af-91da-f806eddcaa30\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtestv2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200605161221\",\"name\":\"Microsoft.StorageAccount-20200605161221\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest3\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T08:13:27.2729317Z\",\"duration\":\"PT33.6979316S\",\"correlationId\":\"66cd9283-18a3-42e1-beea-db534516fd09\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/zhoxing-test-6511134\",\"name\":\"zhoxing-test-6511134\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.IotHub\",\"provisioningHash\":\"zhoxing-test-6511134\"},\"properties\":{\"templateHash\":\"14500782064966916276\",\"parameters\":{\"hubname\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"sku_name\":{\"type\":\"String\",\"value\":\"S1\"},\"sku_units\":{\"type\":\"String\",\"value\":\"1\"},\"d2c_partitions\":{\"type\":\"String\",\"value\":\"4\"},\"features\":{\"type\":\"String\",\"value\":\"None\"},\"tags\":{\"type\":\"Object\",\"value\":{}},\"cloudEnvironment\":{\"type\":\"String\",\"value\":\"public\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-05T03:04:26.3289398Z\",\"duration\":\"PT2M45.3270964S\",\"correlationId\":\"23672a2f-a5a0-4935-9e4b-28b954b309e1\",\"providers\":[{\"namespace\":\"Microsoft.Devices\",\"resourceTypes\":[{\"resourceType\":\"IotHubs\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"eastus\"]}]},{\"namespace\":\"Microsoft.Security\",\"resourceTypes\":[{\"resourceType\":\"IoTSecuritySolutions\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"resourceType\":\"Microsoft.Devices/IotHubs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\",\"resourceType\":\"Microsoft.Devices/IotHubs\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Security/IoTSecuritySolutions/zhoxing-test\",\"resourceType\":\"Microsoft.Security/IoTSecuritySolutions\",\"resourceName\":\"zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Devices/IotHubs/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Security/IoTSecuritySolutions/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604182734\",\"name\":\"Microsoft.StorageAccount-20200604182734\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest3\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"Storage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T10:28:34.861346Z\",\"duration\":\"PT33.442841S\",\"correlationId\":\"d9cdc3a8-6629-4779-a6f9-a572107da649\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604182518\",\"name\":\"Microsoft.StorageAccount-20200604182518\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"FileStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T10:26:20.9378925Z\",\"duration\":\"PT30.4986271S\",\"correlationId\":\"1bc5999e-8ad1-40eb-9ce9-9bd7f41f2469\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604174616\",\"name\":\"Microsoft.StorageAccount-20200604174616\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"BlockBlobStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T09:47:54.9354542Z\",\"duration\":\"PT31.7385616S\",\"correlationId\":\"b64730bd-3441-40a1-b0c8-8a2a28b2373b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200604174207\",\"name\":\"Microsoft.StorageAccount-20200604174207\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-06-04T09:44:02.7554567Z\",\"duration\":\"PT36.4150378S\",\"correlationId\":\"2daa0bea-baba-47fd-911d-3f032fcb4f12\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworklink-3d99afdb-b016-4341-b822-35863300404c\",\"name\":\"VirtualNetworklink-3d99afdb-b016-4341-b822-35863300404c\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1961003837028567226\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:23.6683592Z\",\"duration\":\"PT43.4583406S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones/virtualNetworkLinks\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworkLink-20200528103815\",\"name\":\"VirtualNetworkLink-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"17624723031993013323\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:25.2537755Z\",\"duration\":\"PT48.5949876S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/DnsZoneGroup-20200528103815\",\"name\":\"DnsZoneGroup-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"17179788593214746780\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:44.8948026Z\",\"duration\":\"PT8.4190742S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateEndpoints/privateDnsZoneGroups\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3/privateDnsZoneGroups/default\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDnsZone-3d99afdb-b016-4341-b822-35863300404b\",\"name\":\"PrivateDnsZone-3d99afdb-b016-4341-b822-35863300404b\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"2250866243485167996\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:28.9956706Z\",\"duration\":\"PT51.326253S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateDnsZones\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"name\":\"PrivateDns-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"9908679191686152932\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:41:32.5715095Z\",\"duration\":\"PT59.4559786S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/UpdateSubnetDeployment-20200528103815\",\"name\":\"UpdateSubnetDeployment-20200528103815\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"16875532642000494520\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:39:49.6423303Z\",\"duration\":\"PT9.8150316S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"virtualNetworks/subnets\",\"locations\":[null]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.PrivateEndpoint-20200528103530\",\"name\":\"Microsoft.PrivateEndpoint-20200528103530\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"marketplaceItemId\":\"\"},\"properties\":{\"templateHash\":\"12801401672929746764\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"privateEndpointName\":{\"type\":\"String\",\"value\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},\"privateLinkResource\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"},\"targetSubResource\":{\"type\":\"Array\",\"value\":[\"table\"]},\"requestMessage\":{\"type\":\"String\",\"value\":\"\"},\"subnet\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest\"},\"virtualNetworkResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subnetDeploymentName\":{\"type\":\"String\",\"value\":\"UpdateSubnetDeployment-20200528103815\"},\"privateDnsDeploymentName\":{\"type\":\"String\",\"value\":\"PrivateDns-20200528103815\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:42:30.7104493Z\",\"duration\":\"PT3M0.9325005S\",\"correlationId\":\"e54b819b-efb8-4ebd-a357-cde3cd59f8dd\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"privateEndpoints\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/UpdateSubnetDeployment-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"UpdateSubnetDeployment-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/VirtualNetworkLink-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"VirtualNetworkLink-20200528103815\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\",\"resourceType\":\"Microsoft.Network/privateEndpoints\",\"resourceName\":\"pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/PrivateDns-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"PrivateDns-20200528103815\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/DnsZoneGroup-20200528103815\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"DnsZoneGroup-20200528103815\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateDnsZones/privatelink.table.core.windows.net/virtualNetworkLinks/s67i3pgzda3qi\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/privateEndpoints/pe-eu2-iris-dev-006.nic.9d80d11c-ea9f-427e-a580-c3779dd543f3/privateDnsZoneGroups/default\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest/subnets/default\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200528103154\",\"name\":\"Microsoft.VirtualNetwork-20200528103154\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork-ARM\"},\"properties\":{\"templateHash\":\"7310725565247910838\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.17.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.17.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-28T02:34:12.7114768Z\",\"duration\":\"PT21.3925748S\",\"correlationId\":\"7f24cb63-adb7-4672-8138-4dce3757aa9b\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ContainerRegistry\",\"name\":\"Microsoft.ContainerRegistry\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.ContainerRegistry/registries/zhoxingtest/webhooks/zhoxingtest\"},\"properties\":{\"templateHash\":\"8202610767534201205\",\"parameters\":{\"registryName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"webhookName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"webhookLocation\":{\"type\":\"String\",\"value\":\"westus\"},\"webhookApiVersion\":{\"type\":\"String\",\"value\":\"2019-12-01-preview\"},\"serviceUri\":{\"type\":\"SecureString\"},\"customHeaders\":{\"type\":\"SecureObject\"},\"actions\":{\"type\":\"Array\",\"value\":[\"push\"]},\"status\":{\"type\":\"String\",\"value\":\"enabled\"},\"scope\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-14T05:47:58.9717589Z\",\"duration\":\"PT17.5659974S\",\"correlationId\":\"c4fc9e92-912e-465f-8469-2342255d2335\",\"providers\":[{\"namespace\":\"Microsoft.ContainerRegistry\",\"resourceTypes\":[{\"resourceType\":\"registries/webhooks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.ContainerRegistry/registries/zhoxingtest/webhooks/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/lumagatena.resourcescheduler-20200514132040\",\"name\":\"lumagatena.resourcescheduler-20200514132040\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test\",\"marketplaceItemId\":\"lumagatena.resourceschedulerent\"},\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/lumagatena.resourcescheduler-b0655f11-493e-40aa-b54e-9229ae04f5fc-ent/Artifacts/DefaultTemplate\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"17406019195718949633\",\"parameters\":{\"resourcePrefix\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"appInsightsLocation\":{\"type\":\"String\",\"value\":\"westcentralus\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"_artifactsLocation\":{\"type\":\"String\",\"value\":\"https://catalogartifact.azureedge.net/publicartifacts/lumagatena.resourcescheduler-b0655f11-493e-40aa-b54e-9229ae04f5fc-ent/Artifacts/DefaultTemplate\"},\"_artifactsLocationSasToken\":{\"type\":\"SecureString\"},\"applicationResourceName\":{\"type\":\"String\",\"value\":\"ManagedResourceScheduler\"},\"managedResourceGroupId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mrg-resourcescheduler-20200514132040\"},\"managedIdentity\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Failed\",\"timestamp\":\"2020-05-14T05:28:41.6327612Z\",\"duration\":\"PT12.101002S\",\"correlationId\":\"315b4dd9-a0ca-4dc8-a455-0a0cbc76bc9b\",\"providers\":[{\"namespace\":\"Microsoft.Solutions\",\"resourceTypes\":[{\"resourceType\":\"applications\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"ResourcePurchaseValidationFailed\",\"message\":\"User failed validation to purchase resources. Error message: '{\\\"error\\\":{\\\"code\\\":\\\"AccountSetupError\\\",\\\"message\\\":\\\"You cannot purchase reservation because required AAD tenant information is missing. Please ask your tenant admin to fill this form: https://aka.ms/orgprofile\\\"}}'\"}]},\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.LogAnalyticsOMS\",\"name\":\"Microsoft.LogAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test11\",\"marketplaceItemId\":\"Microsoft.LogAnalyticsOMS\"},\"properties\":{\"templateHash\":\"11463598216708868146\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test11\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"sku\":{\"type\":\"String\",\"value\":\"pergb2018\"},\"tags\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-11T02:46:11.2613852Z\",\"duration\":\"PT27.5799751S\",\"correlationId\":\"ef0d9b73-6d41-4e4a-8d72-14bb23335fbe\",\"providers\":[{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test11\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/mainTemplate\",\"name\":\"mainTemplate\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3218180314351156874\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-05-06T08:12:40.0695696Z\",\"duration\":\"PT3.0700022S\",\"correlationId\":\"780ef5f1-25d3-427c-b4f8-065b75ebd193\",\"providers\":[],\"dependencies\":[],\"outputs\":{\"deploymentOutput\":{\"type\":\"Object\",\"value\":{\"name\":\"mainTemplate\",\"properties\":{\"template\":{\"$schema\":\"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\"contentVersion\":\"1.0.0.0\",\"resources\":[],\"outputs\":{\"deploymentOutput\":{\"type\":\"Object\",\"value\":\"[deployment()]\"}}},\"templateHash\":\"3218180314351156874\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Accepted\"}}}},\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/specially-encoded-template\",\"name\":\"specially-encoded-template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1888782782781528452\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-04-30T07:03:23.7207451Z\",\"duration\":\"PT4.0436353S\",\"correlationId\":\"bfb6b403-aaf7-45fa-a24f-d6f55381b616\",\"providers\":[{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"scheduledQueryRules\",\"locations\":[\"japaneast\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"LinkedAuthorizationFailed\",\"message\":\"The client has permission to perform action 'microsoft.insights/actiongroups/read' on scope '/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Insights/scheduledQueryRules/armtemplate-alert-japanese-utf8', however the linked subscription '{subscriptionId}' was not found. \"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421145256\",\"name\":\"Microsoft.StorageAccount-20200421145256\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T06:54:42.0368957Z\",\"duration\":\"PT33.1713846S\",\"correlationId\":\"41acf011-d899-4a7d-afa8-cb184a71b868\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421145114\",\"name\":\"Microsoft.StorageAccount-20200421145114\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount-ARM\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T06:53:03.6973431Z\",\"duration\":\"PT32.8398506S\",\"correlationId\":\"e599a79d-ca38-4d53-a312-783dcd52892b\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200421134632\",\"name\":\"Microsoft.StorageAccount-20200421134632\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"16380682949036680971\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"kind\":{\"type\":\"String\",\"value\":\"FileStorage\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-21T05:51:14.8318342Z\",\"duration\":\"PT34.9084997S\",\"correlationId\":\"3027cf64-8a93-4cfe-b676-0cc36f44cd62\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200420165822\",\"name\":\"Microsoft.StorageAccount-20200420165822\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"1076588640741720503\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true},\"isHnsEnabled\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-20T09:02:06.2473506Z\",\"duration\":\"PT2M4.9663424S\",\"correlationId\":\"f0fc9ae7-540f-4024-9599-910ec442b728\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AlertManagementOMS\",\"name\":\"Microsoft.AlertManagementOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AlertManagement(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.AlertManagementOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AlertManagementOMS.1.0.21/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AlertManagement\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-20T02:46:25.1922657Z\",\"duration\":\"PT10.0635592S\",\"correlationId\":\"ff16ce44-6269-4887-8657-1339b2c0e993\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AlertManagement(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/CreateVm-Canonical.UbuntuServer-18.04-LTS-20200417160045\",\"name\":\"CreateVm-Canonical.UbuntuServer-18.04-LTS-20200417160045\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualMachine\",\"provisioningHash\":\"SolutionProvider\"},\"properties\":{\"templateHash\":\"7172804404965899907\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"networkInterfaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test801\"},\"subnetName\":{\"type\":\"String\",\"value\":\"default\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing-test\"},\"virtualMachineName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"virtualMachineRG\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"osDiskType\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"virtualMachineSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagnosticsStorageAccountName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"diagnosticsStorageAccountId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-17T08:04:15.7864236Z\",\"duration\":\"PT48.1102756S\",\"correlationId\":\"01ac1c40-8120-4df9-bf04-a1e246c34fba\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test801\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test801\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"resourceType\":\"Microsoft.Compute/virtualMachines\",\"resourceName\":\"zhoxing-test\"}],\"outputs\":{\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test801\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/SolutionDeployment-20200416192508\",\"name\":\"SolutionDeployment-20200416192508\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3423151013820430908\",\"parameters\":{},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-16T17:23:55.056176Z\",\"duration\":\"PT9.5703329S\",\"correlationId\":\"ad2ceb37-60e5-4809-aea7-536c8da31de2\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"australiacentral\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/ContainerInsights(zhoxing-test2)\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200415165139\",\"name\":\"Microsoft.StorageAccount-20200415165139\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\",\"marketplaceItemId\":\"Microsoft.StorageAccount\"},\"properties\":{\"templateHash\":\"11961669741847493773\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"eastus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxing\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-15T08:54:38.0110053Z\",\"duration\":\"PT1M43.6998278S\",\"correlationId\":\"b693853a-6a38-4b8f-87bc-f5d2f6fe889d\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"eastus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxing\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ContainersOMS\",\"name\":\"Microsoft.ContainersOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/Containers(zhoxing-workspace)\",\"marketplaceItemId\":\"Microsoft.ContainersOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.ContainersOMS.1.1.16/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-workspace\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"Containers\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-11T07:47:27.1639894Z\",\"duration\":\"PT17.5510901S\",\"correlationId\":\"f4dcc639-0fc4-4282-aa8d-ffc272fceb81\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/Containers(zhoxing-workspace)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AzureActivityOMS\",\"name\":\"Microsoft.AzureActivityOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureActivity(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.AzureActivityOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AzureActivityOMS.1.0.24/Artifacts/CreateResourcesDS2.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"2824832969719392094\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AzureActivity\"]},\"subscriptions\":{\"type\":\"Array\",\"value\":[{\"name\":\"0b1f64711bf04ddaaec3cb9272f09590\",\"value\":\"00000000-0000-0000-0000-000000000000\"}]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:33:45.2430768Z\",\"duration\":\"PT59.8719665S\",\"correlationId\":\"3e4ddc68-cf08-4767-9be7-60d8afb66c51\",\"providers\":[{\"namespace\":\"Microsoft.OperationalInsights\",\"resourceTypes\":[{\"resourceType\":\"workspaces\",\"locations\":[\"westus\"]},{\"resourceType\":\"workspaces/datasources\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test/datasources/0b1f64711bf04ddaaec3cb9272f09590\",\"resourceType\":\"Microsoft.OperationalInsights/workspaces/datasources\",\"resourceName\":\"zhoxing-test/0b1f64711bf04ddaaec3cb9272f09590\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationalInsights/workspaces/zhoxing-test/datasources/0b1f64711bf04ddaaec3cb9272f09590\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureActivity(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.KeyVaultAnalyticsOMS\",\"name\":\"Microsoft.KeyVaultAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/KeyVaultAnalytics(zhoxing-test)\",\"marketplaceItemId\":\"Microsoft.KeyVaultAnalyticsOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.KeyVaultAnalyticsOMS.1.0.3/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"KeyVaultAnalytics\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:31:14.5063619Z\",\"duration\":\"PT1M57.3764608S\",\"correlationId\":\"e06589b6-9999-46b0-acd8-746d94a7929e\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/KeyVaultAnalytics(zhoxing-test)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AzureSQLAnalyticsOMS\",\"name\":\"Microsoft.AzureSQLAnalyticsOMS\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureSQLAnalytics(zhoxing-test2)\",\"marketplaceItemId\":\"Microsoft.AzureSQLAnalyticsOMS\"},\"properties\":{\"templateLink\":{\"uri\":\"https://gallery.azure.com/artifact/20161101/Microsoft.AzureSQLAnalyticsOMS.1.0.4/Artifacts/CreateResources.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4518277868068772365\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"australiacentral\"},\"resourcegroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"workspaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"solutionTypes\":{\"type\":\"Array\",\"value\":[\"AzureSQLAnalytics\"]}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T07:28:49.7614647Z\",\"duration\":\"PT14.0840378S\",\"correlationId\":\"e9334b54-aa8b-40f6-aa91-57407411b296\",\"providers\":[{\"namespace\":\"Microsoft.OperationsManagement\",\"resourceTypes\":[{\"resourceType\":\"solutions\",\"locations\":[\"australiacentral\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.OperationsManagement/solutions/AzureSQLAnalytics(zhoxing-test2)\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.RecoveryServicesV2\",\"name\":\"Microsoft.RecoveryServicesV2\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.RecoveryServices/vaults/zhoxing-test3\",\"marketplaceItemId\":\"Microsoft.RecoveryServices\"},\"properties\":{\"templateHash\":\"3053162932619023657\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test3\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2016-06-01\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-08T06:25:27.3405945Z\",\"duration\":\"PT1M48.3942152S\",\"correlationId\":\"2deaa1e6-0adc-46a3-b111-fe8f37f1b398\",\"providers\":[{\"namespace\":\"Microsoft.RecoveryServices\",\"resourceTypes\":[{\"resourceType\":\"vaults\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.RecoveryServices/vaults/zhoxing-test3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.AutomationAccount\",\"name\":\"Microsoft.AutomationAccount\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"marketplaceItemId\":\"Microsoft.AutomationAccount\"},\"properties\":{\"templateHash\":\"5138374320965475375\",\"parameters\":{\"accountName\":{\"type\":\"String\",\"value\":\"zhoxingtest-account\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"sampleGraphicalRunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorial\"},\"sampleGraphicalRunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"sampleGraphicalRunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorial.graphrunbook\"},\"samplePowerShellRunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorialScript\"},\"samplePowerShellRunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"samplePowerShellRunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorial.ps1\"},\"samplePython2RunbookName\":{\"type\":\"String\",\"value\":\"AzureAutomationTutorialPython2\"},\"samplePython2RunbookDescription\":{\"type\":\"String\",\"value\":\" An example runbook which gets all the ARM resources using the Run As Account (Service Principal).\"},\"samplePython2RunbookContentUri\":{\"type\":\"String\",\"value\":\"https://eus2oaasibizamarketprod1.blob.core.windows.net/marketplace-runbooks/AzureAutomationTutorialPython2.py\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-07T05:48:49.7005559Z\",\"duration\":\"PT18.8833457S\",\"correlationId\":\"ee614d1b-52ab-4ef0-afdf-d922915f2b3e\",\"providers\":[{\"namespace\":\"Microsoft.Automation\",\"resourceTypes\":[{\"resourceType\":\"automationAccounts\",\"locations\":[\"westus\"]},{\"resourceType\":\"automationAccounts/runbooks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorial\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorial\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialScript\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorialScript\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\",\"resourceType\":\"Microsoft.Automation/automationAccounts\",\"resourceName\":\"zhoxingtest-account\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialPython2\",\"resourceType\":\"Microsoft.Automation/automationAccounts/runbooks\",\"resourceName\":\"zhoxingtest-account/AzureAutomationTutorialPython2\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorial\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialPython2\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Automation/automationAccounts/zhoxingtest-account/runbooks/AzureAutomationTutorialScript\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment2\",\"name\":\"vmDiagDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:42.5985993Z\",\"duration\":\"PT1M26.6277747S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgSQL-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment0\",\"name\":\"vmDiagDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:11.4939667Z\",\"duration\":\"PT56.0439465S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgProv-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment3\",\"name\":\"vmDiagDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:58:54.7494606Z\",\"duration\":\"PT1M20.2135439S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgSSIS-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment1\",\"name\":\"vmDiagDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/vmDiagnostics.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"4451127679186685416\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:59:07.2319602Z\",\"duration\":\"PT2M38.7113347S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines/extensions\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"idgdiag6472qnxl3vv5o\",\"actionName\":\"listkeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\",\"resourceType\":\"Microsoft.Compute/virtualMachines/extensions\",\"resourceName\":\"IdgBridge-vm/Microsoft.Insights.VMDiagnosticsSettings\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"name\":\"vmDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:57:30.3562117Z\",\"duration\":\"PT1M29.1949855S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"name\":\"vmDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:56:55.9936166Z\",\"duration\":\"PT1M3.9200963S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"name\":\"vmDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D8s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:57:34.837224Z\",\"duration\":\"PT1M48.2756885S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"name\":\"vmDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualMachines.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10830273775427581387\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"},\"vmSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:56:23.0087151Z\",\"duration\":\"PT51.2902622S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"name\":\"nicDeployment0\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgProv-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:37.7038947Z\",\"duration\":\"PT17.584134S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgProv-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"name\":\"nicDeployment1\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgBridge-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:25.6276069Z\",\"duration\":\"PT5.5078479S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgBridge-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"name\":\"nicDeployment2\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSQL-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:29.9412006Z\",\"duration\":\"PT9.825009S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSQL-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"name\":\"nicDeployment3\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkInterfaces.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"12524672659573940803\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"vmName\":{\"type\":\"String\",\"value\":\"IdgSSIS-vm\"},\"acclNetwork\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:30.4694553Z\",\"duration\":\"PT10.630804S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSSIS-vm-nic\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"name\":\"vnetDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/virtualNetworks.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"5494195655921763108\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"idgAppVnetCidr\":{\"type\":\"String\",\"value\":\"192.168.1.0/24\"},\"dnsServer\":{\"type\":\"String\",\"value\":\"127.0.0.1\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:55:05.4129775Z\",\"duration\":\"PT2M41.4654211S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"virtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/IdgApp-vnet\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/pid-da2390a8-7157-4348-8621-c0976bd5f1c6\",\"name\":\"pid-da2390a8-7157-4348-8621-c0976bd5f1c6\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"1785727386360713170\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:51:50.5099687Z\",\"duration\":\"PT1.8954266S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[],\"dependencies\":[],\"outputResources\":[]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nsgDeployment\",\"name\":\"nsgDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/networkSecurityGroups.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"10642932090194121923\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:52:13.8036944Z\",\"duration\":\"PT25.4723982S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/IdgApp-nsg\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"name\":\"storageAcctDeployment\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/nestedTemplates/storageAccounts.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"18339431791584614211\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"}},\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T08:53:52.4748921Z\",\"duration\":\"PT2M4.9763098S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/imprivatainc1580479939967.imprivata-identity-gove-20200403164818\",\"name\":\"imprivatainc1580479939967.imprivata-identity-gove-20200403164818\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test\",\"marketplaceItemId\":\"imprivatainc1580479939967.imprivata-identity-governance-solutionidgstandardplan\"},\"properties\":{\"templateLink\":{\"uri\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/mainTemplate.json\",\"contentVersion\":\"1.0.0.0\"},\"templateHash\":\"859551663346694352\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPassword\":{\"type\":\"SecureString\"},\"idgAppVnetCidr\":{\"type\":\"String\",\"value\":\"192.168.1.0/24\"},\"dnsServer\":{\"type\":\"String\",\"value\":\"127.0.0.1\"},\"diagStorageAcctName\":{\"type\":\"String\",\"value\":\"idgdiag6472qnxl3vv5o\"},\"_artifactsLocation\":{\"type\":\"String\",\"value\":\"https://catalogartifact.azureedge.net/publicartifacts/imprivatainc1580479939967.imprivata-identity-governance-solution-c0797466-dca0-4f45-b5b7-3a7c0eccdd48-idgstandardplan/Artifacts/mainTemplate.json\"},\"_artifactsLocationSasToken\":{\"type\":\"SecureString\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-03T09:01:06.5682687Z\",\"duration\":\"PT9M29.2016413S\",\"correlationId\":\"f81a1288-24c7-4407-b738-713ca7f7688c\",\"providers\":[{\"namespace\":\"Microsoft.Resources\",\"resourceTypes\":[{\"resourceType\":\"deployments\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nsgDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nsgDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vnetDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vnetDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment0\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment1\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment2\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/nicDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"nicDeployment3\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment3\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment0\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment0\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment0\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment1\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment1\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment1\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment2\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment2\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment2\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDeployment3\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/storageAcctDeployment\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"storageAcctDeployment\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/vmDiagDeployment3\",\"resourceType\":\"Microsoft.Resources/deployments\",\"resourceName\":\"vmDiagDeployment3\"}],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgBridge-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgProv-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSQL-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/IdgSSIS-vm/extensions/Microsoft.Insights.VMDiagnosticsSettings\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgBridge-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgProv-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSQL-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/IdgSSIS-vm-nic\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/IdgApp-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/IdgApp-vnet\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/idgdiag6472qnxl3vv5o\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/simple_deploy_template\",\"name\":\"simple_deploy_template\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"3058235493749754305\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"test-lb\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"privateIPAllocationMethod\":{\"type\":\"String\",\"value\":\"Dynamic\"},\"tags\":{\"type\":\"Object\",\"value\":{\"key\":\"super=value\"}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-04-02T03:06:24.1818395Z\",\"duration\":\"PT14.8233657S\",\"correlationId\":\"ca708581-b371-4382-a6d6-5abec0f80d25\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"loadBalancers\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"code\":\"InvalidTemplate\",\"message\":\"Unable to process template language expressions for resource '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/loadBalancers/test-lb' at line '1' and column '319'. 'The template parameter 'backendAddressPools' is not found. Please see https://aka.ms/arm-template/#parameters for usage details.'\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.CDN-Profilee5b1f1ba-1864-485e-9ad6-f8bd9a3ce039\",\"name\":\"Microsoft.CDN-Profilee5b1f1ba-1864-485e-9ad6-f8bd9a3ce039\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/microsoft.cdn/profiles/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.CDN\"},\"properties\":{\"templateHash\":\"14732945376673591230\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"Global\"},\"sku\":{\"type\":\"Object\",\"value\":{\"name\":\"Standard_Microsoft\"}},\"properties\":{\"type\":\"Object\",\"value\":{}}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-04-02T03:06:06.8118181Z\",\"duration\":\"PT27.868616S\",\"correlationId\":\"ec814e94-c7c8-415e-b86f-9d7d9365a8e2\",\"providers\":[{\"namespace\":\"microsoft.cdn\",\"resourceTypes\":[{\"resourceType\":\"profiles\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.cdn/profiles/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-2f67a819-99c8\",\"name\":\"Microsoft.Web-WebApp-Portal-2f67a819-99c8\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxingtest\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"46673888788683167\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxingtest\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"DOTNETCORE|3.1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-21T05:03:38.610818Z\",\"duration\":\"PT1M56.1369546S\",\"correlationId\":\"23ea4696-8e18-4ddb-a5b6-41d7796bee9b\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxingtest\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.SSL\",\"name\":\"Microsoft.SSL\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.SSL\"},\"properties\":{\"templateHash\":\"12688158336463581370\",\"parameters\":{\"certificateOrderName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"distinguishedName\":{\"type\":\"String\",\"value\":\"CN=azure.com\"},\"validityInYears\":{\"type\":\"Int\",\"value\":1},\"productType\":{\"type\":\"String\",\"value\":\"StandardDomainValidatedSsl\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-16T02:40:16.9924212Z\",\"duration\":\"PT2M46.4663723S\",\"correlationId\":\"9471490e-7e59-467d-8f14-48f8ccd95222\",\"providers\":[{\"namespace\":\"Microsoft.CertificateRegistration\",\"resourceTypes\":[{\"resourceType\":\"certificateOrders\",\"locations\":[\"global\"]},{\"resourceType\":\"certificateOrders/providers/locks\",\"locations\":[null]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\",\"resourceType\":\"Microsoft.CertificateRegistration/certificateOrders\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test/providers/Microsoft.Authorization/locks/zhoxing-test\",\"resourceType\":\"Microsoft.CertificateRegistration/certificateOrders/providers/locks\",\"resourceName\":\"zhoxing-test/Microsoft.Authorization/zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.CertificateRegistration/certificateOrders/zhoxing-test/providers/Microsoft.Authorization/locks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-a6e35847-84dc\",\"name\":\"Microsoft.Web-WebApp-Portal-a6e35847-84dc\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"3507869378131688434\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test3\"},\"location\":{\"type\":\"String\",\"value\":\"North Europe\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-a4dc\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"sku\":{\"type\":\"String\",\"value\":\"PremiumV2\"},\"skuCode\":{\"type\":\"String\",\"value\":\"P1v2\"},\"workerSize\":{\"type\":\"String\",\"value\":\"3\"},\"workerSizeId\":{\"type\":\"String\",\"value\":\"3\"},\"numberOfWorkers\":{\"type\":\"String\",\"value\":\"1\"},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"TOMCAT|8.5-java11\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:44:30.0394772Z\",\"duration\":\"PT2M14.3998742S\",\"correlationId\":\"e9c6365d-1b9d-47cb-88bc-2ff7a7aef6e2\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"northeurope\"]},{\"resourceType\":\"serverfarms\",\"locations\":[\"northeurope\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-a4dc\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-zhoxingtest-a4dc\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"zhoxing-test3\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-a4dc\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test3\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Azconfig_1\",\"name\":\"Microsoft.Azconfig_1\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxig-test\",\"marketplaceItemId\":\"Microsoft.Azconfig\"},\"properties\":{\"templateHash\":\"7820839542378675066\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxig-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2019-11-01-preview\"},\"sku\":{\"type\":\"String\",\"value\":\"standard\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:37:48.9475481Z\",\"duration\":\"PT1M9.4420097S\",\"correlationId\":\"309d8e1f-d83b-41af-a2b4-4fc2b8cf01f8\",\"providers\":[{\"namespace\":\"Microsoft.AppConfiguration\",\"resourceTypes\":[{\"resourceType\":\"configurationStores\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxig-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Azconfig\",\"name\":\"Microsoft.Azconfig\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.Azconfig\"},\"properties\":{\"templateHash\":\"7820839542378675066\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"apiVersion\":{\"type\":\"String\",\"value\":\"2019-11-01-preview\"},\"sku\":{\"type\":\"String\",\"value\":\"standard\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T09:36:45.6118614Z\",\"duration\":\"PT42.8616547S\",\"correlationId\":\"f6250c7e-1445-48f4-9a75-cb108ec016f2\",\"providers\":[{\"namespace\":\"Microsoft.AppConfiguration\",\"resourceTypes\":[{\"resourceType\":\"configurationStores\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.AppConfiguration/configurationStores/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-WebApp-Portal-79a51ab5-9a12\",\"name\":\"Microsoft.Web-WebApp-Portal-79a51ab5-9a12\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test2\",\"marketplaceItemId\":\"Microsoft.WebSite\"},\"properties\":{\"templateHash\":\"17885055924378240489\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test2\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"JAVA|11-java11\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-09T07:58:15.4849103Z\",\"duration\":\"PT2M54.4266008S\",\"correlationId\":\"f548362c-5720-4a35-aff0-6d85c593147b\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.VirtualNetwork-20200306160007\",\"name\":\"Microsoft.VirtualNetwork-20200306160007\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualNetwork-ARM\"},\"properties\":{\"templateHash\":\"417543149591126485\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"virtualNetworkName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"resourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"addressSpaces\":{\"type\":\"Array\",\"value\":[\"10.13.0.0/16\"]},\"ipv6Enabled\":{\"type\":\"Bool\",\"value\":false},\"subnetCount\":{\"type\":\"Int\",\"value\":1},\"subnet0_name\":{\"type\":\"String\",\"value\":\"default\"},\"subnet0_addressRange\":{\"type\":\"String\",\"value\":\"10.13.0.0/24\"},\"ddosProtectionPlanEnabled\":{\"type\":\"Bool\",\"value\":false},\"firewallEnabled\":{\"type\":\"Bool\",\"value\":false},\"bastionEnabled\":{\"type\":\"Bool\",\"value\":false}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-06T08:01:51.58624Z\",\"duration\":\"PT52.5208802S\",\"correlationId\":\"7edf093d-47e5-491f-9168-3824b2f63bfe\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"VirtualNetworks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/VirtualNetworks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/template-file\",\"name\":\"template-file\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"702802757667029667\",\"parameters\":{\"function-app-name\":{\"type\":\"String\",\"value\":\"orderProcessing\"},\"sku\":{\"type\":\"String\",\"value\":\"S3\"},\"storageAccountType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"location\":{\"type\":\"String\",\"value\":\"southcentralus\"},\"deploymentEnvironment\":{\"type\":\"String\",\"value\":\"CI\"},\"applicationSettings\":{\"type\":\"Object\",\"value\":{\"CI\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"1\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"},\"DEV\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"fakeCIProportiesPlaceholder\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"fakeCIProportiesPlaceholder\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"},\"QA\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"fakeCIProportiesPlaceholder\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"},\"STG\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"fakeCIProportiesPlaceholder\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"},\"TRN\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"fakeCIProportiesPlaceholder\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"},\"PROD\":{\"AzureWebJobsStorage\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsDashboard\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBus\":\"fakeCIProportiesPlaceholder\",\"AzureWebJobsServiceBusSource\":\"fakeCIProportiesPlaceholder\",\"ApplicationServiceBus\":\"fakeCIProportiesPlaceholder\",\"MobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"MenuDataMobileDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"IDPDbConnectionString\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbEndPointUrl\":\"fakeCIProportiesPlaceholder\",\"OrdersDocDbAuthKey\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppUrl\":\"fakeCIProportiesPlaceholder\",\"FunctionsAppKey\":\"fakeCIProportiesPlaceholder\",\"CosmosDBConnectionString\":\"fakeCIProportiesPlaceholder\",\"Xpient.MoBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Xpient.X-Company-Id\":\"fakeCIProportiesPlaceholder\",\"Xpient.keyId\":\"fakeCIProportiesPlaceholder\",\"Xpient.secretKey\":\"fakeCIProportiesPlaceholder\",\"Xpient.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"ServiceEndpoint\":\"fakeCIProportiesPlaceholder\",\"ServiceApiKey\":\"***REMOVED***\",\"Xpient.MaxLane\":\"fakeCIProportiesPlaceholder\",\"Aloha.MaxLane\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ShareFolderName\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.ConnectionString\":\"fakeCIProportiesPlaceholder\",\"AzureStorage.OrderMenuFolder\":\"fakeCIProportiesPlaceholder\",\"Givex.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternateUrl\":\"fakeCIProportiesPlaceholder\",\"Givex.UserId\":\"fakeCIProportiesPlaceholder\",\"Givex.Password\":\"***REMOVED***\",\"Givex.Port\":\"fakeCIProportiesPlaceholder\",\"Givex.AlternatePort\":\"fakeCIProportiesPlaceholder\",\"Givex.ReversalTimeout\":\"fakeCIProportiesPlaceholder\",\"Givex.MaxGiftCardBalance\":\"fakeCIProportiesPlaceholder\",\"Paypal.BaseUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.ClientId\":\"fakeCIProportiesPlaceholder\",\"PayPal.SecretKey\":\"fakeCIProportiesPlaceholder\",\"Paypal.Scope\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Cancel\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl.Return\":\"fakeCIProportiesPlaceholder\",\"PayPal.RedirectUrl\":\"fakeCIProportiesPlaceholder\",\"PayPal.RefreshTokenUrl\":\"fakeCIProportiesPlaceholder\",\"stripeapikeyprivatekey\":\"fakeCIProportiesPlaceholder\",\"StripeApiKeyPubKey\":\"fakeCIProportiesPlaceholder\",\"StripeCurrency\":\"usd\",\"StripeCentsMultiplier\":\"fakeCIProportiesPlaceholder\",\"RetryCount\":\"fakeCIProportiesPlaceholder\",\"StripeCardLimit\":\"fakeCIProportiesPlaceholder\",\"SignalNotificationHubUrl\":\"fakeCIProportiesPlaceholder\",\"NotificationHubName\":\"fakeCIProportiesPlaceholder\",\"DefaultFullSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"DefaultListenSharedAccessSignature\":\"fakeCIProportiesPlaceholder\",\"LoyaltyWebserviceAddress\":\"fakeCIProportiesPlaceholder\",\"EnableValidation\":\"fakeCIProportiesPlaceholder\",\"MaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"Aloha.PortalBaseUrl\":\"fakeCIProportiesPlaceholder\",\"Aloha.BasicAuthenticationKey\":\"fakeCIProportiesPlaceholder\",\"DeploymentEnv\":\"fakeCIProportiesPlaceholder\",\"Aloha.HonorLocalPriceCalculation\":\"fakeCIProportiesPlaceholder\",\"Aloha.DefaultItemQuantity\":\"fakeCIProportiesPlaceholder\",\"Aloha.Terminal\":\"fakeCIProportiesPlaceholder\",\"Aloha.ValidateFailedItems\":\"fakeCIProportiesPlaceholder\",\"POS.ThresholdPercent\":\"fakeCIProportiesPlaceholder\",\"IDP.TokenUrl\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientId.Internal\":\"fakeCIProportiesPlaceholder\",\"IDP.ClientSecret.Internal\":\"fakeCIProportiesPlaceholder\",\"FromEmail\":\"fakeCIProportiesPlaceholder\",\"FromName\":\"fakeCIProportiesPlaceholder\",\"SupportEmail\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.UserName\":\"fakeCIProportiesPlaceholder\",\"Sendgrid.Password\":\"***REMOVED***\",\"LogEmail\":\"fakeCIProportiesPlaceholder\",\"LogOrderStep\":\"fakeCIProportiesPlaceholder\",\"EmergencyClosureMinutesToCancellation\":\"fakeCIProportiesPlaceholder\",\"ServiceBusMaxRetryCount\":\"fakeCIProportiesPlaceholder\",\"XpientMaxOrderRetryCount\":\"fakeCIProportiesPlaceholder\"}}}},\"mode\":\"Incremental\",\"provisioningState\":\"Failed\",\"timestamp\":\"2020-03-04T10:14:30.6077838Z\",\"duration\":\"PT2M24.8861662S\",\"correlationId\":\"08fd1339-c062-4621-bef4-5e08fdc0c2c0\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"southcentralus\"]}]},{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"serverfarms\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/config\",\"locations\":[null]},{\"resourceType\":\"sites/slots\",\"locations\":[\"southcentralus\"]},{\"resourceType\":\"sites/slots/config\",\"locations\":[null]}]},{\"namespace\":\"Microsoft.Insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"southcentralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Insights/components/appInsights-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Insights/components\",\"resourceName\":\"appInsights-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-6472qnxl3vv5o\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/store6472qnxl3vv5o\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"store6472qnxl3vv5o\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/config\",\"resourceName\":\"orderProcessing/appsettings\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"orderProcessing\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage\",\"resourceType\":\"Microsoft.Web/sites/slots\",\"resourceName\":\"orderProcessing/stage\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/orderProcessing/slots/stage/config/appsettings\",\"resourceType\":\"Microsoft.Web/sites/slots/config\",\"resourceName\":\"orderProcessing/stage/appsettings\"}],\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.\",\"details\":[{\"message\":\"Website with given name orderProcessing already exists.\"}]}}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.StorageAccount-20200303110739\",\"name\":\"Microsoft.StorageAccount-20200303110739\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\",\"marketplaceItemId\":\"Microsoft.StorageAccount-ARM\"},\"properties\":{\"templateHash\":\"11961669741847493773\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"storageAccountName\":{\"type\":\"String\",\"value\":\"zhoxingtest2\"},\"accountType\":{\"type\":\"String\",\"value\":\"Standard_RAGRS\"},\"kind\":{\"type\":\"String\",\"value\":\"StorageV2\"},\"accessTier\":{\"type\":\"String\",\"value\":\"Hot\"},\"supportsHttpsTrafficOnly\":{\"type\":\"Bool\",\"value\":true}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-03-03T03:10:37.6643123Z\",\"duration\":\"PT2M0.5505696S\",\"correlationId\":\"7052b29c-5b03-4e4f-8454-72c45a2e3cdd\",\"providers\":[{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputs\":{},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/zhoxingtest2\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-c5af8169\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-c5af8169\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"5172196015951101467\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-27T08:34:39.2688632Z\",\"duration\":\"PT14.8304657S\",\"correlationId\":\"71919fa6-53e8-4069-bcf1-fe70e2bbd3ab\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - appInsights-6472qnxl3vv5o\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/ManagedDisk.zhoxing-test-20200226171012\",\"name\":\"ManagedDisk.zhoxing-test-20200226171012\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"},\"properties\":{\"templateHash\":\"12039005862602491955\",\"parameters\":{\"diskName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"sku\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"diskSizeGb\":{\"type\":\"Int\",\"value\":1024},\"sourceResourceId\":{\"type\":\"String\",\"value\":\"\"},\"sourceUri\":{\"type\":\"String\",\"value\":\"\"},\"osType\":{\"type\":\"String\",\"value\":\"\"},\"createOption\":{\"type\":\"String\",\"value\":\"empty\"},\"hyperVGeneration\":{\"type\":\"String\",\"value\":\"V1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T09:11:00.2182814Z\",\"duration\":\"PT38.6717939S\",\"correlationId\":\"3f30fb4e-5cd6-4d09-a86e-fe409e7cbf7f\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"disks\",\"locations\":[\"westus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/CreateVm-Canonical.UbuntuServer-18.04-LTS-20200226163817\",\"name\":\"CreateVm-Canonical.UbuntuServer-18.04-LTS-20200226163817\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.VirtualMachine\",\"provisioningHash\":\"SolutionProvider\"},\"properties\":{\"templateHash\":\"1155335703276677740\",\"parameters\":{\"location\":{\"type\":\"String\",\"value\":\"westus\"},\"networkInterfaceName\":{\"type\":\"String\",\"value\":\"zhoxing-test115\"},\"networkSecurityGroupName\":{\"type\":\"String\",\"value\":\"zhoxing-test-nsg\"},\"networkSecurityGroupRules\":{\"type\":\"Array\",\"value\":[{\"name\":\"SSH\",\"properties\":{\"priority\":300,\"protocol\":\"TCP\",\"access\":\"Allow\",\"direction\":\"Inbound\",\"sourceAddressPrefix\":\"*\",\"sourcePortRange\":\"*\",\"destinationAddressPrefix\":\"*\",\"destinationPortRange\":\"22\"}}]},\"subnetName\":{\"type\":\"String\",\"value\":\"Dtlzhoxing-testSubnet\"},\"virtualNetworkId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/virtualNetworks/Dtlzhoxing-test\"},\"publicIpAddressName\":{\"type\":\"String\",\"value\":\"zhoxing-test-ip\"},\"publicIpAddressType\":{\"type\":\"String\",\"value\":\"Dynamic\"},\"publicIpAddressSku\":{\"type\":\"String\",\"value\":\"Basic\"},\"virtualMachineName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"virtualMachineRG\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"osDiskType\":{\"type\":\"String\",\"value\":\"Standard_LRS\"},\"ephemeralDiskType\":{\"type\":\"String\",\"value\":\"Local\"},\"virtualMachineSize\":{\"type\":\"String\",\"value\":\"Standard_D2s_v3\"},\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"adminPublicKey\":{\"type\":\"SecureString\"},\"diagnosticsStorageAccountName\":{\"type\":\"String\",\"value\":\"azhoxingtest9851\"},\"diagnosticsStorageAccountId\":{\"type\":\"String\",\"value\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/azhoxingtest9851\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T08:51:00.5987566Z\",\"duration\":\"PT5M19.5821373S\",\"correlationId\":\"e1c52866-133b-46c5-b44f-4b189342f502\",\"providers\":[{\"namespace\":\"Microsoft.Network\",\"resourceTypes\":[{\"resourceType\":\"networkInterfaces\",\"locations\":[\"westus\"]},{\"resourceType\":\"networkSecurityGroups\",\"locations\":[\"westus\"]},{\"resourceType\":\"publicIpAddresses\",\"locations\":[\"westus\"]}]},{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"virtualMachines\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test-nsg\",\"resourceType\":\"Microsoft.Network/networkSecurityGroups\",\"resourceName\":\"zhoxing-test-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/publicIpAddresses/zhoxing-test-ip\",\"resourceType\":\"Microsoft.Network/publicIpAddresses\",\"resourceName\":\"zhoxing-test-ip\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test115\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\",\"resourceType\":\"Microsoft.Network/networkInterfaces\",\"resourceName\":\"zhoxing-test115\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\",\"resourceType\":\"Microsoft.Compute/virtualMachines\",\"resourceName\":\"zhoxing-test\"}],\"outputs\":{\"adminUsername\":{\"type\":\"String\",\"value\":\"zhoxing-test\"}},\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/virtualMachines/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkInterfaces/zhoxing-test115\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/networkSecurityGroups/zhoxing-test-nsg\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Network/publicIpAddresses/zhoxing-test-ip\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.ManagedDisk-20200226152558\",\"name\":\"Microsoft.ManagedDisk-20200226152558\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.ManagedDisk\"},\"properties\":{\"templateHash\":\"12039005862602491955\",\"parameters\":{\"diskName\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"centralus\"},\"sku\":{\"type\":\"String\",\"value\":\"Premium_LRS\"},\"diskSizeGb\":{\"type\":\"Int\",\"value\":1024},\"sourceResourceId\":{\"type\":\"String\",\"value\":\"\"},\"sourceUri\":{\"type\":\"String\",\"value\":\"\"},\"osType\":{\"type\":\"String\",\"value\":\"\"},\"createOption\":{\"type\":\"String\",\"value\":\"empty\"},\"hyperVGeneration\":{\"type\":\"String\",\"value\":\"\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-26T07:29:17.6989646Z\",\"duration\":\"PT1M45.6036662S\",\"correlationId\":\"a3b05ab7-7067-42de-8a8f-69fb50d29cd6\",\"providers\":[{\"namespace\":\"Microsoft.Compute\",\"resourceTypes\":[{\"resourceType\":\"disks\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Compute/disks/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Failure-Anomalies-Alert-Rule-Deployment-f2c320be\",\"name\":\"Failure-Anomalies-Alert-Rule-Deployment-f2c320be\",\"type\":\"Microsoft.Resources/deployments\",\"properties\":{\"templateHash\":\"13072379069581100190\",\"mode\":\"Incremental\",\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-25T07:05:18.4469125Z\",\"duration\":\"PT1M34.5604185S\",\"correlationId\":\"f8973acb-0579-488d-8030-394695952ab2\",\"providers\":[{\"namespace\":\"microsoft.alertsmanagement\",\"resourceTypes\":[{\"resourceType\":\"smartdetectoralertrules\",\"locations\":[\"global\"]}]}],\"dependencies\":[],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.alertsmanagement/smartdetectoralertrules/Failure Anomalies - zhoxing-test\"}]}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.Web-FunctionApp-Portal-6d97c7e0-9fde\",\"name\":\"Microsoft.Web-FunctionApp-Portal-6d97c7e0-9fde\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.FunctionApp\",\"provisioningHash\":\"customize-to-open-functionapp-iframe-blade\"},\"properties\":{\"templateHash\":\"9962553435085722188\",\"parameters\":{\"subscriptionId\":{\"type\":\"String\",\"value\":\"00000000-0000-0000-0000-000000000000\"},\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"location\":{\"type\":\"String\",\"value\":\"Central US\"},\"hostingEnvironment\":{\"type\":\"String\",\"value\":\"\"},\"hostingPlanName\":{\"type\":\"String\",\"value\":\"ASP-zhoxingtest-b6db\"},\"serverFarmResourceGroup\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"alwaysOn\":{\"type\":\"Bool\",\"value\":true},\"storageAccountName\":{\"type\":\"String\",\"value\":\"storageaccountzhoxib2a8\"},\"linuxFxVersion\":{\"type\":\"String\",\"value\":\"DOCKER|mcr.microsoft.com/azure-functions/python:2.0-python3.7-appservice\"},\"sku\":{\"type\":\"String\",\"value\":\"PremiumV2\"},\"skuCode\":{\"type\":\"String\",\"value\":\"P1v2\"},\"workerSize\":{\"type\":\"String\",\"value\":\"3\"},\"workerSizeId\":{\"type\":\"String\",\"value\":\"3\"},\"numberOfWorkers\":{\"type\":\"String\",\"value\":\"1\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-25T06:57:31.252644Z\",\"duration\":\"PT4M23.4856285S\",\"correlationId\":\"84740008-300c-4c04-9d61-fd48d35228fe\",\"providers\":[{\"namespace\":\"Microsoft.Web\",\"resourceTypes\":[{\"resourceType\":\"sites\",\"locations\":[\"centralus\"]},{\"resourceType\":\"serverfarms\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"microsoft.insights\",\"resourceTypes\":[{\"resourceType\":\"components\",\"locations\":[\"centralus\"]}]},{\"namespace\":\"Microsoft.Storage\",\"resourceTypes\":[{\"resourceType\":\"storageAccounts\",\"locations\":[\"centralus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-b6db\",\"resourceType\":\"Microsoft.Web/serverfarms\",\"resourceName\":\"ASP-zhoxingtest-b6db\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"storageaccountzhoxib2a8\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\",\"resourceType\":\"microsoft.insights/components\",\"resourceName\":\"zhoxing-test\",\"apiVersion\":\"2015-05-01\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\",\"resourceType\":\"Microsoft.Storage/storageAccounts\",\"resourceName\":\"storageaccountzhoxib2a8\",\"actionName\":\"listKeys\",\"apiVersion\":\"2019-06-01\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\",\"resourceType\":\"Microsoft.Web/sites\",\"resourceName\":\"zhoxing-test\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/microsoft.insights/components/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Storage/storageAccounts/storageaccountzhoxib2a8\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/serverfarms/ASP-zhoxingtest-b6db\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Web/sites/zhoxing-test\"}],\"validationLevel\":\"Template\"}},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.Resources/deployments/Microsoft.DevTestLab.15822636708715723\",\"name\":\"Microsoft.DevTestLab.15822636708715723\",\"type\":\"Microsoft.Resources/deployments\",\"tags\":{\"primaryResourceId\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"marketplaceItemId\":\"Microsoft.DevTestLab\"},\"properties\":{\"templateHash\":\"12517873995286308294\",\"parameters\":{\"name\":{\"type\":\"String\",\"value\":\"zhoxing-test\"},\"regionId\":{\"type\":\"String\",\"value\":\"westus\"}},\"mode\":\"Incremental\",\"debugSetting\":{\"detailLevel\":\"None\"},\"provisioningState\":\"Succeeded\",\"timestamp\":\"2020-02-21T05:45:01.3414833Z\",\"duration\":\"PT2M52.6804059S\",\"correlationId\":\"95ef1f49-1b94-40e5-ae49-7bd3dd57aca7\",\"providers\":[{\"namespace\":\"Microsoft.DevTestLab\",\"resourceTypes\":[{\"resourceType\":\"labs\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/schedules\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/virtualNetworks\",\"locations\":[\"westus\"]},{\"resourceType\":\"labs/artifactSources\",\"locations\":[\"westus\"]}]}],\"dependencies\":[{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/schedules/LabVmsShutdown\",\"resourceType\":\"Microsoft.DevTestLab/labs/schedules\",\"resourceName\":\"zhoxing-test/LabVmsShutdown\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/virtualNetworks/Dtlzhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs/virtualNetworks\",\"resourceName\":\"zhoxing-test/Dtlzhoxing-test\"},{\"dependsOn\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\",\"resourceType\":\"Microsoft.DevTestLab/labs\",\"resourceName\":\"zhoxing-test\"}],\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/artifactSources/Public Environment Repo\",\"resourceType\":\"Microsoft.DevTestLab/labs/artifactSources\",\"resourceName\":\"zhoxing-test/Public Environment Repo\"}],\"outputResources\":[{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/artifactSources/Public Environment Repo\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/schedules/LabVmsShutdown\"},{\"id\":\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/zhoxing-test/providers/Microsoft.DevTestLab/labs/zhoxing-test/virtualNetworks/Dtlzhoxing-test\"}],\"validationLevel\":\"Template\"}}]}", "Content-Type" : "application/json; charset=utf-8" }, "Exception" : null @@ -4523,4 +4523,4 @@ "Exception" : null } ], "variables" : [ "792432" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanager/docs/SAMPLE.md b/sdk/resourcemanager/docs/SAMPLE.md index 11a175b52ea9..6e0b0aafa7eb 100644 --- a/sdk/resourcemanager/docs/SAMPLE.md +++ b/sdk/resourcemanager/docs/SAMPLE.md @@ -354,8 +354,8 @@ You can create a SQL server instance by using a `define() … create()` method c SqlServer sqlServer = azure.sqlServers().define(sqlServerName) .withRegion(Region.US_EAST) .withNewResourceGroup(rgName) - .withAdministratorLogin("adminlogin123") - .withAdministratorPassword("myS3cureP@ssword") + .withAdministratorLogin("fakeAdminLoginPlaceholder") + .withAdministratorPassword("fakePasswordPlaceholder") .withNewFirewallRule("10.0.0.1") .withNewFirewallRule("10.2.0.1", "10.2.0.10") .create(); diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployMultipleWars.json b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployMultipleWars.json index 8d5e0911f6bc..d493bfb87f07 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployMultipleWars.json +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployMultipleWars.json @@ -170,7 +170,7 @@ "X-AspNet-Version" : "4.0.30319", "Expires" : "-1", "x-ms-request-id" : "b4be7f07-b8bf-4fa4-87b4-892f2383c224", - "Body" : "", + "Body" : "", "Content-Type" : "application/xml", "X-Powered-By" : "ASP.NET" }, @@ -247,4 +247,4 @@ "Exception" : null } ], "variables" : [ "webapp-655058a08", "javacsmrg03408682", "javawebapp-655058a08plan536641" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployWar.json b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployWar.json index c5c7e37e4282..3982257a3a2f 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployWar.json +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WarDeployTests.canDeployWar.json @@ -139,7 +139,7 @@ "X-AspNet-Version" : "4.0.30319", "Expires" : "-1", "x-ms-request-id" : "c02435c3-7171-4d7b-8c3b-56a6db1969ad", - "Body" : "", + "Body" : "", "Content-Type" : "application/xml", "X-Powered-By" : "ASP.NET" }, @@ -194,4 +194,4 @@ "Exception" : null } ], "variables" : [ "webapp-70287c1e1", "javacsmrg66127281", "javawebapp-70287c1e1plan26929e" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json index 579f29085ecc..2ca35eff4855 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithMsi.json @@ -206,7 +206,7 @@ "content-type" : "application/xml", "cache-control" : "no-cache", "x-ms-request-id" : "06f128fc-df24-4c21-85fa-7e1fc5490c33", - "Body" : "" + "Body" : "" } }, { "Method" : "DELETE", @@ -257,4 +257,4 @@ } } ], "variables" : [ "java-webapp-396048", "javacsmrgdb2680588", "java-vault-b8599627", "javacsmrg28995695f", "java-webapp-396048plana21166054", "5d507665-6a49-41f1-899d-b801daf49681", "72ac9208-c6ce-4778-a5fe-378ecd5fa4b9" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json index bc01a8bd03d1..7b1725200312 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/WebAppsMsiTests.canCRUDWebAppWithUserAssignedMsi.json @@ -680,7 +680,7 @@ "content-type" : "application/xml", "cache-control" : "no-cache", "x-ms-request-id" : "1e010b19-82d5-45ed-aa75-83ea382bf2e7", - "Body" : "" + "Body" : "" } }, { "Method" : "DELETE", @@ -730,4 +730,4 @@ } } ], "variables" : [ "java-webapp-950371", "javacsmrg6d159438f", "java-vault-dfc68171", "javacsmrg3fb33152b", "msi-idddc18949", "msi-id5e854684", "2776ddba-18da-4bcb-a5db-9a0f02cea20a", "a9906585-0113-403b-bd83-62e1cc4c64c4", "56b03147-6506-42c9-b353-fe8284b2553b", "java-webapp-950371plancf423909d", "8ec8a6bb-1158-4aaa-9938-75072a36baee", "7978527b-c708-46b5-949e-54e81f3c3e64", "be4a5b03-e23d-483e-94c7-726b1581d394" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json index 2ae682b8662a..330f1ca9f112 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager-appservice/src/test/resources/session-records/ZipDeployTests.canZipDeployFunction.json @@ -321,7 +321,7 @@ "content-type" : "application/xml", "cache-control" : "no-cache", "x-ms-request-id" : "e2ce6190-8e86-44b5-a632-771198208c27", - "Body" : "" + "Body" : "" } }, { "Method" : "GET", @@ -403,4 +403,4 @@ } } ], "variables" : [ "java-func-902291304", "javacsmrg043322922", "java-func-902291304plan1fe17149", "a069fd2d04734282aa0d", "java-func-90229130439960561dc" ] -} \ No newline at end of file +} diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java index f7f0e662dd04..73a2268bd8f7 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestResourceStreaming.java @@ -55,7 +55,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc virtualMachines.manager().resourceManager().internalContext().randomResourceName("pip", 20)) .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4")) .withNewStorageAccount(storageCreatable) .withNewAvailabilitySet(virtualMachines.manager().resourceManager().internalContext().randomResourceName("avset", 10)) diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java index 89aafff3a160..5f9ad254e2ad 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineDataDisk.java @@ -27,7 +27,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc .withoutPrimaryPublicIPAddress() .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withUnmanagedDisks() .withNewUnmanagedDataDisk(30) .defineUnmanagedDataDisk("disk2") diff --git a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java index f5a8fce3ccc0..c8bb2e5c2369 100644 --- a/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java +++ b/sdk/resourcemanagerhybrid/azure-resourcemanager/src/test/java/com/azure/resourcemanager/TestVirtualMachineSizes.java @@ -31,7 +31,7 @@ public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exc .withoutPrimaryPublicIPAddress() .withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER) .withAdminUsername("testuser") - .withAdminPassword("12NewPA$$w0rd!") + .withAdminPassword("fakePasswordPlaceholder") .withSize(availableSize.name()) // Use the first size .create(); diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/IndexingSyncTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/IndexingSyncTests.java index a41cb0e0f24e..d4ed6bcd11aa 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/IndexingSyncTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/IndexingSyncTests.java @@ -105,7 +105,7 @@ public void canIndexWithPascalCaseFields() { List books = new ArrayList<>(); books.add(new Book() - .ISBN("123") + .ISBN("132") .title("Lord of the Rings") .author(new Author() .firstName("J.R.R") @@ -113,7 +113,7 @@ public void canIndexWithPascalCaseFields() { ); List result = client.uploadDocuments(books).getResults(); - this.assertIndexActionSucceeded("123", result.get(0), 201); + this.assertIndexActionSucceeded("132", result.get(0), 201); waitForIndexing(); assertEquals(1L, client.getDocumentCount()); diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/LookupSyncTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/LookupSyncTests.java index 21803e2e0f59..61e816c91cc5 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/LookupSyncTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/LookupSyncTests.java @@ -422,7 +422,7 @@ Hotel prepareEmptyHotel() { } Hotel preparePascalCaseFieldsHotel() { - return new Hotel().hotelId("123").hotelName("Lord of the Rings").description("J.R.R").descriptionFr("Tolkien"); + return new Hotel().hotelId("132").hotelName("Lord of the Rings").description("J.R.R").descriptionFr("Tolkien"); } @SuppressWarnings({"deprecation", "UseOfObsoleteDateTimeApi"}) diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchDocumentConverterTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchDocumentConverterTests.java index 0331aca6c6aa..c232e0e2a808 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchDocumentConverterTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchDocumentConverterTests.java @@ -76,7 +76,7 @@ public void canReadNullValues() { @Test public void canReadPrimitiveTypes() { Map values = new HashMap<>(); - values.put("123", 123); + values.put("132", 132); values.put("9999999999999", 9_999_999_999_999L); values.put("3.25", 3.25); values.put("\"hello\"", "hello"); @@ -264,9 +264,9 @@ public void specialDoublesAreReadAsStrings() { @Test public void dateTimeStringsInArraysAreReadAsDateTime() { - String json = "{ \"field\": [ \"hello\", \"".concat(TEST_DATE_STRING).concat("\", \"123\" ] }}"); + String json = "{ \"field\": [ \"hello\", \"".concat(TEST_DATE_STRING).concat("\", \"132\" ] }}"); SearchDocument expectedDoc = new SearchDocument( - Collections.singletonMap("field", Arrays.asList("hello", TEST_DATE, "123"))); + Collections.singletonMap("field", Arrays.asList("hello", TEST_DATE, "132"))); SearchDocument actualDoc = deserialize(json); assertMapEquals(expectedDoc, actualDoc, false); diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchSyncTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchSyncTests.java index 430678bf29b7..52c2f7f4ea31 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchSyncTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/SearchSyncTests.java @@ -276,7 +276,7 @@ public void canRoundTripNonNullableValueTypes() { Date startEpoch = Date.from(Instant.ofEpochMilli(1275346800000L)); NonNullableModel doc1 = new NonNullableModel() - .key("123") + .key("132") .count(3) .isEnabled(true) .rating(5) @@ -1032,7 +1032,7 @@ String createIndexWithValueTypes() { List> createDocsListWithValueTypes() { Map element1 = new HashMap<>(); - element1.put("Key", "123"); + element1.put("Key", "132"); element1.put("IntValue", 0); Map subElement1 = new HashMap<>(); diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/CustomAnalyzerSyncTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/CustomAnalyzerSyncTests.java index 09c67f86437c..76883a5494ac 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/CustomAnalyzerSyncTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/CustomAnalyzerSyncTests.java @@ -853,7 +853,7 @@ SearchIndex prepareIndexWithAllAnalysisComponentTypes() { .setMaxGram(3), new PatternCaptureTokenFilter(generateName(), Collections.singletonList(".*")) .setPreserveOriginal(false), - new PatternReplaceTokenFilter(generateName(), "abc", "123"), + new PatternReplaceTokenFilter(generateName(), "abc", "132"), new PhoneticTokenFilter(generateName()) .setEncoder(PhoneticEncoder.SOUNDEX) .setOriginalTokensReplaced(false), @@ -897,7 +897,7 @@ SearchIndex prepareIndexWithAllAnalysisComponentTypes() { .setCharFilters(new MappingCharFilter(customCharFilterName.toString(), Collections.singletonList("a => b")), // One custom char filter for CustomeAnalyer above. new MappingCharFilter(generateName(), Arrays.asList("s => $", "S => $")), - new PatternReplaceCharFilter(generateName(), "abc", "123")); + new PatternReplaceCharFilter(generateName(), "abc", "132")); } SearchIndex createIndexWithSpecialDefaults() { diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/DataSourceSyncTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/DataSourceSyncTests.java index db0eacc18cfe..13d415b25f8c 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/DataSourceSyncTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/DataSourceSyncTests.java @@ -39,7 +39,7 @@ public class DataSourceSyncTests extends SearchTestBase { private static final String FAKE_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://NotaRealAccount.documents.azure.com;AccountKey=fake;Database=someFakeDatabase"; public static final String FAKE_AZURE_SQL_CONNECTION_STRING = - "Server=tcp:fakeUri,1433;Database=fakeDatabase;User ID=reader;Password=fakePassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;"; + "Server=tcp:fakeUri,1433;Database=fakeDatabase;User ID=reader;Password=fakePasswordPlaceholder;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;"; private final List dataSourcesToDelete = new ArrayList<>(); private SearchIndexerClient client; diff --git a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/SearchIndexClientBuilderTests.java b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/SearchIndexClientBuilderTests.java index 2c0ee37e6196..9b06bef041a9 100644 --- a/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/SearchIndexClientBuilderTests.java +++ b/sdk/search/azure-search-documents/src/test/java/com/azure/search/documents/indexes/SearchIndexClientBuilderTests.java @@ -39,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class SearchIndexClientBuilderTests { - private final AzureKeyCredential searchApiKeyCredential = new AzureKeyCredential("0123"); + private final AzureKeyCredential searchApiKeyCredential = new AzureKeyCredential("fakeApiKeyPlaceholder"); private final String searchEndpoint = "https://test.search.windows.net"; private final SearchServiceVersion apiVersion = SearchServiceVersion.V2020_06_30; diff --git a/sdk/search/azure-search-documents/src/test/resources/session-records/CustomAnalyzerSyncTests.canCreateAllAnalysisComponents.json b/sdk/search/azure-search-documents/src/test/resources/session-records/CustomAnalyzerSyncTests.canCreateAllAnalysisComponents.json index bd357bf42cd1..831dbeb30bba 100644 --- a/sdk/search/azure-search-documents/src/test/resources/session-records/CustomAnalyzerSyncTests.canCreateAllAnalysisComponents.json +++ b/sdk/search/azure-search-documents/src/test/resources/session-records/CustomAnalyzerSyncTests.canCreateAllAnalysisComponents.json @@ -21,7 +21,7 @@ "elapsed-time" : "1759", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"@odata.context\":\"https://alzimmer-test.search.windows.net/$metadata#indexes/$entity\",\"@odata.etag\":\"\\\"0x8D94633A56612B5\\\"\",\"name\":\"hotelscancreateallanalysiscomponents60e349463ae36c8751\",\"defaultScoringProfile\":\"MyProfile\",\"fields\":[{\"name\":\"HotelId\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":true,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"HotelName\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Description\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"en.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"DescriptionFr\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"fr.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Description_Custom\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":\"stop\",\"searchAnalyzer\":\"stop\",\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Category\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Tags\",\"type\":\"Collection(Edm.String)\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"ParkingIncluded\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SmokingAllowed\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"LastRenovationDate\",\"type\":\"Edm.DateTimeOffset\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Rating\",\"type\":\"Edm.Int32\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Address\",\"type\":\"Edm.ComplexType\",\"fields\":[{\"name\":\"StreetAddress\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"City\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"StateProvince\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Country\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"PostalCode\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}]},{\"name\":\"Location\",\"type\":\"Edm.GeographyPoint\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":false,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Rooms\",\"type\":\"Collection(Edm.ComplexType)\",\"fields\":[{\"name\":\"Description\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"en.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"DescriptionFr\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"fr.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Type\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"BaseRate\",\"type\":\"Edm.Double\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"BedOptions\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SleepsCount\",\"type\":\"Edm.Int32\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SmokingAllowed\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Tags\",\"type\":\"Collection(Edm.String)\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}]},{\"name\":\"TotalGuests\",\"type\":\"Edm.Int64\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"ProfitMargin\",\"type\":\"Edm.Double\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}],\"scoringProfiles\":[{\"name\":\"MyProfile\",\"functionAggregation\":\"average\",\"text\":{\"weights\":{\"Description\":1.5,\"Category\":2.0}},\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"constant\",\"type\":\"magnitude\",\"boost\":2.0,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":1.0,\"boostingRangeEnd\":4.0,\"constantBoostBeyondRange\":true},\"distance\":null,\"tag\":null},{\"fieldName\":\"Location\",\"interpolation\":\"linear\",\"type\":\"distance\",\"boost\":1.5,\"freshness\":null,\"magnitude\":null,\"distance\":{\"referencePointParameter\":\"Loc\",\"boostingDistance\":5.0},\"tag\":null},{\"fieldName\":\"LastRenovationDate\",\"interpolation\":\"logarithmic\",\"type\":\"freshness\",\"boost\":1.1,\"freshness\":{\"boostingDuration\":\"P365D\"},\"magnitude\":null,\"distance\":null,\"tag\":null}]},{\"name\":\"ProfileTwo\",\"functionAggregation\":\"maximum\",\"text\":null,\"functions\":[{\"fieldName\":\"Tags\",\"interpolation\":\"linear\",\"type\":\"tag\",\"boost\":1.5,\"freshness\":null,\"magnitude\":null,\"distance\":null,\"tag\":{\"tagsParameter\":\"MyTags\"}}]},{\"name\":\"ProfileThree\",\"functionAggregation\":\"minimum\",\"text\":null,\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"quadratic\",\"type\":\"magnitude\",\"boost\":3.0,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":0.0,\"boostingRangeEnd\":10.0,\"constantBoostBeyondRange\":false},\"distance\":null,\"tag\":null}]},{\"name\":\"ProfileFour\",\"functionAggregation\":\"firstMatching\",\"text\":null,\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"constant\",\"type\":\"magnitude\",\"boost\":3.25,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":1.0,\"boostingRangeEnd\":5.0,\"constantBoostBeyondRange\":false},\"distance\":null,\"tag\":null}]}],\"corsOptions\":{\"allowedOrigins\":[\"http://tempuri.org\",\"http://localhost:80\"],\"maxAgeInSeconds\":60},\"suggesters\":[{\"name\":\"FancySuggester\",\"searchMode\":\"analyzingInfixMatching\",\"sourceFields\":[\"HotelName\"]}],\"analyzers\":[{\"@odata.type\":\"#Microsoft.Azure.Search.CustomAnalyzer\",\"name\":\"azsmnet05645b1bd4a\",\"tokenizer\":\"my_tokenizer\",\"tokenFilters\":[\"my_tokenfilter\"],\"charFilters\":[\"my_charfilter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.CustomAnalyzer\",\"name\":\"azsmnet05355e2ebd5\",\"tokenizer\":\"edgeNGram\",\"tokenFilters\":[],\"charFilters\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternAnalyzer\",\"name\":\"azsmnet80863aef9cf\",\"lowercase\":false,\"pattern\":\"abc\",\"flags\":\"DOTALL\",\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StandardAnalyzer\",\"name\":\"azsmnet93032858785\",\"maxTokenLength\":100,\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StopAnalyzer\",\"name\":\"azsmnet265432f539f\",\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StopAnalyzer\",\"name\":\"azsmnet38045f85b44\",\"stopwords\":[]}],\"normalizers\":[],\"tokenizers\":[{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenizer\",\"name\":\"my_tokenizer\",\"minGram\":1,\"maxGram\":2,\"tokenChars\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenizer\",\"name\":\"azsmnet366843a491a\",\"minGram\":2,\"maxGram\":4,\"tokenChars\":[\"letter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.NGramTokenizer\",\"name\":\"azsmnet445336c6a42\",\"minGram\":2,\"maxGram\":4,\"tokenChars\":[\"letter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.ClassicTokenizer\",\"name\":\"azsmnet430374ecf54\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordTokenizerV2\",\"name\":\"azsmnet45737ae4c0e\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.MicrosoftLanguageStemmingTokenizer\",\"name\":\"azsmnet18695841da2\",\"maxTokenLength\":100,\"isSearchTokenizer\":true,\"language\":\"croatian\"},{\"@odata.type\":\"#Microsoft.Azure.Search.MicrosoftLanguageTokenizer\",\"name\":\"azsmnet3966376ea78\",\"maxTokenLength\":100,\"isSearchTokenizer\":true,\"language\":\"thai\"},{\"@odata.type\":\"#Microsoft.Azure.Search.PathHierarchyTokenizerV2\",\"name\":\"azsmnet338159ad337\",\"delimiter\":\":\",\"replacement\":\"_\",\"maxTokenLength\":300,\"reverse\":true,\"skip\":2},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternTokenizer\",\"name\":\"azsmnet063115a8fa4\",\"pattern\":\".*\",\"flags\":\"MULTILINE\",\"group\":0},{\"@odata.type\":\"#Microsoft.Azure.Search.StandardTokenizerV2\",\"name\":\"azsmnet28648d1ff38\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.UaxUrlEmailTokenizer\",\"name\":\"azsmnet24207efff61\",\"maxTokenLength\":100}],\"tokenFilters\":[{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"my_tokenfilter\",\"ignoreScripts\":[],\"outputUnigrams\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"azsmnet91120ce57df\",\"ignoreScripts\":[\"han\"],\"outputUnigrams\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"azsmnet44479216943\",\"ignoreScripts\":[],\"outputUnigrams\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.AsciiFoldingTokenFilter\",\"name\":\"azsmnet3515975dfc3\",\"preserveOriginal\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.AsciiFoldingTokenFilter\",\"name\":\"azsmnet81377ec6617\",\"preserveOriginal\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.CommonGramTokenFilter\",\"name\":\"azsmnet20391a96cb3\",\"commonWords\":[\"hello\",\"goodbye\"],\"ignoreCase\":true,\"queryMode\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.CommonGramTokenFilter\",\"name\":\"azsmnet92280a9aebb\",\"commonWords\":[\"at\"],\"ignoreCase\":false,\"queryMode\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.DictionaryDecompounderTokenFilter\",\"name\":\"azsmnet19475bc6b2e\",\"wordList\":[\"Schadenfreude\"],\"minWordSize\":10,\"minSubwordSize\":5,\"maxSubwordSize\":13,\"onlyLongestMatch\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2\",\"name\":\"azsmnet12467a6a243\",\"minGram\":2,\"maxGram\":10,\"side\":\"back\"},{\"@odata.type\":\"#Microsoft.Azure.Search.ElisionTokenFilter\",\"name\":\"azsmnet05717793892\",\"articles\":[\"a\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.ElisionTokenFilter\",\"name\":\"azsmnet7113459606c\",\"articles\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.KeepTokenFilter\",\"name\":\"azsmnet0274352ad9f\",\"keepWords\":[\"aloha\"],\"keepWordsCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeepTokenFilter\",\"name\":\"azsmnet012873f6a74\",\"keepWords\":[\"e\",\"komo\",\"mai\"],\"keepWordsCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordMarkerTokenFilter\",\"name\":\"azsmnet66896680dc2\",\"keywords\":[\"key\",\"words\"],\"ignoreCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordMarkerTokenFilter\",\"name\":\"azsmnet27693e8ae80\",\"keywords\":[\"essential\"],\"ignoreCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.LengthTokenFilter\",\"name\":\"azsmnet03652742914\",\"min\":5,\"max\":10},{\"@odata.type\":\"#Microsoft.Azure.Search.LimitTokenFilter\",\"name\":\"azsmnet9395391834b\",\"maxTokenCount\":10,\"consumeAllTokens\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.NGramTokenFilterV2\",\"name\":\"azsmnet730073baf23\",\"minGram\":2,\"maxGram\":3},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternCaptureTokenFilter\",\"name\":\"azsmnet1211023410b\",\"patterns\":[\".*\"],\"preserveOriginal\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternReplaceTokenFilter\",\"name\":\"azsmnet08306fdb9b4\",\"pattern\":\"abc\",\"replacement\":\"123\"},{\"@odata.type\":\"#Microsoft.Azure.Search.PhoneticTokenFilter\",\"name\":\"azsmnet68615d781fe\",\"encoder\":\"soundex\",\"replace\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.ShingleTokenFilter\",\"name\":\"azsmnet04760245f50\",\"maxShingleSize\":10,\"minShingleSize\":5,\"outputUnigrams\":false,\"outputUnigramsIfNoShingles\":true,\"tokenSeparator\":\" \",\"filterToken\":\"|\"},{\"@odata.type\":\"#Microsoft.Azure.Search.SnowballTokenFilter\",\"name\":\"azsmnet62487318767\",\"language\":\"english\"},{\"@odata.type\":\"#Microsoft.Azure.Search.StemmerOverrideTokenFilter\",\"name\":\"azsmnet491828d638b\",\"rules\":[\"ran => run\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StemmerTokenFilter\",\"name\":\"azsmnet361901ec162\",\"language\":\"french\"},{\"@odata.type\":\"#Microsoft.Azure.Search.StopwordsTokenFilter\",\"name\":\"azsmnet2862096a288\",\"stopwords\":[\"a\",\"the\"],\"stopwordsList\":null,\"ignoreCase\":true,\"removeTrailing\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.StopwordsTokenFilter\",\"name\":\"azsmnet53981c3dfd8\",\"stopwords\":[],\"stopwordsList\":\"italian\",\"ignoreCase\":true,\"removeTrailing\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.SynonymTokenFilter\",\"name\":\"azsmnet578867ad542\",\"synonyms\":[\"great, good\"],\"ignoreCase\":true,\"expand\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.TruncateTokenFilter\",\"name\":\"azsmnet1715223af27\",\"length\":10},{\"@odata.type\":\"#Microsoft.Azure.Search.UniqueTokenFilter\",\"name\":\"azsmnet44066b1dc32\",\"onlyOnSamePosition\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.UniqueTokenFilter\",\"name\":\"azsmnet64616673281\",\"onlyOnSamePosition\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.WordDelimiterTokenFilter\",\"name\":\"azsmnet80254254f2a\",\"generateWordParts\":false,\"generateNumberParts\":false,\"catenateWords\":true,\"catenateNumbers\":true,\"catenateAll\":true,\"splitOnCaseChange\":false,\"preserveOriginal\":true,\"splitOnNumerics\":false,\"stemEnglishPossessive\":false,\"protectedWords\":[\"protected\"]}],\"charFilters\":[{\"@odata.type\":\"#Microsoft.Azure.Search.MappingCharFilter\",\"name\":\"my_charfilter\",\"mappings\":[\"a => b\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.MappingCharFilter\",\"name\":\"azsmnet59220c33507\",\"mappings\":[\"s => $\",\"S => $\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternReplaceCharFilter\",\"name\":\"azsmnet31502707a82\",\"pattern\":\"abc\",\"replacement\":\"123\"}],\"encryptionKey\":null,\"similarity\":{\"@odata.type\":\"#Microsoft.Azure.Search.BM25Similarity\",\"k1\":null,\"b\":null}}", + "Body" : "{\"@odata.context\":\"https://alzimmer-test.search.windows.net/$metadata#indexes/$entity\",\"@odata.etag\":\"\\\"0x8D94633A56612B5\\\"\",\"name\":\"hotelscancreateallanalysiscomponents60e349463ae36c8751\",\"defaultScoringProfile\":\"MyProfile\",\"fields\":[{\"name\":\"HotelId\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":true,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"HotelName\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Description\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"en.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"DescriptionFr\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"fr.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Description_Custom\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":\"stop\",\"searchAnalyzer\":\"stop\",\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Category\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Tags\",\"type\":\"Collection(Edm.String)\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"ParkingIncluded\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SmokingAllowed\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"LastRenovationDate\",\"type\":\"Edm.DateTimeOffset\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Rating\",\"type\":\"Edm.Int32\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Address\",\"type\":\"Edm.ComplexType\",\"fields\":[{\"name\":\"StreetAddress\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"City\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"StateProvince\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Country\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"PostalCode\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}]},{\"name\":\"Location\",\"type\":\"Edm.GeographyPoint\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":false,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Rooms\",\"type\":\"Collection(Edm.ComplexType)\",\"fields\":[{\"name\":\"Description\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"en.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"DescriptionFr\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":\"fr.lucene\",\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Type\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"BaseRate\",\"type\":\"Edm.Double\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"BedOptions\",\"type\":\"Edm.String\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SleepsCount\",\"type\":\"Edm.Int32\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"SmokingAllowed\",\"type\":\"Edm.Boolean\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"Tags\",\"type\":\"Collection(Edm.String)\",\"searchable\":true,\"filterable\":true,\"retrievable\":true,\"sortable\":false,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}]},{\"name\":\"TotalGuests\",\"type\":\"Edm.Int64\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]},{\"name\":\"ProfitMargin\",\"type\":\"Edm.Double\",\"searchable\":false,\"filterable\":true,\"retrievable\":true,\"sortable\":true,\"facetable\":true,\"key\":false,\"indexAnalyzer\":null,\"searchAnalyzer\":null,\"analyzer\":null,\"normalizer\":null,\"synonymMaps\":[]}],\"scoringProfiles\":[{\"name\":\"MyProfile\",\"functionAggregation\":\"average\",\"text\":{\"weights\":{\"Description\":1.5,\"Category\":2.0}},\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"constant\",\"type\":\"magnitude\",\"boost\":2.0,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":1.0,\"boostingRangeEnd\":4.0,\"constantBoostBeyondRange\":true},\"distance\":null,\"tag\":null},{\"fieldName\":\"Location\",\"interpolation\":\"linear\",\"type\":\"distance\",\"boost\":1.5,\"freshness\":null,\"magnitude\":null,\"distance\":{\"referencePointParameter\":\"Loc\",\"boostingDistance\":5.0},\"tag\":null},{\"fieldName\":\"LastRenovationDate\",\"interpolation\":\"logarithmic\",\"type\":\"freshness\",\"boost\":1.1,\"freshness\":{\"boostingDuration\":\"P365D\"},\"magnitude\":null,\"distance\":null,\"tag\":null}]},{\"name\":\"ProfileTwo\",\"functionAggregation\":\"maximum\",\"text\":null,\"functions\":[{\"fieldName\":\"Tags\",\"interpolation\":\"linear\",\"type\":\"tag\",\"boost\":1.5,\"freshness\":null,\"magnitude\":null,\"distance\":null,\"tag\":{\"tagsParameter\":\"MyTags\"}}]},{\"name\":\"ProfileThree\",\"functionAggregation\":\"minimum\",\"text\":null,\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"quadratic\",\"type\":\"magnitude\",\"boost\":3.0,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":0.0,\"boostingRangeEnd\":10.0,\"constantBoostBeyondRange\":false},\"distance\":null,\"tag\":null}]},{\"name\":\"ProfileFour\",\"functionAggregation\":\"firstMatching\",\"text\":null,\"functions\":[{\"fieldName\":\"Rating\",\"interpolation\":\"constant\",\"type\":\"magnitude\",\"boost\":3.25,\"freshness\":null,\"magnitude\":{\"boostingRangeStart\":1.0,\"boostingRangeEnd\":5.0,\"constantBoostBeyondRange\":false},\"distance\":null,\"tag\":null}]}],\"corsOptions\":{\"allowedOrigins\":[\"http://tempuri.org\",\"http://localhost:80\"],\"maxAgeInSeconds\":60},\"suggesters\":[{\"name\":\"FancySuggester\",\"searchMode\":\"analyzingInfixMatching\",\"sourceFields\":[\"HotelName\"]}],\"analyzers\":[{\"@odata.type\":\"#Microsoft.Azure.Search.CustomAnalyzer\",\"name\":\"azsmnet05645b1bd4a\",\"tokenizer\":\"my_tokenizer\",\"tokenFilters\":[\"my_tokenfilter\"],\"charFilters\":[\"my_charfilter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.CustomAnalyzer\",\"name\":\"azsmnet05355e2ebd5\",\"tokenizer\":\"edgeNGram\",\"tokenFilters\":[],\"charFilters\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternAnalyzer\",\"name\":\"azsmnet80863aef9cf\",\"lowercase\":false,\"pattern\":\"abc\",\"flags\":\"DOTALL\",\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StandardAnalyzer\",\"name\":\"azsmnet93032858785\",\"maxTokenLength\":100,\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StopAnalyzer\",\"name\":\"azsmnet265432f539f\",\"stopwords\":[\"the\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StopAnalyzer\",\"name\":\"azsmnet38045f85b44\",\"stopwords\":[]}],\"normalizers\":[],\"tokenizers\":[{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenizer\",\"name\":\"my_tokenizer\",\"minGram\":1,\"maxGram\":2,\"tokenChars\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenizer\",\"name\":\"azsmnet366843a491a\",\"minGram\":2,\"maxGram\":4,\"tokenChars\":[\"letter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.NGramTokenizer\",\"name\":\"azsmnet445336c6a42\",\"minGram\":2,\"maxGram\":4,\"tokenChars\":[\"letter\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.ClassicTokenizer\",\"name\":\"azsmnet430374ecf54\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordTokenizerV2\",\"name\":\"azsmnet45737ae4c0e\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.MicrosoftLanguageStemmingTokenizer\",\"name\":\"azsmnet18695841da2\",\"maxTokenLength\":100,\"isSearchTokenizer\":true,\"language\":\"croatian\"},{\"@odata.type\":\"#Microsoft.Azure.Search.MicrosoftLanguageTokenizer\",\"name\":\"azsmnet3966376ea78\",\"maxTokenLength\":100,\"isSearchTokenizer\":true,\"language\":\"thai\"},{\"@odata.type\":\"#Microsoft.Azure.Search.PathHierarchyTokenizerV2\",\"name\":\"azsmnet338159ad337\",\"delimiter\":\":\",\"replacement\":\"_\",\"maxTokenLength\":300,\"reverse\":true,\"skip\":2},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternTokenizer\",\"name\":\"azsmnet063115a8fa4\",\"pattern\":\".*\",\"flags\":\"MULTILINE\",\"group\":0},{\"@odata.type\":\"#Microsoft.Azure.Search.StandardTokenizerV2\",\"name\":\"azsmnet28648d1ff38\",\"maxTokenLength\":100},{\"@odata.type\":\"#Microsoft.Azure.Search.UaxUrlEmailTokenizer\",\"name\":\"azsmnet24207efff61\",\"maxTokenLength\":100}],\"tokenFilters\":[{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"my_tokenfilter\",\"ignoreScripts\":[],\"outputUnigrams\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"azsmnet91120ce57df\",\"ignoreScripts\":[\"han\"],\"outputUnigrams\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.CjkBigramTokenFilter\",\"name\":\"azsmnet44479216943\",\"ignoreScripts\":[],\"outputUnigrams\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.AsciiFoldingTokenFilter\",\"name\":\"azsmnet3515975dfc3\",\"preserveOriginal\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.AsciiFoldingTokenFilter\",\"name\":\"azsmnet81377ec6617\",\"preserveOriginal\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.CommonGramTokenFilter\",\"name\":\"azsmnet20391a96cb3\",\"commonWords\":[\"hello\",\"goodbye\"],\"ignoreCase\":true,\"queryMode\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.CommonGramTokenFilter\",\"name\":\"azsmnet92280a9aebb\",\"commonWords\":[\"at\"],\"ignoreCase\":false,\"queryMode\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.DictionaryDecompounderTokenFilter\",\"name\":\"azsmnet19475bc6b2e\",\"wordList\":[\"Schadenfreude\"],\"minWordSize\":10,\"minSubwordSize\":5,\"maxSubwordSize\":13,\"onlyLongestMatch\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2\",\"name\":\"azsmnet12467a6a243\",\"minGram\":2,\"maxGram\":10,\"side\":\"back\"},{\"@odata.type\":\"#Microsoft.Azure.Search.ElisionTokenFilter\",\"name\":\"azsmnet05717793892\",\"articles\":[\"a\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.ElisionTokenFilter\",\"name\":\"azsmnet7113459606c\",\"articles\":[]},{\"@odata.type\":\"#Microsoft.Azure.Search.KeepTokenFilter\",\"name\":\"azsmnet0274352ad9f\",\"keepWords\":[\"aloha\"],\"keepWordsCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeepTokenFilter\",\"name\":\"azsmnet012873f6a74\",\"keepWords\":[\"e\",\"komo\",\"mai\"],\"keepWordsCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordMarkerTokenFilter\",\"name\":\"azsmnet66896680dc2\",\"keywords\":[\"key\",\"words\"],\"ignoreCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.KeywordMarkerTokenFilter\",\"name\":\"azsmnet27693e8ae80\",\"keywords\":[\"essential\"],\"ignoreCase\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.LengthTokenFilter\",\"name\":\"azsmnet03652742914\",\"min\":5,\"max\":10},{\"@odata.type\":\"#Microsoft.Azure.Search.LimitTokenFilter\",\"name\":\"azsmnet9395391834b\",\"maxTokenCount\":10,\"consumeAllTokens\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.NGramTokenFilterV2\",\"name\":\"azsmnet730073baf23\",\"minGram\":2,\"maxGram\":3},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternCaptureTokenFilter\",\"name\":\"azsmnet1211023410b\",\"patterns\":[\".*\"],\"preserveOriginal\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternReplaceTokenFilter\",\"name\":\"azsmnet08306fdb9b4\",\"pattern\":\"abc\",\"replacement\":\"132\"},{\"@odata.type\":\"#Microsoft.Azure.Search.PhoneticTokenFilter\",\"name\":\"azsmnet68615d781fe\",\"encoder\":\"soundex\",\"replace\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.ShingleTokenFilter\",\"name\":\"azsmnet04760245f50\",\"maxShingleSize\":10,\"minShingleSize\":5,\"outputUnigrams\":false,\"outputUnigramsIfNoShingles\":true,\"tokenSeparator\":\" \",\"filterToken\":\"|\"},{\"@odata.type\":\"#Microsoft.Azure.Search.SnowballTokenFilter\",\"name\":\"azsmnet62487318767\",\"language\":\"english\"},{\"@odata.type\":\"#Microsoft.Azure.Search.StemmerOverrideTokenFilter\",\"name\":\"azsmnet491828d638b\",\"rules\":[\"ran => run\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.StemmerTokenFilter\",\"name\":\"azsmnet361901ec162\",\"language\":\"french\"},{\"@odata.type\":\"#Microsoft.Azure.Search.StopwordsTokenFilter\",\"name\":\"azsmnet2862096a288\",\"stopwords\":[\"a\",\"the\"],\"stopwordsList\":null,\"ignoreCase\":true,\"removeTrailing\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.StopwordsTokenFilter\",\"name\":\"azsmnet53981c3dfd8\",\"stopwords\":[],\"stopwordsList\":\"italian\",\"ignoreCase\":true,\"removeTrailing\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.SynonymTokenFilter\",\"name\":\"azsmnet578867ad542\",\"synonyms\":[\"great, good\"],\"ignoreCase\":true,\"expand\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.TruncateTokenFilter\",\"name\":\"azsmnet1715223af27\",\"length\":10},{\"@odata.type\":\"#Microsoft.Azure.Search.UniqueTokenFilter\",\"name\":\"azsmnet44066b1dc32\",\"onlyOnSamePosition\":true},{\"@odata.type\":\"#Microsoft.Azure.Search.UniqueTokenFilter\",\"name\":\"azsmnet64616673281\",\"onlyOnSamePosition\":false},{\"@odata.type\":\"#Microsoft.Azure.Search.WordDelimiterTokenFilter\",\"name\":\"azsmnet80254254f2a\",\"generateWordParts\":false,\"generateNumberParts\":false,\"catenateWords\":true,\"catenateNumbers\":true,\"catenateAll\":true,\"splitOnCaseChange\":false,\"preserveOriginal\":true,\"splitOnNumerics\":false,\"stemEnglishPossessive\":false,\"protectedWords\":[\"protected\"]}],\"charFilters\":[{\"@odata.type\":\"#Microsoft.Azure.Search.MappingCharFilter\",\"name\":\"my_charfilter\",\"mappings\":[\"a => b\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.MappingCharFilter\",\"name\":\"azsmnet59220c33507\",\"mappings\":[\"s => $\",\"S => $\"]},{\"@odata.type\":\"#Microsoft.Azure.Search.PatternReplaceCharFilter\",\"name\":\"azsmnet31502707a82\",\"pattern\":\"abc\",\"replacement\":\"132\"}],\"encryptionKey\":null,\"similarity\":{\"@odata.type\":\"#Microsoft.Azure.Search.BM25Similarity\",\"k1\":null,\"b\":null}}", "x-ms-client-request-id" : "e47aa0a8-691d-4d61-b672-2ce41d16ee86", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=minimal", @@ -228,4 +228,4 @@ "Exception" : null } ], "variables" : [ "hotelscancreateallanalysiscomponents60e349463ae36c8751", "azsmnet05645b1bd4a", "azsmnet05355e2ebd5", "azsmnet80863aef9cf", "azsmnet93032858785", "azsmnet265432f539f", "azsmnet38045f85b44", "azsmnet366843a491a", "azsmnet445336c6a42", "azsmnet430374ecf54", "azsmnet45737ae4c0e", "azsmnet18695841da2", "azsmnet3966376ea78", "azsmnet338159ad337", "azsmnet063115a8fa4", "azsmnet28648d1ff38", "azsmnet24207efff61", "azsmnet91120ce57df", "azsmnet44479216943", "azsmnet3515975dfc3", "azsmnet81377ec6617", "azsmnet20391a96cb3", "azsmnet92280a9aebb", "azsmnet19475bc6b2e", "azsmnet12467a6a243", "azsmnet05717793892", "azsmnet7113459606c", "azsmnet0274352ad9f", "azsmnet012873f6a74", "azsmnet66896680dc2", "azsmnet27693e8ae80", "azsmnet03652742914", "azsmnet9395391834b", "azsmnet730073baf23", "azsmnet1211023410b", "azsmnet08306fdb9b4", "azsmnet68615d781fe", "azsmnet04760245f50", "azsmnet62487318767", "azsmnet491828d638b", "azsmnet361901ec162", "azsmnet2862096a288", "azsmnet53981c3dfd8", "azsmnet578867ad542", "azsmnet1715223af27", "azsmnet44066b1dc32", "azsmnet64616673281", "azsmnet80254254f2a", "azsmnet59220c33507", "azsmnet31502707a82", "hotelscancreateallanalysiscomponents60e11387066ad4ecdd", "hotelscancreateallanalysiscomponents60e669612dbc759a2a", "hotelscancreateallanalysiscomponents60e1726466389316d2", "hotelscancreateallanalysiscomponents60e82579578a97bbe3", "hotelscancreateallanalysiscomponents60e20687d142850005", "hotelscancreateallanalysiscomponents60e01873da9901d956", "hotelscancreateallanalysiscomponents60e9563090f2ba235e" ] -} \ No newline at end of file +} diff --git a/sdk/search/azure-search-documents/src/test/resources/session-records/IndexingSyncTests.canIndexWithPascalCaseFields.json b/sdk/search/azure-search-documents/src/test/resources/session-records/IndexingSyncTests.canIndexWithPascalCaseFields.json index 99be665aafc1..dd875e26f080 100644 --- a/sdk/search/azure-search-documents/src/test/resources/session-records/IndexingSyncTests.canIndexWithPascalCaseFields.json +++ b/sdk/search/azure-search-documents/src/test/resources/session-records/IndexingSyncTests.canIndexWithPascalCaseFields.json @@ -49,7 +49,7 @@ "elapsed-time" : "90", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"key\":\"123\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", + "Body" : "{\"value\":[{\"key\":\"132\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", "x-ms-client-request-id" : "453b8a6e-5960-4a71-aef8-0b247130116e", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -104,4 +104,4 @@ "Exception" : null } ], "variables" : [ "bookscanindexwithpascalcasefields49361203a9a1a1714bb" ] -} \ No newline at end of file +} diff --git a/sdk/search/azure-search-documents/src/test/resources/session-records/LookupSyncTests.canGetStaticallyTypedDocumentWithPascalCaseFields.json b/sdk/search/azure-search-documents/src/test/resources/session-records/LookupSyncTests.canGetStaticallyTypedDocumentWithPascalCaseFields.json index dbed78c31227..93f2ce60f08b 100644 --- a/sdk/search/azure-search-documents/src/test/resources/session-records/LookupSyncTests.canGetStaticallyTypedDocumentWithPascalCaseFields.json +++ b/sdk/search/azure-search-documents/src/test/resources/session-records/LookupSyncTests.canGetStaticallyTypedDocumentWithPascalCaseFields.json @@ -49,7 +49,7 @@ "elapsed-time" : "91", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"key\":\"123\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", + "Body" : "{\"value\":[{\"key\":\"132\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", "x-ms-client-request-id" : "87b96fe5-0107-4a5e-8271-0eb35290d5c1", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -57,7 +57,7 @@ "Exception" : null }, { "Method" : "GET", - "Uri" : "https://REDACTED.search.windows.net/indexes('hotelscangetstaticallytypeddocumentwithpascalcasefields53937503')/docs('123')?api-version=2021-04-30-Preview", + "Uri" : "https://REDACTED.search.windows.net/indexes('hotelscangetstaticallytypeddocumentwithpascalcasefields53937503')/docs('132')?api-version=2021-04-30-Preview", "Headers" : { "User-Agent" : "azsdk-java-azure-search-documents/11.5.0-beta.1 (11.0.6; Windows 10; 10.0)", "x-ms-client-request-id" : "b6b98add-4df6-4aa0-a91b-ca8165579692" @@ -75,7 +75,7 @@ "elapsed-time" : "73", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"HotelId\":\"123\",\"HotelName\":\"Lord of the Rings\",\"Description\":\"J.R.R\",\"Description_fr\":\"Tolkien\",\"Category\":null,\"Tags\":[],\"ParkingIncluded\":null,\"SmokingAllowed\":null,\"LastRenovationDate\":null,\"Rating\":null,\"Location\":null,\"Address\":null,\"Rooms\":[]}", + "Body" : "{\"HotelId\":\"132\",\"HotelName\":\"Lord of the Rings\",\"Description\":\"J.R.R\",\"Description_fr\":\"Tolkien\",\"Category\":null,\"Tags\":[],\"ParkingIncluded\":null,\"SmokingAllowed\":null,\"LastRenovationDate\":null,\"Rating\":null,\"Location\":null,\"Address\":null,\"Rooms\":[]}", "x-ms-client-request-id" : "b6b98add-4df6-4aa0-a91b-ca8165579692", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -104,4 +104,4 @@ "Exception" : null } ], "variables" : [ "hotelscangetstaticallytypeddocumentwithpascalcasefields53937503" ] -} \ No newline at end of file +} diff --git a/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canFilterNonNullableType.json b/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canFilterNonNullableType.json index 436b9f8296b9..9c215ac39783 100644 --- a/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canFilterNonNullableType.json +++ b/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canFilterNonNullableType.json @@ -49,7 +49,7 @@ "elapsed-time" : "98", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"key\":\"123\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"456\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"789\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", + "Body" : "{\"value\":[{\"key\":\"132\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"456\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"789\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", "x-ms-client-request-id" : "8e32f2dc-f607-4298-b7db-a1b68b642ad4", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -76,7 +76,7 @@ "elapsed-time" : "77", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"@search.score\":1.0,\"Key\":\"123\",\"IntValue\":0,\"Bucket\":{\"BucketName\":\"A\",\"Count\":3}},{\"@search.score\":1.0,\"Key\":\"456\",\"IntValue\":7,\"Bucket\":{\"BucketName\":\"B\",\"Count\":5}}]}", + "Body" : "{\"value\":[{\"@search.score\":1.0,\"Key\":\"132\",\"IntValue\":0,\"Bucket\":{\"BucketName\":\"A\",\"Count\":3}},{\"@search.score\":1.0,\"Key\":\"456\",\"IntValue\":7,\"Bucket\":{\"BucketName\":\"B\",\"Count\":5}}]}", "x-ms-client-request-id" : "106cb4f5-810e-4a6e-b357-c23f91772b1a", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -105,4 +105,4 @@ "Exception" : null } ], "variables" : [ "testindexcanfilternonnullabletype30e783376dc0a79cad8" ] -} \ No newline at end of file +} diff --git a/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canRoundTripNonNullableValueTypes.json b/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canRoundTripNonNullableValueTypes.json index 7599037ce96d..27509064c81d 100644 --- a/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canRoundTripNonNullableValueTypes.json +++ b/sdk/search/azure-search-documents/src/test/resources/session-records/SearchSyncTests.canRoundTripNonNullableValueTypes.json @@ -49,7 +49,7 @@ "elapsed-time" : "108", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"key\":\"123\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"456\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", + "Body" : "{\"value\":[{\"key\":\"132\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"456\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}", "x-ms-client-request-id" : "0a2e2392-d3b3-4d90-acba-462970a20f2c", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -76,7 +76,7 @@ "elapsed-time" : "89", "OData-Version" : "4.0", "Expires" : "-1", - "Body" : "{\"value\":[{\"@search.score\":1.0,\"Key\":\"123\",\"Rating\":5,\"Count\":3,\"IsEnabled\":true,\"Ratio\":3.25,\"StartDate\":\"2010-05-31T23:00:00Z\",\"EndDate\":\"2010-05-31T23:00:00Z\",\"TopLevelBucket\":{\"BucketName\":\"A\",\"Count\":12},\"Buckets\":[{\"BucketName\":\"B\",\"Count\":20},{\"BucketName\":\"C\",\"Count\":7}]},{\"@search.score\":1.0,\"Key\":\"456\",\"Rating\":0,\"Count\":0,\"IsEnabled\":false,\"Ratio\":0.0,\"StartDate\":null,\"EndDate\":null,\"TopLevelBucket\":null,\"Buckets\":[]}]}", + "Body" : "{\"value\":[{\"@search.score\":1.0,\"Key\":\"132\",\"Rating\":5,\"Count\":3,\"IsEnabled\":true,\"Ratio\":3.25,\"StartDate\":\"2010-05-31T23:00:00Z\",\"EndDate\":\"2010-05-31T23:00:00Z\",\"TopLevelBucket\":{\"BucketName\":\"A\",\"Count\":12},\"Buckets\":[{\"BucketName\":\"B\",\"Count\":20},{\"BucketName\":\"C\",\"Count\":7}]},{\"@search.score\":1.0,\"Key\":\"456\",\"Rating\":0,\"Count\":0,\"IsEnabled\":false,\"Ratio\":0.0,\"StartDate\":null,\"EndDate\":null,\"TopLevelBucket\":null,\"Buckets\":[]}]}", "x-ms-client-request-id" : "ece8a1a3-5123-4e36-b6b5-f87635289767", "Preference-Applied" : "odata.include-annotations=\"*\"", "Content-Type" : "application/json; odata.metadata=none" @@ -105,4 +105,4 @@ "Exception" : null } ], "variables" : [ "non-nullable-indexcanroundtripnonnullablevaluetypesed4379573c" ] -} \ No newline at end of file +} diff --git a/sdk/security/azure-resourcemanager-security/SAMPLE.md b/sdk/security/azure-resourcemanager-security/SAMPLE.md index 090878aeb8e6..77eb0eef3a20 100644 --- a/sdk/security/azure-resourcemanager-security/SAMPLE.md +++ b/sdk/security/azure-resourcemanager-security/SAMPLE.md @@ -2270,32 +2270,7 @@ public final class ConnectorsCreateOrUpdateSamples { .withPrivateKeyId("6efg587hra2568as34d22326b044cc20dc2af") .withPrivateKey( "-----BEGIN PRIVATE KEY-----\n" - + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpxYHcLzcDZ6/Q\n" - + "AeQZnQXM5GTb3p09Xsbjo2T2F61b6I7FZiQXBrbw3Zf0CUCkkqTTpD5xifl82yQ6\n" - + "89V7SAe8hxI7esAcVDhm/aJMqzVjHLISAU2L3li1sn0jjY2oYtndwN6bRivP8O6t\n" - + "9F+W6E0zMlbCxtpZEHLbb6WxlJJrwEQ0MPH2yOCwZUQi6NHksAtEzX2nNKJNyUC7\n" - + "QyBVHHMm34H2bmZwsuQp3y2otpcJ9tJnVmYfC3k/w4x2L+DIK7JnQP/C1wQqu2du\n" - + "c0w6sydF6RhLoHButrVdYRJTdfK4k03SsSTyMqZ+f7LNnKw3xenzw1VmEpk8mvoQ\n" - + "t08tCBOrAgMBAAECggEAByzz6iyMtLYjNjV+QJ7kad6VbL2iA8AHxANZ9xTVHPdd\n" - + "YXaJu/dqsA+NpqDlfI8+LDva782XH/HbPCqmMUnAGfXTjXQIvqnIoIHD5F2wKfpC\n" - + "hIRNlMXXFgbvRxtqi11yO+80+XcjzuwuCmgzyhsTeEB+bkkdXXpWgHPdmv3emnM6\n" - + "MQM9Zgrug0UndPmiUwKOcJSU4PlmlTpHEV4vA6JfA4bvphy9m1jxO5qWeah5yym2\n" - + "6FP5BRIDF98kFrDnSXJjajwgLCQ+MypFQXyax6XkxDxuKXbng1bv7eZDjqazIChk\n" - + "m0y14X0s0jnWc+AX8vfeSf7d+EsGdVinEwR1aAawEQKBgQDqDB0qxcIQ1oI1Kww8\n" - + "9vXefTiuWsf47F+fJ/DIOEbiRfE8IdCgmOABvcqJIoxW/DFMBEdLCcx73Km7pOmd\n" - + "Kg1ddScnaO8cOj2v/Ub+fAqVrA4ki4ViYP0A7/Nogga3Jr/x3ey5bitrIfFImteS\n" - + "CgBHBzZvoQpvO4lB2tKVgo2P9wKBgQC5sgTEq4sasRGSAY6lIoJno0I8w28a/16D\n" - + "es60XQeY1ger8uTGwlT02v/u/arDUmRLPClpujXq6gK29KvtRCHy7JkpGbqW2bZs\n" - + "PFKKWR7Tk3XPKYyjv94AIi5/xoFeDhS4lpAvy3Z5tQhYS6wqWKvT6yZQ3kM+Hfxs\n" - + "pHgvu3mU7QKBgQC9/E1k3hj1cBtMK4CIsHPPQljTd4+iacYJPPPAo6YuoVX8WPqw\n" - + "ksgrwbN59Fh1d8xQh5yTtgWOegYx8uFMGcm1lpbM7+pBQKm4hWGuzGQPMRZd5f/F\n" - + "ZzOZIi61I+9tlv/yxxIVR+/ozCm/pSneO04UWi9/F/uPZYW6tnWAtfRR6wKBgGsZ\n" - + "8MQaCK4JaI/klAhMghgSQnbXZXKVzUZaA3Rln6cX8u7KtgapOOTMlwaZie8Dy1LV\n" - + "TTFstAJcm9o3/h1nyYjZy3C4JTUyNpPwqs6enjf7edxVI4eidwFutZD+xcigqHTa\n" - + "aikW2atSrZB3fMIjyF7+5meH+hKOqvNiXOty3qn1AoGAZuVxYQy5FVq3YZxzr3Aa\n" - + "Am0ShoXTF6QYIbsaUiUGoa/NlHcw9V/lj4AqBRbxbaYMD+hz2J/od9cb268eJKY8\n" - + "3b6MvaUqdNhNnWodJXLhgtmGEHDKmTppz2JSTx/tVzCfhFdcOC79StZvcKLhtoFQ\n" - + "+/3lEw6NCIXzm5E4+dtJG4k=\n" + + "FAKE_PRIVATE_KEY_PLACEHOLDER" + "-----END PRIVATE KEY-----\n") .withClientEmail("asc-135@asc-project-1234.iam.gserviceaccount.com") .withClientId("105889053725632919854") diff --git a/sdk/security/azure-resourcemanager-security/src/samples/java/com/azure/resourcemanager/security/generated/ConnectorsCreateOrUpdateSamples.java b/sdk/security/azure-resourcemanager-security/src/samples/java/com/azure/resourcemanager/security/generated/ConnectorsCreateOrUpdateSamples.java index 88665074156c..900a2e3f5020 100644 --- a/sdk/security/azure-resourcemanager-security/src/samples/java/com/azure/resourcemanager/security/generated/ConnectorsCreateOrUpdateSamples.java +++ b/sdk/security/azure-resourcemanager-security/src/samples/java/com/azure/resourcemanager/security/generated/ConnectorsCreateOrUpdateSamples.java @@ -36,32 +36,7 @@ public static void gcpCredentialsCreateACloudAccountConnectorForASubscription( .withPrivateKeyId("6efg587hra2568as34d22326b044cc20dc2af") .withPrivateKey( "-----BEGIN PRIVATE KEY-----\n" - + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpxYHcLzcDZ6/Q\n" - + "AeQZnQXM5GTb3p09Xsbjo2T2F61b6I7FZiQXBrbw3Zf0CUCkkqTTpD5xifl82yQ6\n" - + "89V7SAe8hxI7esAcVDhm/aJMqzVjHLISAU2L3li1sn0jjY2oYtndwN6bRivP8O6t\n" - + "9F+W6E0zMlbCxtpZEHLbb6WxlJJrwEQ0MPH2yOCwZUQi6NHksAtEzX2nNKJNyUC7\n" - + "QyBVHHMm34H2bmZwsuQp3y2otpcJ9tJnVmYfC3k/w4x2L+DIK7JnQP/C1wQqu2du\n" - + "c0w6sydF6RhLoHButrVdYRJTdfK4k03SsSTyMqZ+f7LNnKw3xenzw1VmEpk8mvoQ\n" - + "t08tCBOrAgMBAAECggEAByzz6iyMtLYjNjV+QJ7kad6VbL2iA8AHxANZ9xTVHPdd\n" - + "YXaJu/dqsA+NpqDlfI8+LDva782XH/HbPCqmMUnAGfXTjXQIvqnIoIHD5F2wKfpC\n" - + "hIRNlMXXFgbvRxtqi11yO+80+XcjzuwuCmgzyhsTeEB+bkkdXXpWgHPdmv3emnM6\n" - + "MQM9Zgrug0UndPmiUwKOcJSU4PlmlTpHEV4vA6JfA4bvphy9m1jxO5qWeah5yym2\n" - + "6FP5BRIDF98kFrDnSXJjajwgLCQ+MypFQXyax6XkxDxuKXbng1bv7eZDjqazIChk\n" - + "m0y14X0s0jnWc+AX8vfeSf7d+EsGdVinEwR1aAawEQKBgQDqDB0qxcIQ1oI1Kww8\n" - + "9vXefTiuWsf47F+fJ/DIOEbiRfE8IdCgmOABvcqJIoxW/DFMBEdLCcx73Km7pOmd\n" - + "Kg1ddScnaO8cOj2v/Ub+fAqVrA4ki4ViYP0A7/Nogga3Jr/x3ey5bitrIfFImteS\n" - + "CgBHBzZvoQpvO4lB2tKVgo2P9wKBgQC5sgTEq4sasRGSAY6lIoJno0I8w28a/16D\n" - + "es60XQeY1ger8uTGwlT02v/u/arDUmRLPClpujXq6gK29KvtRCHy7JkpGbqW2bZs\n" - + "PFKKWR7Tk3XPKYyjv94AIi5/xoFeDhS4lpAvy3Z5tQhYS6wqWKvT6yZQ3kM+Hfxs\n" - + "pHgvu3mU7QKBgQC9/E1k3hj1cBtMK4CIsHPPQljTd4+iacYJPPPAo6YuoVX8WPqw\n" - + "ksgrwbN59Fh1d8xQh5yTtgWOegYx8uFMGcm1lpbM7+pBQKm4hWGuzGQPMRZd5f/F\n" - + "ZzOZIi61I+9tlv/yxxIVR+/ozCm/pSneO04UWi9/F/uPZYW6tnWAtfRR6wKBgGsZ\n" - + "8MQaCK4JaI/klAhMghgSQnbXZXKVzUZaA3Rln6cX8u7KtgapOOTMlwaZie8Dy1LV\n" - + "TTFstAJcm9o3/h1nyYjZy3C4JTUyNpPwqs6enjf7edxVI4eidwFutZD+xcigqHTa\n" - + "aikW2atSrZB3fMIjyF7+5meH+hKOqvNiXOty3qn1AoGAZuVxYQy5FVq3YZxzr3Aa\n" - + "Am0ShoXTF6QYIbsaUiUGoa/NlHcw9V/lj4AqBRbxbaYMD+hz2J/od9cb268eJKY8\n" - + "3b6MvaUqdNhNnWodJXLhgtmGEHDKmTppz2JSTx/tVzCfhFdcOC79StZvcKLhtoFQ\n" - + "+/3lEw6NCIXzm5E4+dtJG4k=\n" + + "FAKE_PRIVATE_KEY_PLACEHOLDER" + "-----END PRIVATE KEY-----\n") .withClientEmail("asc-135@asc-project-1234.iam.gserviceaccount.com") .withClientId("105889053725632919854") diff --git a/sdk/securityinsights/azure-resourcemanager-securityinsights/SAMPLE.md b/sdk/securityinsights/azure-resourcemanager-securityinsights/SAMPLE.md index dec6f55e9756..de287165b2a0 100644 --- a/sdk/securityinsights/azure-resourcemanager-securityinsights/SAMPLE.md +++ b/sdk/securityinsights/azure-resourcemanager-securityinsights/SAMPLE.md @@ -1505,7 +1505,7 @@ public final class DataConnectorsConnectSamples { "316ec55e-7138-4d63-ab18-90c8a60fd1c8", new DataConnectorConnectBody() .withKind(ConnectAuthKind.APIKEY) - .withApiKey("123456789") + .withApiKey("fakeKeyPlaceholder") .withDataCollectionEndpoint("https://test.eastus.ingest.monitor.azure.com") .withDataCollectionRuleImmutableId("dcr-34adsj9o7d6f9de204478b9cgb43b631") .withOutputStream("Custom-MyTableRawData") @@ -1540,7 +1540,7 @@ public final class DataConnectorsConnectSamples { "316ec55e-7138-4d63-ab18-90c8a60fd1c8", new DataConnectorConnectBody() .withKind(ConnectAuthKind.APIKEY) - .withApiKey("123456789") + .withApiKey("fakeKeyPlaceholder") .withRequestConfigUserInputValues( Arrays .asList( diff --git a/sdk/securityinsights/azure-resourcemanager-securityinsights/src/samples/java/com/azure/resourcemanager/securityinsights/generated/DataConnectorsConnectSamples.java b/sdk/securityinsights/azure-resourcemanager-securityinsights/src/samples/java/com/azure/resourcemanager/securityinsights/generated/DataConnectorsConnectSamples.java index 3754a2ecfb7a..d00218190776 100644 --- a/sdk/securityinsights/azure-resourcemanager-securityinsights/src/samples/java/com/azure/resourcemanager/securityinsights/generated/DataConnectorsConnectSamples.java +++ b/sdk/securityinsights/azure-resourcemanager-securityinsights/src/samples/java/com/azure/resourcemanager/securityinsights/generated/DataConnectorsConnectSamples.java @@ -32,7 +32,7 @@ public static void connectAnAPIPollingV2LogsDataConnector( "316ec55e-7138-4d63-ab18-90c8a60fd1c8", new DataConnectorConnectBody() .withKind(ConnectAuthKind.APIKEY) - .withApiKey("123456789") + .withApiKey("fakeKeyPlaceholder") .withDataCollectionEndpoint("https://test.eastus.ingest.monitor.azure.com") .withDataCollectionRuleImmutableId("dcr-34adsj9o7d6f9de204478b9cgb43b631") .withOutputStream("Custom-MyTableRawData") @@ -67,7 +67,7 @@ public static void connectAnAPIPollingDataConnector( "316ec55e-7138-4d63-ab18-90c8a60fd1c8", new DataConnectorConnectBody() .withKind(ConnectAuthKind.APIKEY) - .withApiKey("123456789") + .withApiKey("fakeKeyPlaceholder") .withRequestConfigUserInputValues( Arrays .asList( diff --git a/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md b/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md index c9aa709ecad8..700d129c146e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md @@ -4,11 +4,13 @@ ### Features Added - Added rule manager client to manage rules for ServiceBus subscription with listen claims. ([#27711](https://github.com/Azure/azure-sdk-for-java/issues/27711)) - +- Added ability to create a subscription with default rule. ([#29885](https://github.com/Azure/azure-sdk-for-java/issues/29885)) +- `ServiceBusAdministrationClientBuilder` now supports using `AzureSasCredential`. ([#30255](https://github.com/Azure/azure-sdk-for-java/issues/30255)) ### Breaking Changes ### Bugs Fixed -- Fixed `listQueues`, `listTopics`, `listRules`, `listSubscriptions`, `createQueue` and `createSubscriptionWithResponse` in `ServiceBusAdministrationClient` class. ([#31712](https://github.com/Azure/azure-sdk-for-java/issues/31712)) +- Fixed incorrect proxy configuration using environment variables. ([24230](https://github.com/Azure/azure-sdk-for-java/issues/24230)) + ### Other Changes ## 7.12.1 (2022-10-25) @@ -327,7 +329,7 @@ Fixed the issue that the second call of `ServiceBusReceiverClient.complete` is s ### Breaking Changes - Changed `receiveMessages` API to return `ServiceBusReceivedMessage` instead of ServiceBusReceivedMessageContext in - `ServiceBusReceiverAsynClient` and `ServiceBusReceiverClient`. + `ServiceBusReceiverAsyncClient` and `ServiceBusReceiverClient`. - Removed `SendVia` option from `ServiceBusClientBuilder`. See issue for more detail [16942](https://github.com/Azure/azure-sdk-for-java/pull/16942). - Removed `sessionId` setting from `ServiceBusSessionReceiverClientBuilder` as creating receiver clients bound to a @@ -337,7 +339,7 @@ Fixed the issue that the second call of `ServiceBusReceiverClient.complete` is s `ServiceBusSessionProcessorClientBuilder` as the feature of receiving messages from multiple sessions is moved from the receiver client to the new `ServiceBusSessionProcessorClient`. - Renamed `tryAdd` to `tryAddMessage` in `ServiceBusMessageBatch`. -- Removed `sessionId` specific methods from `ServiceBusReceiverAsynClient` and `ServiceBusReceiverClient` because now +- Removed `sessionId` specific methods from `ServiceBusReceiverAsyncClient` and `ServiceBusReceiverClient` because now receiver client is always tied to one session. ### Bug Fixes diff --git a/sdk/servicebus/azure-messaging-servicebus/README.md b/sdk/servicebus/azure-messaging-servicebus/README.md index 6b6a75e76e6e..218378e01fa6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/README.md +++ b/sdk/servicebus/azure-messaging-servicebus/README.md @@ -423,7 +423,7 @@ The recommended way to solve the specific exception the AMQP exception represent ### Understanding the APIs behavior -The document [here][sync_receivemessages_implcit_prefetch] provides insights into the expected behavior of synchronous `receiveMessages` API when using it to obtain more than one message (a.k.a. implicit prefetching). +The document [here][sync_receivemessages_implicit_prefetch] provides insights into the expected behavior of synchronous `receiveMessages` API when using it to obtain more than one message (a.k.a. implicit prefetching). ## Next steps @@ -475,7 +475,7 @@ Guidelines](https://github.com/Azure/azure-sdk-for-java/blob/main/CONTRIBUTING.m [topic_concept]: https://docs.microsoft.com/azure/service-bus-messaging/service-bus-messaging-overview#topics [wiki_identity]: https://github.com/Azure/azure-sdk-for-java/wiki/Identity-and-Authentication [known-issue-binarydata-notfound]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/servicebus/azure-messaging-servicebus/known-issues.md#can-not-resolve-binarydata-or-noclassdeffounderror-version-700 -[sync_receivemessages_implcit_prefetch]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/servicebus/azure-messaging-servicebus/docs/SyncReceiveAndPrefetch.md +[sync_receivemessages_implicit_prefetch]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/servicebus/azure-messaging-servicebus/docs/SyncReceiveAndPrefetch.md [peek_lock_mode_docs]: https://learn.microsoft.com/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock [receive_and_delete_mode_docs]: https://learn.microsoft.com/azure/service-bus-messaging/message-transfers-locks-settlement#receiveanddelete ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Fservicebus%2Fazure-messaging-servicebus%2FREADME.png) diff --git a/sdk/servicebus/azure-messaging-servicebus/migration-guide.md b/sdk/servicebus/azure-messaging-servicebus/migration-guide.md index 6e0f48fc3748..b3ae92053ae6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/migration-guide.md +++ b/sdk/servicebus/azure-messaging-servicebus/migration-guide.md @@ -304,7 +304,7 @@ try { ``` The new Java SDK provides a dedicated processor client to which you can pass your message and error handlers. -Like the older SDK, this supports auto completion of messages and automatica renewal of message/session locks. +Like the older SDK, this supports auto completion of messages and automatically renewal of message/session locks. For a more fine grained control and advanced features, you still have the `ServiceBusReceiverClient` and it's async counterpart `ServiceBusReceiverAsyncClient`. diff --git a/sdk/servicebus/azure-messaging-servicebus/pom.xml b/sdk/servicebus/azure-messaging-servicebus/pom.xml index 07afd6ea4837..cad9ec0312b9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/pom.xml +++ b/sdk/servicebus/azure-messaging-servicebus/pom.xml @@ -42,6 +42,8 @@ --add-opens com.azure.messaging.servicebus/com.azure.messaging.servicebus.administration=ALL-UNNAMED --add-opens com.azure.messaging.servicebus/com.azure.messaging.servicebus.administration.models=ALL-UNNAMED + --add-exports com.azure.core/com.azure.core.implementation.util=ALL-UNNAMED + --add-opens com.azure.core/com.azure.core.implementation.util=ALL-UNNAMED --add-reads com.azure.messaging.servicebus=com.azure.http.netty @@ -55,7 +57,7 @@ com.azure azure-core-amqp - 2.7.2 + 2.8.0-beta.1 com.azure diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/FluxAutoLockRenew.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/FluxAutoLockRenew.java index e37b21fc4b35..b8c2841a511a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/FluxAutoLockRenew.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/FluxAutoLockRenew.java @@ -41,7 +41,7 @@ final class FluxAutoLockRenew extends FluxOperator source, ReceiverOptions receiverOptions, diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java index 4a7982f55c0c..35ee837a92f7 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java @@ -6,7 +6,6 @@ import com.azure.core.amqp.AmqpClientOptions; import com.azure.core.amqp.AmqpRetryOptions; import com.azure.core.amqp.AmqpTransportType; -import com.azure.core.amqp.ProxyAuthenticationType; import com.azure.core.amqp.ProxyOptions; import com.azure.core.amqp.client.traits.AmqpTrait; import com.azure.core.amqp.implementation.AzureTokenManagerProvider; @@ -53,9 +52,7 @@ import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; -import java.net.InetSocketAddress; import java.net.MalformedURLException; -import java.net.Proxy; import java.net.URL; import java.time.Duration; import java.util.Locale; @@ -745,7 +742,7 @@ private ConnectionOptions getConnectionOptions() { } if (proxyOptions == null) { - proxyOptions = getDefaultProxyConfiguration(configuration); + proxyOptions = ProxyOptions.fromConfiguration(configuration); } final CbsAuthorizationType authorizationType = credentials instanceof ServiceBusSharedKeyCredential @@ -770,48 +767,6 @@ private ConnectionOptions getConnectionOptions() { } } - private ProxyOptions getDefaultProxyConfiguration(Configuration configuration) { - ProxyAuthenticationType authentication = ProxyAuthenticationType.NONE; - if (proxyOptions != null) { - authentication = proxyOptions.getAuthentication(); - } - - String proxyAddress = configuration.get(Configuration.PROPERTY_HTTP_PROXY); - - if (CoreUtils.isNullOrEmpty(proxyAddress)) { - return ProxyOptions.SYSTEM_DEFAULTS; - } - - return getProxyOptions(authentication, proxyAddress, configuration, - Boolean.parseBoolean(configuration.get("java.net.useSystemProxies"))); - } - - private ProxyOptions getProxyOptions(ProxyAuthenticationType authentication, String proxyAddress, - Configuration configuration, boolean useSystemProxies) { - String host; - int port; - if (HOST_PORT_PATTERN.matcher(proxyAddress.trim()).find()) { - final String[] hostPort = proxyAddress.split(":"); - host = hostPort[0]; - port = Integer.parseInt(hostPort[1]); - final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); - final String username = configuration.get(ProxyOptions.PROXY_USERNAME); - final String password = configuration.get(ProxyOptions.PROXY_PASSWORD); - return new ProxyOptions(authentication, proxy, username, password); - } else if (useSystemProxies) { - // java.net.useSystemProxies needs to be set to true in this scenario. - // If it is set to false 'ProxyOptions' in azure-core will return null. - com.azure.core.http.ProxyOptions coreProxyOptions = com.azure.core.http.ProxyOptions - .fromConfiguration(configuration); - return new ProxyOptions(authentication, new Proxy(coreProxyOptions.getType().toProxyType(), - coreProxyOptions.getAddress()), coreProxyOptions.getUsername(), coreProxyOptions.getPassword()); - } else { - LOGGER.verbose("'HTTP_PROXY' was configured but ignored as 'java.net.useSystemProxies' wasn't " - + "set or was false."); - return ProxyOptions.SYSTEM_DEFAULTS; - } - } - private static boolean isNullOrEmpty(String item) { return item == null || item.isEmpty(); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java index 894f16b7bdff..a1a909b7b728 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java @@ -1308,8 +1308,8 @@ public void close() { } try { - // releated with issue https://github.com/Azure/azure-sdk-for-java/issues/25709. When defining ServiceBusProcessorClient as bean in SpringBoot application and throw error in processMessage(), the application can not be shutdown gracefully using ctrl-c. - // The cause is completionLock's acquire stucks. So we add a timeout for acquiring lock here to avoid the stuck. + // Related with issue https://github.com/Azure/azure-sdk-for-java/issues/25709. When defining ServiceBusProcessorClient as bean in SpringBoot application and throw error in processMessage(), the application can not be shutdown gracefully using ctrl-c. + // The cause is completionLock's acquire method is stuck. So we have added a timeout for acquiring the lock, to work around the issue. boolean acquired = completionLock.tryAcquire(5, TimeUnit.SECONDS); if (!acquired) { LOGGER.info("Unable to obtain completion lock."); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java index 163a9da065d6..41df2b9d44fa 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java @@ -749,7 +749,7 @@ public void commitTransaction(ServiceBusTransactionContext transactionContext) { * * @param transactionContext The transaction to be rollback. * - * @throws IllegalStateException if the receiver is alread disposed. + * @throws IllegalStateException if the receiver is already disposed. * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. * @throws ServiceBusException if the transaction could not be rolled back. */ diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClient.java index e9f23c83c079..12639967da40 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClient.java @@ -42,6 +42,7 @@ import com.azure.messaging.servicebus.administration.implementation.models.SubscriptionDescriptionFeed; import com.azure.messaging.servicebus.administration.implementation.models.TopicDescriptionEntry; import com.azure.messaging.servicebus.administration.implementation.models.TopicDescriptionFeed; +import com.azure.messaging.servicebus.administration.implementation.models.RuleDescription; import com.azure.messaging.servicebus.administration.models.CreateQueueOptions; import com.azure.messaging.servicebus.administration.models.CreateRuleOptions; import com.azure.messaging.servicebus.administration.models.CreateSubscriptionOptions; @@ -387,8 +388,9 @@ public Mono createSubscription(String topicName, String @ServiceMethod(returns = ReturnType.SINGLE) public Mono> createSubscriptionWithResponse(String topicName, String subscriptionName, CreateSubscriptionOptions subscriptionOptions) { - return withContext(context -> createSubscriptionWithResponse(topicName, subscriptionName, subscriptionOptions, - context)); + // Create with no default rule. RuleOptions to be set to null. + return withContext(context -> createSubscriptionWithResponse(topicName, subscriptionName, null, + subscriptionOptions, null, context)); } /** @@ -1365,6 +1367,65 @@ public Mono> updateTopicWithResponse(TopicProperties t return withContext(context -> updateTopicWithResponse(topic, context)); } + /** + * Creates a subscription with a default rule using {@link CreateSubscriptionOptions} and {@link CreateRuleOptions}. + * + * @param topicName Name of the topic associated with subscription. + * @param subscriptionName Name of the subscription. + * @param ruleName Name of the default rule the subscription should be created with. + * @param subscriptionOptions A {@link CreateSubscriptionOptions} object describing the subscription to create. + * @param ruleOptions A {@link CreateRuleOptions} object describing the default rule. + * If null, then pass-through filter will be created. + * + * @return A Mono that completes with information about the created subscription. + * @throws ClientAuthenticationException if the client's credentials do not have access to modify the + * namespace. + * @throws HttpResponseException If the request body was invalid, the quota is exceeded, or an error occurred + * processing the request. + * @throws IllegalArgumentException if {@code topicName} or {@code subscriptionName} are null or empty strings. + * @throws NullPointerException if {@code subscriptionOptions} is null. + * @throws ResourceExistsException if a subscription exists with the same topic and subscription name. + * @see Create or Update Entity + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono createSubscription(String topicName, String subscriptionName, String ruleName, + CreateSubscriptionOptions subscriptionOptions, + CreateRuleOptions ruleOptions) { + + return createSubscriptionWithResponse(topicName, subscriptionName, ruleName, subscriptionOptions, ruleOptions) + .map(Response::getValue); + } + + /** + * Creates a subscription with default rule and returns the created subscription in addition to the HTTP response. + * + * @param topicName Name of the topic associated with subscription. + * @param subscriptionName Name of the subscription. + * @param ruleName Name of the default rule the subscription should be created with. + * @param subscriptionOptions A {@link CreateSubscriptionOptions} object describing the subscription to create. + * @param ruleOptions A {@link CreateRuleOptions} object describing the default rule. + * If null, then pass-through filter will be created. + * + * @return A Mono that returns the created subscription in addition to the HTTP response. + * @throws ClientAuthenticationException if the client's credentials do not have access to modify the + * namespace. + * @throws HttpResponseException If the request body was invalid, the quota is exceeded, or an error occurred + * processing the request. + * @throws IllegalArgumentException if {@code topicName} or {@code subscriptionName} are null or empty strings. + * @throws NullPointerException if {@code subscriptionOptions} is null. + * @throws ResourceExistsException if a subscription exists with the same topic and subscription name. + * @see Create or Update Entity + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> createSubscriptionWithResponse(String topicName, + String subscriptionName, + String ruleName, + CreateSubscriptionOptions subscriptionOptions, + CreateRuleOptions ruleOptions) { + return withContext(context -> createSubscriptionWithResponse(topicName, subscriptionName, ruleName, + subscriptionOptions, ruleOptions, context)); + } + /** * Creates a queue with its context. * @@ -1446,13 +1507,18 @@ null, getTracingContext(context)) /** * Creates a subscription with its context. * - * @param subscriptionOptions Subscription to create. + * @param topicName Name of the topic associated with subscription. + * @param subscriptionName Name of the subscription. + * @param ruleName Name of the default rule the subscription should be created with. + * @param subscriptionOptions A {@link CreateSubscriptionOptions} object describing the subscription to create. + * @param ruleOptions A {@link CreateRuleOptions} object describing the default rule. + * If null, then pass-through filter will be created. * @param context Context to pass into request. * * @return A Mono that completes with the created {@link SubscriptionProperties}. */ Mono> createSubscriptionWithResponse(String topicName, String subscriptionName, - CreateSubscriptionOptions subscriptionOptions, Context context) { + String ruleName, CreateSubscriptionOptions subscriptionOptions, CreateRuleOptions ruleOptions, Context context) { if (CoreUtils.isNullOrEmpty(topicName)) { return monoError(LOGGER, new IllegalArgumentException("'topicName' cannot be null or empty.")); } @@ -1478,6 +1544,16 @@ Mono> createSubscriptionWithResponse(String top subscriptionOptions.setForwardDeadLetteredMessagesTo(forwardDlq); } + if (ruleOptions != null) { + if (ruleOptions.getFilter() == null) { + return monoError(LOGGER, new IllegalArgumentException("'RuleFilter' cannot be null.")); + } + final RuleDescription rule = new RuleDescription() + .setAction(ruleOptions.getAction() != null ? EntityHelper.toImplementation(ruleOptions.getAction()) : null) + .setFilter(EntityHelper.toImplementation(ruleOptions.getFilter())) + .setName(ruleName); + subscriptionOptions.setDefaultRule(EntityHelper.toModel(rule)); + } final CreateSubscriptionBody createEntity = getCreateSubscriptionBody(EntityHelper.getSubscriptionDescription(subscriptionOptions)); try { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClient.java index 50254e434a28..dd0418f62d30 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClient.java @@ -39,6 +39,8 @@ import com.azure.messaging.servicebus.administration.implementation.models.SubscriptionDescriptionFeed; import com.azure.messaging.servicebus.administration.implementation.models.TopicDescriptionEntry; import com.azure.messaging.servicebus.administration.implementation.models.TopicDescriptionFeed; +import com.azure.messaging.servicebus.administration.implementation.models.RuleDescription; +import com.azure.messaging.servicebus.administration.implementation.models.ServiceBusManagementErrorException; import com.azure.messaging.servicebus.administration.models.CreateQueueOptions; import com.azure.messaging.servicebus.administration.models.CreateRuleOptions; import com.azure.messaging.servicebus.administration.models.CreateSubscriptionOptions; @@ -59,7 +61,6 @@ import java.time.Duration; import java.util.List; import java.util.Objects; -import java.util.function.Function; import static com.azure.core.http.policy.AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY; import static com.azure.messaging.servicebus.administration.implementation.EntityHelper.NUMBER_OF_ELEMENTS; @@ -255,7 +256,7 @@ public Response createQueueWithResponse(String queueName, Creat */ @ServiceMethod(returns = ReturnType.SINGLE) public RuleProperties createRule(String topicName, String subscriptionName, String ruleName) { - return createRule(topicName, subscriptionName, ruleName, null); + return createRule(topicName, ruleName, subscriptionName, new CreateRuleOptions()); } /** @@ -330,11 +331,11 @@ public Response createRuleWithResponse(String topicName, String */ @ServiceMethod(returns = ReturnType.SINGLE) public SubscriptionProperties createSubscription(String topicName, String subscriptionName) { - return createSubscription(topicName, subscriptionName, null); + return createSubscription(topicName, subscriptionName, new CreateSubscriptionOptions()); } /** - * Creates a subscription with the {@link SubscriptionProperties}. + * Creates a subscription with the {@link CreateSubscriptionOptions}. * * @param topicName Name of the topic associated with subscription. * @param subscriptionName Name of the subscription. @@ -356,7 +357,35 @@ public SubscriptionProperties createSubscription(String topicName, String subscr } /** - * Creates a queue and returns the created queue in addition to the HTTP response. + * Creates a subscription with default rule using the {@link CreateSubscriptionOptions} and + * {@link CreateRuleOptions}. + * + * @param topicName Name of the topic associated with subscription. + * @param subscriptionName Name of the subscription. + * @param ruleName Name of the default rule the subscription should be created with. + * @param subscriptionOptions A {@link CreateSubscriptionOptions} object describing the subscription to create. + * @param ruleOptions A {@link CreateRuleOptions} object describing the default rule. + * If null, then pass-through filter will be created. + * + * @return Information about the created subscription. + * @throws ClientAuthenticationException if the client's credentials do not have access to modify the + * namespace. + * @throws HttpResponseException If the request body was invalid, the quota is exceeded, or an error occurred + * processing the request. + * @throws IllegalArgumentException if {@code topicName} or {@code subscriptionName} are null or empty strings. + * @throws ResourceExistsException if a subscription exists with the same topic and subscription name. + * @see Create or Update Entity + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SubscriptionProperties createSubscription(String topicName, String subscriptionName, String ruleName, + CreateSubscriptionOptions subscriptionOptions, + CreateRuleOptions ruleOptions) { + return createSubscriptionWithResponse(topicName, subscriptionName, ruleName, subscriptionOptions, + ruleOptions, null).getValue(); + } + + /** + * Creates a subscription and returns the created subscription in addition to the HTTP response. * * @param topicName Name of the topic associated with subscription. * @param subscriptionName Name of the subscription. @@ -401,6 +430,46 @@ public Response createSubscriptionWithResponse(String to } + /** + * Creates a subscription with default rule configured and returns the created subscription + * in addition to the HTTP response. + * + * @param topicName Name of the topic associated with subscription. + * @param subscriptionName Name of the subscription. + * @param ruleName Name of the default rule the subscription should be created with. + * @param subscriptionOptions A {@link CreateSubscriptionOptions} object describing the subscription to create. + * @param ruleOptions A {@link CreateRuleOptions} object describing the default rule. + * If null, then pass-through filter will be created. + * @param context Additional context that is passed through the HTTP pipeline during the service call. + * + * @return The created subscription in addition to the HTTP response. + * @throws ClientAuthenticationException if the client's credentials do not have access to modify the + * namespace. + * @throws HttpResponseException If the request body was invalid, the quota is exceeded, or an error occurred + * processing the request. + * @throws NullPointerException if {@code subscriptionOptions} is null. + * @throws ResourceExistsException if a subscription exists with the same topic and subscription name. + * @see Create or Update Entity + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response createSubscriptionWithResponse(String topicName, String subscriptionName, + String ruleName, + CreateSubscriptionOptions subscriptionOptions, + CreateRuleOptions ruleOptions, + Context context) { + if (ruleOptions == null) { + throw LOGGER.logExceptionAsError(new NullPointerException("'CreateRuleOptions' cannot be null.")); + } + Objects.requireNonNull(ruleOptions.getFilter(), "'RuleFilter' cannot be null."); + final RuleDescription rule = new RuleDescription() + .setAction(ruleOptions.getAction() != null ? EntityHelper.toImplementation(ruleOptions.getAction()) : null) + .setFilter(EntityHelper.toImplementation(ruleOptions.getFilter())) + .setName(ruleName); + subscriptionOptions.setDefaultRule(EntityHelper.toModel(rule)); + return createSubscriptionWithResponse(topicName, subscriptionName, subscriptionOptions, context); + + } + /** * Creates a topic with the given name. * @@ -664,28 +733,22 @@ public QueueProperties getQueue(String queueName) { */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getQueueWithResponse(String queueName, Context context) { - return getQueueWithResponse(queueName, context, Function.identity()); - } - - private Response getQueueWithResponse(String queueName, Context context, - Function mapper) { - validateQueueName(queueName); - final Response response = entityClient.getSyncWithResponse(queueName, true, - enableSyncContext(context)); - final Response deserialize = deserializeQueue(response); - - // if this is null, then the queue could not be found. - if (deserialize.getValue() == null) { + final Response response = getQueueInternal(queueName, context); + if (response.getValue() == null) { final HttpResponse - notFoundResponse = new EntityHelper.EntityNotFoundHttpResponse<>(deserialize); + notFoundResponse = new EntityHelper.EntityNotFoundHttpResponse<>(response); throw LOGGER.logExceptionAsError( new ResourceNotFoundException(String.format("Queue '%s' does not exist.", queueName), notFoundResponse)); - } else { - final T mapped = mapper.apply(deserialize.getValue()); - return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), - response.getHeaders(), mapped); } + return response; + } + + private Response getQueueInternal(String queueName, Context context) { + validateQueueName(queueName); + final Response response = entityClient.getSyncWithResponse(queueName, true, + enableSyncContext(context)); + return deserializeQueue(response); } /** @@ -717,18 +780,10 @@ public boolean getQueueExists(String queueName) { */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getQueueExistsWithResponse(String queueName, Context context) { - final Response queueWithResponse = - getQueueWithResponse(queueName, context, Function.identity()); + final Response queueWithResponse = getQueueInternal(queueName, context); return getEntityExistsWithResponse(queueWithResponse); } - private Response getEntityExistsWithResponse(Response getEntityOperation) { - // When an entity does not exist, it does not have any description object in it. - final boolean exists = getEntityOperation.getValue() != null; - return new SimpleResponse<>(getEntityOperation.getRequest(), getEntityOperation.getStatusCode(), - getEntityOperation.getHeaders(), exists); - } - /** * Gets runtime properties about the queue. * @@ -761,7 +816,9 @@ public QueueRuntimeProperties getQueueRuntimeProperties(String queueName) { */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getQueueRuntimePropertiesWithResponse(String queueName, Context context) { - return getQueueWithResponse(queueName, context, QueueRuntimeProperties::new); + final Response response = getQueueWithResponse(queueName, context); + return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), + response.getHeaders(), new QueueRuntimeProperties(response.getValue())); } /** @@ -863,40 +920,25 @@ public SubscriptionProperties getSubscription(String topicName, String subscript * @param subscriptionName Name of subscription to get information about. * @param context Additional context that is passed through the HTTP pipeline during the service call. * @return Information about the subscription and the associated HTTP response. - * @throws ClientAuthenticationException if the client's credentials do not have access to modify the - * namespace. - * @throws HttpResponseException If error occurred processing the request. + + * @throws ServiceBusManagementErrorException If error occurred processing the request. * @throws IllegalArgumentException if {@code topicName} or {@code subscriptionName} are null or empty strings. - * @throws ResourceNotFoundException if the {@code subscriptionName} does not exist. * @see Get Entity */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getSubscriptionWithResponse(String topicName, String subscriptionName, Context context) { - return getSubscriptionWithResponse(topicName, subscriptionName, context, Function.identity()); + return getSubscriptionInternal(topicName, subscriptionName, context); } - private Response getSubscriptionWithResponse(String topicName, String subscriptionName, Context context, - Function mapper) { + private Response getSubscriptionInternal(String topicName, + String subscriptionName, Context context) { validateTopicName(topicName); validateSubscriptionName(subscriptionName); - final Response response = - managementClient.getSubscriptions().getSyncWithResponse(topicName, subscriptionName, true, - enableSyncContext(context)); - final Response deserialize = deserializeSubscription(topicName, response); - // if this is null, then the queue could not be found. - if (deserialize.getValue() == null) { - final HttpResponse notFoundResponse - = new EntityHelper.EntityNotFoundHttpResponse<>(deserialize); - throw LOGGER.logExceptionAsError(new ResourceNotFoundException(String.format( - "Subscription '%s' in topic '%s' does not exist.", topicName, subscriptionName), - notFoundResponse)); - } else { - final T mapped = mapper.apply(deserialize.getValue()); - return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), - response.getHeaders(), mapped); - } + final Response response = managementClient.getSubscriptions() + .getSyncWithResponse(topicName, subscriptionName, true, enableSyncContext(context)); + return deserializeSubscription(topicName, response); } /** @@ -905,9 +947,8 @@ private Response getSubscriptionWithResponse(String topicName, String sub * @param topicName Name of topic associated with subscription. * @param subscriptionName Name of the subscription. * @return {@code true} if the subscription exists. - * @throws ClientAuthenticationException if the client's credentials do not have access to modify the - * namespace. - * @throws HttpResponseException If error occurred processing the request. + * + * @throws ServiceBusManagementErrorException If error occurred processing the request. * @throws IllegalArgumentException if {@code subscriptionName} is null or an empty string. * @throws NullPointerException if {@code subscriptionName} is null. */ @@ -933,7 +974,7 @@ public boolean getSubscriptionExists(String topicName, String subscriptionName) public Response getSubscriptionExistsWithResponse(String topicName, String subscriptionName, Context context) { final Response subscriptionWithResponse = - getSubscriptionWithResponse(topicName, subscriptionName, context, Function.identity()); + getSubscriptionInternal(topicName, subscriptionName, context); return getEntityExistsWithResponse(subscriptionWithResponse); } @@ -973,7 +1014,16 @@ public SubscriptionRuntimeProperties getSubscriptionRuntimeProperties(String top @ServiceMethod(returns = ReturnType.SINGLE) public Response getSubscriptionRuntimePropertiesWithResponse( String topicName, String subscriptionName, Context context) { - return getSubscriptionWithResponse(topicName, subscriptionName, context, SubscriptionRuntimeProperties::new); + final Response response = getSubscriptionWithResponse(topicName, subscriptionName, context); + if (response.getValue() == null) { + final HttpResponse notFoundResponse + = new EntityHelper.EntityNotFoundHttpResponse<>(response); + throw LOGGER.logExceptionAsError(new ResourceNotFoundException(String.format( + "Subscription '%s' in topic '%s' does not exist.", topicName, subscriptionName), + notFoundResponse)); + } + return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), + response.getHeaders(), new SubscriptionRuntimeProperties(response.getValue())); } /** @@ -999,38 +1049,30 @@ public TopicProperties getTopic(String topicName) { * @param topicName Name of topic to get information about. * @param context Additional context that is passed through the HTTP pipeline during the service call. * @return Information about the topic and the associated HTTP response. - * @throws ClientAuthenticationException if the client's credentials do not have access to modify the - * namespace. - * @throws HttpResponseException If error occurred processing the request. + * + * @throws ServiceBusManagementErrorException If error occurred processing the request. * @throws IllegalArgumentException if {@code topicName} is null or an empty string. * @throws ResourceNotFoundException if the {@code topicName} does not exist. * @see Get Entity */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getTopicWithResponse(String topicName, Context context) { - return getTopicWithResponse(topicName, context, - Function.identity()); - } - - Response getTopicWithResponse(String topicName, Context context, - Function mapper) { - validateTopicName(topicName); - - final Response response = entityClient.getSyncWithResponse(topicName, true, enableSyncContext(context)); - final Response deserialize = deserializeTopic(response); - - // if this is null, then the queue could not be found. - if (deserialize.getValue() == null) { + final Response response = getTopicInternal(topicName, context); + if (response.getValue() == null) { final HttpResponse notFoundResponse = - new EntityHelper.EntityNotFoundHttpResponse<>(deserialize); + new EntityHelper.EntityNotFoundHttpResponse<>(response); throw LOGGER.logExceptionAsError( new ResourceNotFoundException(String.format("Topic '%s' does not exist.", topicName), notFoundResponse)); - } else { - final T mapped = mapper.apply(deserialize.getValue()); - return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), - response.getHeaders(), mapped); } + return response; + } + + private Response getTopicInternal(String topicName, Context context) { + validateTopicName(topicName); + final Response response = entityClient.getSyncWithResponse(topicName, + true, enableSyncContext(context)); + return deserializeTopic(response); } /** @@ -1062,8 +1104,7 @@ public boolean getTopicExists(String topicName) { */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getTopicExistsWithResponse(String topicName, Context context) { - final Response topicWithResponse = - getTopicWithResponse(topicName, context, Function.identity()); + final Response topicWithResponse = getTopicInternal(topicName, context); return getEntityExistsWithResponse(topicWithResponse); } @@ -1090,16 +1131,31 @@ public TopicRuntimeProperties getTopicRuntimeProperties(String topicName) { * @param topicName Name of topic to get information about. * @param context Additional context that is passed through the HTTP pipeline during the service call. * @return Runtime properties about the topic and the associated HTTP response. - * @throws ClientAuthenticationException if the client's credentials do not have access to modify the - * namespace. - * @throws HttpResponseException If error occurred processing the request. + * + * @throws ServiceBusManagementErrorException If error occurred processing the request. * @throws IllegalArgumentException if {@code topicName} is null or an empty string. * @throws ResourceNotFoundException if the {@code topicName} does not exist. * @see Get Entity */ @ServiceMethod(returns = ReturnType.SINGLE) public Response getTopicRuntimePropertiesWithResponse(String topicName, Context context) { - return getTopicWithResponse(topicName, context, TopicRuntimeProperties::new); + final Response response = getTopicWithResponse(topicName, context); + if (response.getValue() == null) { + final HttpResponse notFoundResponse = + new EntityHelper.EntityNotFoundHttpResponse<>(response); + throw LOGGER.logExceptionAsError( + new ResourceNotFoundException(String.format("Topic '%s' does not exist.", topicName), + notFoundResponse)); + } + return new SimpleResponse<>(response.getRequest(), response.getStatusCode(), + response.getHeaders(), new TopicRuntimeProperties(response.getValue())); + } + + private Response getEntityExistsWithResponse(Response getEntityOperation) { + // When an entity does not exist, it does not have any description object in it. + final boolean exists = getEntityOperation.getValue() != null; + return new SimpleResponse<>(getEntityOperation.getRequest(), getEntityOperation.getStatusCode(), + getEntityOperation.getHeaders(), exists); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientBuilder.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientBuilder.java index b983e494bd37..4388d07359a6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientBuilder.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientBuilder.java @@ -5,11 +5,13 @@ import com.azure.core.amqp.implementation.ConnectionStringProperties; import com.azure.core.annotation.ServiceClientBuilder; +import com.azure.core.client.traits.AzureSasCredentialTrait; import com.azure.core.client.traits.ConfigurationTrait; import com.azure.core.client.traits.ConnectionStringTrait; import com.azure.core.client.traits.EndpointTrait; import com.azure.core.client.traits.HttpTrait; import com.azure.core.client.traits.TokenCredentialTrait; +import com.azure.core.credential.AzureSasCredential; import com.azure.core.credential.TokenCredential; import com.azure.core.exception.AzureException; import com.azure.core.http.HttpClient; @@ -89,6 +91,7 @@ ServiceBusAdministrationAsyncClient.class}) public final class ServiceBusAdministrationClientBuilder implements TokenCredentialTrait, + AzureSasCredentialTrait, ConnectionStringTrait, HttpTrait, ConfigurationTrait, @@ -324,6 +327,22 @@ public ServiceBusAdministrationClientBuilder credential(TokenCredential credenti return this; } + /** + * Sets the credential with Shared Access Signature for the Service Bus resource. + * Refer to + * Service Bus access control with Shared Access Signatures. + * + * @param credential {@link AzureSasCredential} to be used for authentication. + * + * @return The updated {@link ServiceBusAdministrationClientBuilder} object. + */ + @Override + public ServiceBusAdministrationClientBuilder credential(AzureSasCredential credential) { + Objects.requireNonNull(credential, "'credential' cannot be null."); + this.tokenCredential = new ServiceBusSharedKeyCredential(credential.getSignature()); + return this; + } + /** * Sets the {@link HttpClient} to use for sending and receiving requests to and from the service. * diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/EntityHelper.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/EntityHelper.java index 64b28d054daf..4ce28222063e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/EntityHelper.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/EntityHelper.java @@ -150,7 +150,9 @@ public static SubscriptionDescription getSubscriptionDescription(CreateSubscript .setMaxDeliveryCount(options.getMaxDeliveryCount()) .setRequiresSession(options.isSessionRequired()) .setStatus(options.getStatus()) - .setUserMetadata(options.getUserMetadata()); + .setUserMetadata(options.getUserMetadata()) + .setDefaultRule(options.getDefaultRule() != null + ? EntityHelper.toImplementation(options.getDefaultRule()) : null); } public static TopicDescription getTopicDescription(CreateTopicOptions options) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/ServiceBusManagementSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/ServiceBusManagementSerializer.java index 0d16ed14a09f..071acd38590f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/ServiceBusManagementSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/ServiceBusManagementSerializer.java @@ -63,7 +63,7 @@ public String serialize(Object object, SerializerEncoding encoding) throws IOExc .replaceAll(namespace + ":", "") .replace("xmlns:" + namespace + "=", "xmlns="); - if (!CreateRuleBody.class.equals(clazz)) { + if (!CreateRuleBody.class.equals(clazz) && !CreateSubscriptionBody.class.equals(clazz)) { return replaced; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/models/SubscriptionDescription.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/models/SubscriptionDescription.java index 60130d73ad4c..3eba867d669e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/models/SubscriptionDescription.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/models/SubscriptionDescription.java @@ -66,6 +66,11 @@ public final class SubscriptionDescription { namespace = "http://schemas.microsoft.com/netservices/2010/10/servicebus/connect") private Boolean deadLetteringOnFilterEvaluationExceptions; + @JacksonXmlProperty( + localName = "DefaultRuleDescription", + namespace = "http://schemas.microsoft.com/netservices/2010/10/servicebus/connect") + private RuleDescription defaultRule; + /* * The number of messages in the subscription. */ @@ -562,4 +567,24 @@ public SubscriptionDescription setEntityAvailabilityStatus(EntityAvailabilitySta this.entityAvailabilityStatus = entityAvailabilityStatus; return this; } + + /*** + * Get the rule that the subscription was created with, if any. + * + * @return the Rule description + */ + public RuleDescription getDefaultRule() { + return this.defaultRule; + } + + /*** + * Set the rule that the subscriptions hould be created with, if any. + * + * @param ruleDescription the rule description (name, action, filter) + * @return the SubscriptionDescription object itself. + */ + public SubscriptionDescription setDefaultRule(RuleDescription ruleDescription) { + this.defaultRule = ruleDescription; + return this; + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/AuthorizationRule.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/AuthorizationRule.java index 374f56e043fd..483c89f5b897 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/AuthorizationRule.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/AuthorizationRule.java @@ -45,7 +45,7 @@ public interface AuthorizationRule { /** * Gets the name of the authorization rule. * - * @return name of the authoriation rule. + * @return name of the authorization rule. */ String getKeyName(); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java index e3cfc72fb9a1..6dfa49558f37 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java @@ -32,7 +32,7 @@ * match. *

    * This provides an efficient shortcut for declarations of filters that deal only with correlation - * equality. In this case the cost of the lexigraphical analysis of the expression can be avoided. Not only will + * equality. In this case the cost of the lexicographical analysis of the expression can be avoided. Not only will * correlation filters be optimized at declaration time, but they will also be optimized at runtime. Correlation filter * matching can be reduced to a hashtable lookup, which aggregates the complexity of the set of defined correlation * filters to O(1). diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CreateSubscriptionOptions.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CreateSubscriptionOptions.java index 16eb1e5559b5..d7e5d8921761 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CreateSubscriptionOptions.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CreateSubscriptionOptions.java @@ -33,6 +33,7 @@ public final class CreateSubscriptionOptions { private int maxDeliveryCount; private boolean requiresSession; private String userMetadata; + private RuleProperties defaultRule; /** * Creates an instance. Default values for the subscription are populated. The properties populated with defaults @@ -64,6 +65,7 @@ public CreateSubscriptionOptions() { this.maxDeliveryCount = 10; this.requiresSession = false; this.status = EntityStatus.ACTIVE; + this.defaultRule = null; } /** @@ -87,6 +89,7 @@ public CreateSubscriptionOptions(SubscriptionProperties subscription) { this.requiresSession = subscription.isSessionRequired(); this.status = subscription.getStatus(); this.userMetadata = subscription.getUserMetadata(); + this.defaultRule = null; } /** @@ -363,4 +366,25 @@ public CreateSubscriptionOptions setAutoDeleteOnIdle(Duration autoDeleteOnIdle) this.autoDeleteOnIdle = autoDeleteOnIdle; return this; } + + /*** + * Get the rule that the subscription was created with, if any. + * + * @return the Rule description + */ + public RuleProperties getDefaultRule() { + return this.defaultRule; + } + + /*** + * Set the rule that the subscriptions should be created with, if any. + * + * @param ruleProperties the rule description (name, action, filter) + * + * @return the CreateSubscriptionOptions object itself. + */ + public CreateSubscriptionOptions setDefaultRule(RuleProperties ruleProperties) { + this.defaultRule = ruleProperties; + return this; + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java index 20156b2b8bcd..c7660cae4f92 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java @@ -46,7 +46,7 @@ public SqlRuleAction(String sqlExpression) { } /** - * Package private constructor for creating a model deserialised from the service. + * Package private constructor for creating a model deserialized from the service. * * @param sqlExpression SQL expression for the action. * @param compatibilityLevel The compatibility level. diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java index 3bc9db4c7778..817998655331 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java @@ -53,7 +53,7 @@ public SqlRuleFilter(String sqlExpression) { } /** - * Package private constructor for creating a model deserialised from the service. + * Package private constructor for creating a model deserialized from the service. * * @param sqlExpression SQL expression for the filter. * @param compatibilityLevel The compatibility level. diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/DeadletterQueueSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/DeadletterQueueSample.java index a55aa2d0aeab..ef1feda439c8 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/DeadletterQueueSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/DeadletterQueueSample.java @@ -46,7 +46,7 @@ public class DeadletterQueueSample { new Person("Faraday", "Michael"), new Person("Galilei", "Galileo"), new Person("Kepler", "Johannes"), - new Person("Kopernikus", "Nikolaus") + new Person("Copernicus", "Nikola") ); /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendSessionMessageAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendSessionMessageAsyncSample.java index 38e3ce2b0ee6..ab26b92bfdd9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendSessionMessageAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendSessionMessageAsyncSample.java @@ -73,8 +73,7 @@ public void run() throws InterruptedException { // Setting the sessionId parameter ensures all messages end up in the same session and are received in order. List messages = Arrays.asList( new ServiceBusMessage(BinaryData.fromBytes("Hello".getBytes(UTF_8))).setSessionId(sessionId), - new ServiceBusMessage(BinaryData.fromBytes("Bonjour".getBytes(UTF_8))).setSessionId(sessionId), - new ServiceBusMessage(BinaryData.fromBytes("Guten tag".getBytes(UTF_8))).setSessionId(sessionId) + new ServiceBusMessage(BinaryData.fromBytes("Bonjour".getBytes(UTF_8))).setSessionId(sessionId) ); // This sends all the messages in a single message batch. diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusClientBuilderTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusClientBuilderTest.java index 0c0b084a08a4..260fcf8994ba 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusClientBuilderTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusClientBuilderTest.java @@ -234,26 +234,20 @@ void invalidPrefetch() { @MethodSource("getProxyConfigurations") @ParameterizedTest - public void testProxyOptionsConfiguration(String proxyConfiguration, boolean expectedClientCreation) { + public void testProxyOptionsConfiguration(String proxyConfiguration) { Configuration configuration = TestUtils.getGlobalConfiguration().clone(); configuration .put(Configuration.PROPERTY_HTTP_PROXY, proxyConfiguration) .put(JAVA_NET_USER_SYSTEM_PROXIES, "true"); - boolean clientCreated = false; - try { - ServiceBusReceiverClient syncClient = new ServiceBusClientBuilder() - .connectionString(NAMESPACE_CONNECTION_STRING) - .configuration(configuration) - .receiver() - .topicName("baz").subscriptionName("bar") - .receiveMode(ServiceBusReceiveMode.PEEK_LOCK) - .buildClient(); - - clientCreated = true; - } catch (Exception ex) { - } - Assertions.assertEquals(expectedClientCreation, clientCreated); + // Client creation should not fail with incorrect proxy configuration + ServiceBusReceiverClient syncClient = new ServiceBusClientBuilder() + .connectionString(NAMESPACE_CONNECTION_STRING) + .configuration(configuration) + .receiver() + .topicName("baz").subscriptionName("bar") + .receiveMode(ServiceBusReceiveMode.PEEK_LOCK) + .buildClient(); } @Test @@ -386,16 +380,16 @@ public void testConnectionWithAzureSasCredential() { private static Stream getProxyConfigurations() { return Stream.of( - Arguments.of("http://localhost:8080", true), - Arguments.of("localhost:8080", true), - Arguments.of("localhost_8080", false), - Arguments.of("http://example.com:8080", true), - Arguments.of("http://sub.example.com:8080", true), - Arguments.of(":8080", false), - Arguments.of("http://localhost", true), - Arguments.of("sub.example.com:8080", true), - Arguments.of("https://username:password@sub.example.com:8080", true), - Arguments.of("https://username:password@sub.example.com", true) + Arguments.of("http://localhost:8080"), + Arguments.of("localhost:8080"), + Arguments.of("localhost_8080"), + Arguments.of("http://example.com:8080"), + Arguments.of("http://sub.example.com:8080"), + Arguments.of(":8080"), + Arguments.of("http://localhost"), + Arguments.of("sub.example.com:8080"), + Arguments.of("https://username:password@sub.example.com:8080"), + Arguments.of("https://username:password@sub.example.com") ); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java index d6f5552f7190..05af0a6a1b12 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java @@ -162,6 +162,15 @@ public static String getQueueBaseName() { return getPropertyValue("AZURE_SERVICEBUS_QUEUE_NAME"); } + /** + * Gets the Service Bus rule name + * + * @return The Service Bus rule name. + */ + public static String getRuleBaseName() { + return getPropertyValue("AZURE_SERVICEBUS_RULE_NAME"); + } + /** * The Service Bus queue name (session enabled). * diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClientIntegrationTest.java index cd3c2adc2062..cd0e8899f98f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationAsyncClientIntegrationTest.java @@ -70,7 +70,7 @@ class ServiceBusAdministrationAsyncClientIntegrationTest extends TestBase { @BeforeAll static void beforeAll() { - StepVerifier.setDefaultTimeout(Duration.ofSeconds(30)); + StepVerifier.setDefaultTimeout(Duration.ofSeconds(10)); } @AfterAll diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientIntegrationTest.java new file mode 100644 index 000000000000..c731b5b478f5 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/administration/ServiceBusAdministrationClientIntegrationTest.java @@ -0,0 +1,832 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.messaging.servicebus.administration; + +import com.azure.core.credential.AzureSasCredential; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.policy.FixedDelayOptions; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.RetryOptions; +import com.azure.core.http.rest.PagedIterable; +import com.azure.core.http.rest.Response; +import com.azure.core.test.TestBase; +import com.azure.core.test.TestMode; +import com.azure.core.test.implementation.TestingHelpers; +import com.azure.messaging.servicebus.TestUtils; +import com.azure.messaging.servicebus.administration.implementation.models.ServiceBusManagementErrorException; +import com.azure.messaging.servicebus.administration.models.AccessRights; +import com.azure.messaging.servicebus.administration.models.CreateQueueOptions; +import com.azure.messaging.servicebus.administration.models.CreateRuleOptions; +import com.azure.messaging.servicebus.administration.models.CreateSubscriptionOptions; +import com.azure.messaging.servicebus.administration.models.CreateTopicOptions; +import com.azure.messaging.servicebus.administration.models.EmptyRuleAction; +import com.azure.messaging.servicebus.administration.models.EntityStatus; +import com.azure.messaging.servicebus.administration.models.FalseRuleFilter; +import com.azure.messaging.servicebus.administration.models.NamespaceProperties; +import com.azure.messaging.servicebus.administration.models.NamespaceType; +import com.azure.messaging.servicebus.administration.models.QueueProperties; +import com.azure.messaging.servicebus.administration.models.QueueRuntimeProperties; +import com.azure.messaging.servicebus.administration.models.RuleProperties; +import com.azure.messaging.servicebus.administration.models.SharedAccessAuthorizationRule; +import com.azure.messaging.servicebus.administration.models.SqlRuleAction; +import com.azure.messaging.servicebus.administration.models.SqlRuleFilter; +import com.azure.messaging.servicebus.administration.models.SubscriptionProperties; +import com.azure.messaging.servicebus.administration.models.SubscriptionRuntimeProperties; +import com.azure.messaging.servicebus.administration.models.TopicProperties; +import com.azure.messaging.servicebus.administration.models.TopicRuntimeProperties; +import com.azure.messaging.servicebus.administration.models.TrueRuleFilter; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.time.Clock; +import java.time.Duration; +import java.time.OffsetDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.azure.messaging.servicebus.TestUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +/** + * Tests {@link ServiceBusAdministrationClient}. + */ +@Tag("integration") +public class ServiceBusAdministrationClientIntegrationTest extends TestBase { + protected static final Duration TIMEOUT = Duration.ofSeconds(20); + + @AfterAll + static void cleanup() { + + if (TestingHelpers.getTestMode() == TestMode.PLAYBACK) { + return; + } + final ServiceBusAdministrationClient client = new ServiceBusAdministrationClientBuilder() + .connectionString(getConnectionString(false)) + .buildClient(); + // Clear all queues + client.listQueues().stream() + .filter(queueProperties -> !queueProperties.getName().toLowerCase(Locale.ROOT) + .equals(getEntityName(getQueueBaseName(), 5))) + .forEach(property -> client.deleteQueue(property.getName())); + + //Clear all topics + client.listTopics().stream() + .filter(properties -> !(properties.getName().toLowerCase(Locale.ROOT) + .equals(getEntityName(getTopicBaseName(), 2)) + || properties.getName().toLowerCase(Locale.ROOT) + .equals(getEntityName(getTopicBaseName(), 1)))) + .forEach(property -> client.deleteTopic(property.getName())); + + //Clear all subscriptions + final String topicName = getEntityName(getTopicBaseName(), 2); + client.listSubscriptions(topicName).stream() + .filter(properties -> !properties.getSubscriptionName().toLowerCase(Locale.ROOT) + .equals(getEntityName(getSubscriptionBaseName(), 2))) + .forEach(property -> client.deleteSubscription(topicName, property.getSubscriptionName())); + + //Clear rules in subscription + final String subscriptionName = getEntityName(getSubscriptionBaseName(), 2); + client.listRules(topicName, subscriptionName).stream() + .filter(properties -> !properties.getName().toLowerCase(Locale.ROOT) + .equals(getEntityName(getRuleBaseName(), 2))) + .forEach(property -> client.deleteRule(topicName, subscriptionName, property.getName())); + } + + /** + * Test to connect to the service bus with an azure sas credential. + * ServiceBusSharedKeyCredential doesn't need a specific test method because other tests below + * use connection string, which is converted to a ServiceBusSharedKeyCredential internally. + */ + @Test + void azureSasCredentialsTest() { + assumeTrue(interceptorManager.isLiveMode(), "Azure Identity test is for live test only"); + final String fullyQualifiedDomainName = TestUtils.getFullyQualifiedDomainName(); + + assumeTrue(fullyQualifiedDomainName != null && !fullyQualifiedDomainName.isEmpty(), + "AZURE_SERVICEBUS_FULLY_QUALIFIED_DOMAIN_NAME variable needs to be set when using credentials."); + + String connectionString = getConnectionString(true); + Pattern sasPattern = Pattern.compile("SharedAccessSignature=(.*);?", Pattern.CASE_INSENSITIVE); + Matcher matcher = sasPattern.matcher(connectionString); + assertTrue(matcher.find(), "Couldn't find SAS from connection string"); + ServiceBusAdministrationClient client = new ServiceBusAdministrationClientBuilder() + .endpoint(fullyQualifiedDomainName) + .credential(new AzureSasCredential(matcher.group(1))) + .buildClient(); + NamespaceProperties np = client.getNamespaceProperties(); + assertNotNull(np.getName()); + } + + @Test + void createQueue() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-2" + : getEntityName(getQueueBaseName(), 2); + final String forwardToEntityName = interceptorManager.isPlaybackMode() + ? "queue-5" + : getEntityName(getQueueBaseName(), 5); + + final String keyName = "test-rule"; + final List accessRights = Collections.singletonList(AccessRights.SEND); + final SharedAccessAuthorizationRule rule = interceptorManager.isPlaybackMode() + ? new SharedAccessAuthorizationRule(keyName, "REDACTED", + "REDACTED", accessRights) + : new SharedAccessAuthorizationRule(keyName, accessRights); + + final CreateQueueOptions expected = new CreateQueueOptions() + .setMaxSizeInMegabytes(1024) + .setMaxDeliveryCount(7) + .setLockDuration(Duration.ofSeconds(45)) + .setDuplicateDetectionRequired(true) + .setDuplicateDetectionHistoryTimeWindow(Duration.ofMinutes(2)) + .setUserMetadata("some-metadata-for-testing") + .setForwardTo(forwardToEntityName) + .setForwardDeadLetteredMessagesTo(forwardToEntityName); + + expected.getAuthorizationRules().add(rule); + + final QueueProperties actual = client.createQueue(queueName, expected); + assertEquals(queueName, actual.getName()); + + assertEquals(expected.getLockDuration(), actual.getLockDuration()); + assertEquals(expected.getMaxDeliveryCount(), actual.getMaxDeliveryCount()); + assertEquals(expected.getMaxSizeInMegabytes(), actual.getMaxSizeInMegabytes()); + assertEquals(expected.getUserMetadata(), actual.getUserMetadata()); + + assertEquals(expected.isDeadLetteringOnMessageExpiration(), actual.isDeadLetteringOnMessageExpiration()); + assertEquals(expected.isPartitioningEnabled(), actual.isPartitioningEnabled()); + assertEquals(expected.isDuplicateDetectionRequired(), actual.isDuplicateDetectionRequired()); + + assertEquals(expected.getForwardTo(), actual.getForwardTo()); + assertEquals(expected.getForwardDeadLetteredMessagesTo(), actual.getForwardDeadLetteredMessagesTo()); + + assertAuthorizationRules(expected.getAuthorizationRules(), actual.getAuthorizationRules()); + + final QueueRuntimeProperties runtimeProperties = new QueueRuntimeProperties(actual); + assertEquals(0, runtimeProperties.getTotalMessageCount()); + assertEquals(0, runtimeProperties.getSizeInBytes()); + assertNotNull(runtimeProperties.getCreatedAt()); + + //cleanup + //client.deleteQueue(queueName); + } + + @Test + void createTopicWithResponse() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-3" + : getEntityName(getTopicBaseName(), 3); + final CreateTopicOptions expected = new CreateTopicOptions() + .setMaxSizeInMegabytes(2048L) + .setDuplicateDetectionRequired(true) + .setDuplicateDetectionHistoryTimeWindow(Duration.ofMinutes(2)) + .setUserMetadata("some-metadata-for-testing-topic"); + + final Response response = client.createTopicWithResponse(topicName, expected, null); + assertEquals(201, response.getStatusCode()); + + final TopicProperties actual = response.getValue(); + + assertEquals(topicName, actual.getName()); + assertEquals(expected.getMaxSizeInMegabytes(), actual.getMaxSizeInMegabytes()); + assertEquals(expected.getUserMetadata(), actual.getUserMetadata()); + assertEquals(expected.isPartitioningEnabled(), actual.isPartitioningEnabled()); + assertEquals(expected.isDuplicateDetectionRequired(), actual.isDuplicateDetectionRequired()); + + final TopicRuntimeProperties runtimeProperties = new TopicRuntimeProperties(actual); + assertEquals(0, runtimeProperties.getSubscriptionCount()); + assertEquals(0, runtimeProperties.getSizeInBytes()); + assertNotNull(runtimeProperties.getCreatedAt()); + + //client.deleteTopic(topicName); + } + + @Test + void createSubscription() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String forwardToTopic = interceptorManager.isPlaybackMode() + ? "topic-1" + : getEntityName(getTopicBaseName(), 1); + final String subscriptionName = testResourceNamer.randomName(getSubscriptionBaseName(), 10); + final CreateSubscriptionOptions expected = new CreateSubscriptionOptions() + .setMaxDeliveryCount(7) + .setLockDuration(Duration.ofSeconds(45)) + .setUserMetadata("some-metadata-for-testing-subscriptions") + .setForwardTo(forwardToTopic) + .setForwardDeadLetteredMessagesTo(forwardToTopic); + + final SubscriptionProperties actual = client.createSubscription(topicName, subscriptionName, expected); + assertEquals(topicName, actual.getTopicName()); + assertEquals(subscriptionName, actual.getSubscriptionName()); + + assertEquals(expected.getLockDuration(), actual.getLockDuration()); + assertEquals(expected.getMaxDeliveryCount(), actual.getMaxDeliveryCount()); + assertEquals(expected.getUserMetadata(), actual.getUserMetadata()); + + assertEquals(expected.isDeadLetteringOnMessageExpiration(), actual.isDeadLetteringOnMessageExpiration()); + assertEquals(expected.isSessionRequired(), actual.isSessionRequired()); + assertEquals(expected.getForwardTo(), actual.getForwardTo()); + assertEquals(expected.getForwardDeadLetteredMessagesTo(), actual.getForwardDeadLetteredMessagesTo()); + } + + @Test + void createRule() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = testResourceNamer.randomName("rule", 5); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final SqlRuleAction action = new SqlRuleAction("SET Label = 'test'"); + final CreateRuleOptions options = new CreateRuleOptions() + .setAction(action) + .setFilter(new FalseRuleFilter()); + + final RuleProperties actual = client.createRule(topicName, ruleName, subscriptionName, options); + assertNotNull(actual); + assertEquals(ruleName, actual.getName()); + assertNotNull(actual.getAction()); + + assertTrue(actual.getAction() instanceof SqlRuleAction); + assertEquals(action.getSqlExpression(), ((SqlRuleAction) actual.getAction()).getSqlExpression()); + + assertNotNull(actual.getFilter()); + assertTrue(actual.getFilter() instanceof FalseRuleFilter); + } + + @Test + void createRuleDefaults() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = testResourceNamer.randomName("rule", 7); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + + final RuleProperties rule = client.createRule(topicName, subscriptionName, ruleName); + assertEquals(ruleName, rule.getName()); + assertTrue(rule.getFilter() instanceof TrueRuleFilter); + assertTrue(rule.getAction() instanceof EmptyRuleAction); + } + + @Test + void createRuleResponse() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = testResourceNamer.randomName("rule", 7); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final SqlRuleFilter filter = new SqlRuleFilter("sys.To='foo' OR sys.MessageId IS NULL"); + + final CreateRuleOptions options = new CreateRuleOptions() + .setAction(new EmptyRuleAction()) + .setFilter(filter); + + final Response response = client.createRuleWithResponse(topicName, subscriptionName, + ruleName, options, null); + assertEquals(201, response.getStatusCode()); + + final RuleProperties contents = response.getValue(); + assertNotNull(contents); + assertEquals(ruleName, contents.getName()); + + assertNotNull(contents.getFilter()); + assertTrue(contents.getFilter() instanceof SqlRuleFilter); + + final SqlRuleFilter actualFilter = (SqlRuleFilter) contents.getFilter(); + assertEquals(filter.getSqlExpression(), actualFilter.getSqlExpression()); + + assertNotNull(contents.getAction()); + assertTrue(contents.getAction() instanceof EmptyRuleAction); + } + + @Test + void createQueueExistingName() { + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-5" + : getEntityName(getQueueBaseName(), 5); + final CreateQueueOptions options = new CreateQueueOptions(); + final ServiceBusAdministrationClient client = getClient(); + + ServiceBusManagementErrorException exception = assertThrows(ServiceBusManagementErrorException.class, + () -> client.createQueue(queueName, options), + "Queue exists exception not thrown when creating a queue with existing name"); + assertTrue(exception.getMessage().contains("409")); + } + + @Test + void createSubscriptionExistingName() { + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final ServiceBusAdministrationClient client = getClient(); + + ServiceBusManagementErrorException exception = assertThrows(ServiceBusManagementErrorException.class, + () -> client.createSubscription(topicName, subscriptionName), + "Queue exists exception not thrown when creating a queue with existing name"); + assertTrue(exception.getMessage().contains("409")); + } + + @Test + void updateRuleResponse() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = testResourceNamer.randomName("rule", 15); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final SqlRuleAction expectedAction = new SqlRuleAction("SET MessageId = 'matching-id'"); + final SqlRuleFilter expectedFilter = new SqlRuleFilter("sys.To = 'telemetry-event'"); + + final RuleProperties existingRule = client.createRule(topicName, subscriptionName, ruleName); + assertNotNull(existingRule); + + existingRule.setAction(expectedAction).setFilter(expectedFilter); + + final RuleProperties rule = client.updateRule(topicName, subscriptionName, existingRule); + assertNotNull(rule); + assertEquals(ruleName, rule.getName()); + + assertTrue(rule.getFilter() instanceof SqlRuleFilter); + assertEquals(expectedFilter.getSqlExpression(), + ((SqlRuleFilter) rule.getFilter()).getSqlExpression()); + + assertTrue(rule.getAction() instanceof SqlRuleAction); + assertEquals(expectedAction.getSqlExpression(), + ((SqlRuleAction) rule.getAction()).getSqlExpression()); + } + + @Test + void getNamespace() { + final ServiceBusAdministrationClient client = getClient(); + final String expectedName; + if (interceptorManager.isPlaybackMode()) { + expectedName = "ServiceBusTest"; + } else { + final String[] split = TestUtils.getFullyQualifiedDomainName().split("\\.", 2); + expectedName = split[0]; + } + + final NamespaceProperties namespaceProperties = client.getNamespaceProperties(); + assertEquals(NamespaceType.MESSAGING, namespaceProperties.getNamespaceType()); + assertEquals(expectedName, namespaceProperties.getName()); + } + + @Test + void getQueue() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-5" + : getEntityName(TestUtils.getQueueBaseName(), 5); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final QueueProperties queueProperties = client.getQueue(queueName); + assertEquals(queueName, queueProperties.getName()); + + assertFalse(queueProperties.isPartitioningEnabled()); + assertFalse(queueProperties.isSessionRequired()); + assertNotNull(queueProperties.getLockDuration()); + + final QueueRuntimeProperties runtimeProperties = new QueueRuntimeProperties(queueProperties); + assertNotNull(runtimeProperties.getCreatedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getCreatedAt())); + assertNotNull(runtimeProperties.getAccessedAt()); + } + + @Test + void getQueueDoesNotExist() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-99" + : getEntityName(TestUtils.getQueueBaseName(), 99); + + assertThrows(ResourceNotFoundException.class, () -> client.getQueue(queueName), + "Queue exists! But should not. Incorrect getQueue behavior"); + } + + @Test + void getQueueExists() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-5" + : getEntityName(TestUtils.getQueueBaseName(), 5); + + assertTrue(client.getQueueExists(queueName)); + } + + @Test + void getQueueExistsFalse() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-99" + : getEntityName(TestUtils.getQueueBaseName(), 99); + + assertFalse(client.getQueueExists(queueName)); + } + + @Test + void getQueueRuntimeProperties() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-5" + : getEntityName(TestUtils.getQueueBaseName(), 5); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final QueueRuntimeProperties runtimeProperties = client.getQueueRuntimeProperties(queueName); + assertEquals(queueName, runtimeProperties.getName()); + + assertNotNull(runtimeProperties.getCreatedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getCreatedAt())); + assertNotNull(runtimeProperties.getAccessedAt()); + } + + @Test + void getTopic() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final TopicProperties topicProperties = client.getTopic(topicName); + assertEquals(topicName, topicProperties.getName()); + + assertTrue(topicProperties.isBatchedOperationsEnabled()); + assertFalse(topicProperties.isDuplicateDetectionRequired()); + assertNotNull(topicProperties.getDuplicateDetectionHistoryTimeWindow()); + assertNotNull(topicProperties.getDefaultMessageTimeToLive()); + assertFalse(topicProperties.isPartitioningEnabled()); + + final TopicRuntimeProperties runtimeProperties = new TopicRuntimeProperties(topicProperties); + assertNotNull(runtimeProperties.getCreatedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getCreatedAt())); + assertNotNull(runtimeProperties.getAccessedAt()); + } + + @Test + void getTopicDoesNotExist() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-99" + : getEntityName(getTopicBaseName(), 99); + + assertThrows(ResourceNotFoundException.class, () -> client.getTopic(topicName), + "Topic exists! But should not. Incorrect getTopic behavior"); + } + + @Test + void getTopicExists() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + + assertTrue(client.getTopicExists(topicName)); + } + + @Test + void getTopicExistsFalse() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-99" + : getEntityName(getTopicBaseName(), 99); + + assertFalse(client.getTopicExists(topicName)); + } + + @Test + void getTopicRuntimeProperties() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final TopicRuntimeProperties runtimeProperties = client.getTopicRuntimeProperties(topicName); + assertEquals(topicName, runtimeProperties.getName()); + + assertTrue(runtimeProperties.getSubscriptionCount() >= 1); + + assertNotNull(runtimeProperties.getCreatedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getCreatedAt())); + assertNotNull(runtimeProperties.getAccessedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getAccessedAt())); + assertEquals(0, runtimeProperties.getScheduledMessageCount()); + } + + @Test + void getSubscription() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final SubscriptionProperties properties = client.getSubscription(topicName, subscriptionName); + assertEquals(topicName, properties.getTopicName()); + assertEquals(subscriptionName, properties.getSubscriptionName()); + + assertFalse(properties.isSessionRequired()); + assertNotNull(properties.getLockDuration()); + + final SubscriptionRuntimeProperties runtimeProperties = new SubscriptionRuntimeProperties(properties); + assertNotNull(runtimeProperties.getCreatedAt()); + assertTrue(nowUtc.isAfter(runtimeProperties.getCreatedAt())); + assertNotNull(runtimeProperties.getAccessedAt()); + } + + @Test + void getSubscriptionDoesNotExist() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-99" + : getEntityName(getSubscriptionBaseName(), 99); + + ServiceBusManagementErrorException exception = assertThrows(ServiceBusManagementErrorException.class, + () -> client.getSubscription(topicName, subscriptionName), + "Subscription exists! But should not. Incorrect getSubscription behavior"); + assertTrue(exception.getMessage().contains("Status code 404")); + } + + @Test + void getSubscriptionExists() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + + assertTrue(client.getSubscriptionExists(topicName, subscriptionName)); + } + + @Test + void getSubscriptionRuntimeProperties() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + final OffsetDateTime nowUtc = OffsetDateTime.now(Clock.systemUTC()); + + final SubscriptionRuntimeProperties properties = client.getSubscriptionRuntimeProperties(topicName, subscriptionName); + assertEquals(topicName, properties.getTopicName()); + assertEquals(subscriptionName, properties.getSubscriptionName()); + + assertTrue(properties.getTotalMessageCount() >= 0); + assertEquals(0, properties.getActiveMessageCount()); + assertEquals(0, properties.getTransferDeadLetterMessageCount()); + assertEquals(0, properties.getTransferMessageCount()); + assertTrue(properties.getDeadLetterMessageCount() >= 0); + + assertNotNull(properties.getCreatedAt()); + assertTrue(nowUtc.isAfter(properties.getCreatedAt())); + assertNotNull(properties.getAccessedAt()); + } + + @Test + void getSubscriptionRuntimePropertiesUnauthorizedClient() { + final String connectionString = interceptorManager.isPlaybackMode() + ? "Endpoint=sb://foo.servicebus.windows.net;SharedAccessKeyName=dummyKey;SharedAccessKey=dummyAccessKey" + : TestUtils.getConnectionString(false); + + final String connectionStringUpdated = connectionString.replace("SharedAccessKey=", + "SharedAccessKey=fake-key-"); + + final ServiceBusAdministrationClientBuilder builder = new ServiceBusAdministrationClientBuilder() + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) + .connectionString(connectionStringUpdated); + + if (interceptorManager.isPlaybackMode()) { + builder.httpClient(interceptorManager.getPlaybackClient()); + } else if (!interceptorManager.isLiveMode()) { + builder.addPolicy(interceptorManager.getRecordPolicy()); + } + + final ServiceBusAdministrationClient client = builder.buildClient(); + + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + + ServiceBusManagementErrorException exception = assertThrows(ServiceBusManagementErrorException.class, + () -> client.getSubscriptionRuntimeProperties(topicName, subscriptionName), + "Subscription runtime properties accessible by unauthorized client! This should not be possible."); + assertTrue(exception.getMessage().contains("Status code 401")); + } + + @Test + void getRule() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = interceptorManager.isPlaybackMode() + ? "rule-2" + : getEntityName(getRuleBaseName(), 2); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + + final Response response = client.getRuleWithResponse(topicName, subscriptionName, ruleName, null); + assertEquals(200, response.getStatusCode()); + + final RuleProperties contents = response.getValue(); + + assertNotNull(contents); + assertEquals(ruleName, contents.getName()); + assertNotNull(contents.getFilter()); + assertTrue(contents.getFilter() instanceof SqlRuleFilter); + + assertNotNull(contents.getAction()); + assertTrue(contents.getAction() instanceof EmptyRuleAction); + } + + + @Test + void deleteQueue() { + final ServiceBusAdministrationClient client = getClient(); + final String queueName = interceptorManager.isPlaybackMode() + ? "queue-9" + : getEntityName(getQueueBaseName(), 9); + + client.createQueue(queueName); + + client.deleteQueue(queueName); + } + + @Test + void deleteRule() { + final ServiceBusAdministrationClient client = getClient(); + final String ruleName = interceptorManager.isPlaybackMode() + ? "rule-9" + : getEntityName(getRuleBaseName(), 9); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + client.createRule(topicName, subscriptionName, ruleName); + + client.deleteRule(topicName, subscriptionName, ruleName); + } + + @Test + void deleteSubscription() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-9" + : getEntityName(getSubscriptionBaseName(), 9); + + client.createSubscription(topicName, subscriptionName); + + client.deleteSubscription(topicName, subscriptionName); + } + + @Test + void deleteTopic() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-9" + : getEntityName(getTopicBaseName(), 9); + client.createTopic(topicName); + + client.deleteTopic(topicName); + } + + // List Methods + + @Test + void listQueues() { + final ServiceBusAdministrationClient client = getClient(); + + PagedIterable queueProperties = client.listQueues(); + queueProperties.forEach(queueDescription -> { + assertNotNull(queueDescription.getName()); + assertTrue(queueDescription.getMaxDeliveryCount() > 0); + assertSame(queueDescription.getStatus(), EntityStatus.ACTIVE); + }); + assertTrue(queueProperties.stream().findAny().isPresent()); + } + + @Test + void listTopics() { + final ServiceBusAdministrationClient client = getClient(); + + PagedIterable topics = client.listTopics(); + topics.forEach(topicProperties -> { + assertNotNull(topicProperties.getName()); + assertTrue(topicProperties.isBatchedOperationsEnabled()); + assertFalse(topicProperties.isPartitioningEnabled()); + }); + assertTrue(topics.stream().count() > 1); + } + + @Test + void listSubscriptions() { + final ServiceBusAdministrationClient client = getClient(); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + + PagedIterable subscriptionProperties = client.listSubscriptions(topicName); + subscriptionProperties.forEach(subscription -> { + assertEquals(topicName, subscription.getTopicName()); + assertNotNull(subscription.getSubscriptionName()); + }); + assertTrue(subscriptionProperties.stream().findAny().isPresent()); + } + + @Test + void listRules() { + final ServiceBusAdministrationClient client = getClient(); + + final String ruleName = interceptorManager.isPlaybackMode() + ? "rule-2" + : getEntityName(getRuleBaseName(), 2); + final String topicName = interceptorManager.isPlaybackMode() + ? "topic-2" + : getEntityName(getTopicBaseName(), 2); + final String subscriptionName = interceptorManager.isPlaybackMode() + ? "subscription-2" + : getEntityName(getSubscriptionBaseName(), 2); + + PagedIterable ruleProperties = client.listRules(topicName, subscriptionName); + + assertTrue(ruleProperties.stream().findAny().isPresent()); + Optional ruleOptional = ruleProperties.stream() + .filter(rule1 -> rule1.getName().equals(ruleName)).findFirst(); + assertTrue(ruleOptional.isPresent()); + RuleProperties rule = ruleOptional.get(); + + assertEquals(ruleName, rule.getName()); + assertNotNull(rule.getFilter()); + assertTrue(rule.getFilter() instanceof SqlRuleFilter); + assertNotNull(rule.getAction()); + assertTrue(rule.getAction() instanceof EmptyRuleAction); + } + + private ServiceBusAdministrationClient getClient() { + final String connectionString = interceptorManager.isPlaybackMode() + ? "Endpoint=sb://foo.servicebus.windows.net;SharedAccessKeyName=dummyKey;SharedAccessKey=dummyAccessKey" + : TestUtils.getConnectionString(false); + + final ServiceBusAdministrationClientBuilder builder = new ServiceBusAdministrationClientBuilder() + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)) + .connectionString(connectionString) + .retryOptions(new RetryOptions(new FixedDelayOptions(1, TIMEOUT))); + + if (interceptorManager.isPlaybackMode()) { + builder.httpClient(interceptorManager.getPlaybackClient()); + } else if (!interceptorManager.isLiveMode()) { + builder.addPolicy(interceptorManager.getRecordPolicy()); + } + return builder.buildClient(); + } +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.azureSasCredentialsTest.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.azureSasCredentialsTest.json new file mode 100644 index 000000000000..ef57284a590c --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.azureSasCredentialsTest.json @@ -0,0 +1,4 @@ +{ + "networkCallRecords" : [ ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueue.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueue.json new file mode 100644 index 000000000000..0f0f90bbb276 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueue.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-2?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/queue-2?api-version=2021-05queue-22022-10-29T04:50:45Z2022-10-29T04:50:46ZfooPT45S1024truefalseP10675199DT2H48M5.477SfalsePT2M7true00falseSharedAccessKeyNoneSendtest-ruleREDACTEDREDACTEDActivehttps://foo.servicebus.windows.net/queue-52022-10-29T04:50:45.91Z2022-10-29T04:50:46Zsome-metadata-for-testingtrueP10675199DT2H48M5.4775807SfalseAvailablehttps://foo.servicebus.windows.net/queue-5false1024", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueueExistingName.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueueExistingName.json new file mode 100644 index 000000000000..5f52573a8ff5 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createQueueExistingName.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-5?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851373030000", + "retry-after" : "0", + "StatusCode" : "409", + "Body" : "409SubCode=40900. Conflict. You're requesting an operation that isn't allowed in the resource's current state. To know more visit https://aka.ms/sbResourceMgrExceptions. . TrackingId:2a92d276-d88b-4420-b40f-1a27db574bae_G2S3, SystemTracker:foo.servicebus.windows.net:queue-5, Timestamp:2022-10-29T04:50:45", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/xml; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRule.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRule.json new file mode 100644 index 000000000000..a3ebde646dc4 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRule.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/87c8c?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/87c8c?api-version=2021-0587c8c2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=020SET Label = 'test'202022-10-29T04:50:45.6172323Z87c8c", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "87c8c" ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleDefaults.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleDefaults.json new file mode 100644 index 000000000000..861e1b172284 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleDefaults.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/14844cd?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/14844cd?api-version=2021-0514844cd2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.1296655Z14844cd", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "14844cd" ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleResponse.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleResponse.json new file mode 100644 index 000000000000..fa2da2b2456b --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createRuleResponse.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/414390e?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/414390e?api-version=2021-05414390e2022-10-29T04:50:45Z2022-10-29T04:50:45Zsys.To='foo' OR sys.MessageId IS NULL202022-10-29T04:50:45.4433392Z414390e", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "414390e" ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscription.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscription.json new file mode 100644 index 000000000000..7f2cfd7598b8 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscription.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/15b3069b73?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/15b3069b73?api-version=2021-0515b3069b732022-10-29T04:50:45Z2022-10-29T04:50:45ZPT45SfalseP10675199DT2H48M5.477Sfalsetrue07trueActivehttps://foo.servicebus.windows.net/topic-12022-10-29T04:50:45.1296655Z2022-10-29T04:50:45.1296655Z0001-01-01T00:00:00some-metadata-for-testing-subscriptionshttps://foo.servicebus.windows.net/topic-1P10675199DT2H48M5.4775807SAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "15b3069b73" ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscriptionExistingName.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscriptionExistingName.json new file mode 100644 index 000000000000..6c16e69c8fb2 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createSubscriptionExistingName.json @@ -0,0 +1,23 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "409", + "Body" : "409The messaging entity 'foo:Topic:topic-2|subscription-2' already exists. To know more visit https://aka.ms/sbResourceMgrExceptions. TrackingId:36c39f31-e74e-459b-b4a3-39f6d2b8d2e4_B3S2, SystemTracker:NoSystemTracker, Timestamp:2022-10-29T04:50:45", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/xml; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createTopicWithResponse.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createTopicWithResponse.json new file mode 100644 index 000000000000..7b768090b012 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.createTopicWithResponse.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-3?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-3?api-version=2021-05topic-32022-10-29T04:50:46Z2022-10-29T04:50:46ZfooP10675199DT2H48M5.477S2048truePT2Mtrue0falsefalseActive2022-10-29T04:50:46.53Z2022-10-29T04:50:46.627ZfalseP10675199DT2H48M5.477Sfalsesome-metadata-for-testing-topicAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteQueue.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteQueue.json new file mode 100644 index 000000000000..690fdad38a10 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteQueue.json @@ -0,0 +1,38 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/queue-9?api-version=2021-05queue-92022-10-29T04:50:45Z2022-10-29T04:50:45ZfooPT1M1024falsefalseP10675199DT2H48M5.477SfalsePT1M10true00falseActive2022-10-29T04:50:45.61Z2022-10-29T04:50:45.717ZtrueP10675199DT2H48M5.477SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "content-length" : "0", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638026158457170000", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteRule.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteRule.json new file mode 100644 index 000000000000..6837bbe3974b --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteRule.json @@ -0,0 +1,39 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-9?api-version=2021-05rule-92022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.5078033Zrule-9", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "content-length" : "0", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteSubscription.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteSubscription.json new file mode 100644 index 000000000000..633f47a968d9 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteSubscription.json @@ -0,0 +1,39 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-9?api-version=2021-05subscription-92022-10-29T04:50:45Z2022-10-29T04:50:45ZPT1MfalseP10675199DT2H48M5.477Sfalsetrue010trueActive2022-10-29T04:50:45.2940825Z2022-10-29T04:50:45.2940825Z0001-01-01T00:00:00P10675199DT2H48M5.477SAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "content-length" : "0", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteTopic.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteTopic.json new file mode 100644 index 000000000000..c1df2bd3d113 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.deleteTopic.json @@ -0,0 +1,38 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-9?api-version=2021-05topic-92022-10-29T04:50:45Z2022-10-29T04:50:45ZfooP10675199DT2H48M5.477S1024falsePT1Mtrue0falsefalseActive2022-10-29T04:50:45.573Z2022-10-29T04:50:45.68ZfalseP10675199DT2H48M5.477SfalseAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-9?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "content-length" : "0", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638026158456800000", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getNamespace.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getNamespace.json new file mode 100644 index 000000000000..73f10691fd4a --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getNamespace.json @@ -0,0 +1,20 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/$namespaceinfo?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://ServiceBusTest.servicebus.windows.net/$namespaceinfo?api-version=2021-05foo2022-10-29T04:50:46Zfoo2022-08-23T18:47:01.663ZPremium22022-08-23T18:47:01.663ZServiceBusTestMessaging", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueue.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueue.json new file mode 100644 index 000000000000..a916a510ed58 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueue.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851373030000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05queue-52022-10-28T20:18:57Z2022-10-28T20:18:57ZfooPT30S1024falsefalseP14DfalsePT10M10true00falseActive2022-10-28T20:18:57.14Z2022-10-28T20:18:57.303Z0001-01-01T00:00:00Ztrue00000P10675199DT2H48M5.4775807SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueDoesNotExist.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueDoesNotExist.json new file mode 100644 index 000000000000..0b44cd6b099a --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueDoesNotExist.json @@ -0,0 +1,21 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-99?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Publicly Listed ServicesThis is the list of publicly-listed services currently available.uuid:9aa89a7f-ba58-4994-8804-99e2e22dab33;id=5732022-10-29T04:50:45ZService Bus 1.1", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExists.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExists.json new file mode 100644 index 000000000000..a916a510ed58 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExists.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851373030000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05queue-52022-10-28T20:18:57Z2022-10-28T20:18:57ZfooPT30S1024falsefalseP14DfalsePT10M10true00falseActive2022-10-28T20:18:57.14Z2022-10-28T20:18:57.303Z0001-01-01T00:00:00Ztrue00000P10675199DT2H48M5.4775807SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExistsFalse.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExistsFalse.json new file mode 100644 index 000000000000..9f153b143c87 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueExistsFalse.json @@ -0,0 +1,21 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-99?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Publicly Listed ServicesThis is the list of publicly-listed services currently available.uuid:014b6c25-aa23-4def-ae91-f99fc2b0463e;id=6842022-10-29T04:50:47ZService Bus 1.1", + "Date" : "Sat, 29 Oct 2022 04:50:47 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueRuntimeProperties.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueRuntimeProperties.json new file mode 100644 index 000000000000..a916a510ed58 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getQueueRuntimeProperties.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851373030000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/queue-5?enrich=true&api-version=2021-05queue-52022-10-28T20:18:57Z2022-10-28T20:18:57ZfooPT30S1024falsefalseP14DfalsePT10M10true00falseActive2022-10-28T20:18:57.14Z2022-10-28T20:18:57.303Z0001-01-01T00:00:00Ztrue00000P10675199DT2H48M5.4775807SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getRule.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getRule.json new file mode 100644 index 000000000000..8b86464081c3 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getRule.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "sb://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-2?enrich=true&api-version=2021-05rule-22022-10-29T04:42:54Z2022-10-29T04:42:54Z1=1202022-10-29T04:42:54.9654865Zrule-2", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscription.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscription.json new file mode 100644 index 000000000000..95c80bc6a1cc --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscription.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "sb://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05subscription-22022-10-29T04:42:30Z2022-10-29T04:42:30ZPT30SfalseP14Dfalsefalse07trueActive2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z00000P14DAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionDoesNotExist.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionDoesNotExist.json new file mode 100644 index 000000000000..c84b997d47f8 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionDoesNotExist.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-99?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "404", + "Body" : "404Entity 'foo:Topic:topic-2|subscription-99' was not found. To know more visit https://aka.ms/sbResourceMgrExceptions. TrackingId:80a60ad5-21bc-47f4-a51c-12d090c93ea0_G3S3_B3S2, SystemTracker:foo:Topic:topic-2|subscription-99, Timestamp:2022-10-29T04:50:45", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/xml; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionExists.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionExists.json new file mode 100644 index 000000000000..95c80bc6a1cc --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionExists.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "sb://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05subscription-22022-10-29T04:42:30Z2022-10-29T04:42:30ZPT30SfalseP14Dfalsefalse07trueActive2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z00000P14DAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimeProperties.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimeProperties.json new file mode 100644 index 000000000000..95c80bc6a1cc --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimeProperties.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "sb://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05subscription-22022-10-29T04:42:30Z2022-10-29T04:42:30ZPT30SfalseP14Dfalsefalse07trueActive2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z00000P14DAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimePropertiesUnauthorizedClient.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimePropertiesUnauthorizedClient.json new file mode 100644 index 000000000000..b06264661344 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getSubscriptionRuntimePropertiesUnauthorizedClient.json @@ -0,0 +1,20 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "content-length" : "0", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "401", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopic.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopic.json new file mode 100644 index 000000000000..3a0680e1e746 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopic.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05topic-22022-10-28T20:19:03Z2022-10-28T20:19:03ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-28T20:19:03.8230901Z2022-10-28T20:19:03.8230901Z2022-10-29T04:50:45.2877018Ztrue000003P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicDoesNotExist.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicDoesNotExist.json new file mode 100644 index 000000000000..80351ae322b5 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicDoesNotExist.json @@ -0,0 +1,21 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-99?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Publicly Listed ServicesThis is the list of publicly-listed services currently available.uuid:014b6c25-aa23-4def-ae91-f99fc2b0463e;id=6822022-10-29T04:50:45ZService Bus 1.1", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExists.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExists.json new file mode 100644 index 000000000000..065bfc3a2bf1 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExists.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05topic-22022-10-28T20:19:03Z2022-10-28T20:19:03ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-28T20:19:03.8230901Z2022-10-28T20:19:03.8230901Z2022-10-29T04:42:30.1170519Ztrue000001P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExistsFalse.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExistsFalse.json new file mode 100644 index 000000000000..440d7a82be24 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicExistsFalse.json @@ -0,0 +1,21 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-99?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Publicly Listed ServicesThis is the list of publicly-listed services currently available.uuid:014b6c25-aa23-4def-ae91-f99fc2b0463e;id=6832022-10-29T04:50:46ZService Bus 1.1", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicRuntimeProperties.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicRuntimeProperties.json new file mode 100644 index 000000000000..807ed1eb3d38 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.getTopicRuntimeProperties.json @@ -0,0 +1,22 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/topic-2?enrich=true&api-version=2021-05topic-22022-10-28T20:19:03Z2022-10-28T20:19:03ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-28T20:19:03.8230901Z2022-10-28T20:19:03.8230901Z2022-10-29T04:42:30.1170519Ztrue000001P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listQueues.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listQueues.json new file mode 100644 index 000000000000..a26a47402e2d --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listQueues.json @@ -0,0 +1,36 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/$Resources/queues?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Queueshttps://foo.servicebus.windows.net/$Resources/queues?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:46Zhttps://foo.servicebus.windows.net/queue-2?api-version=2021-05queue-22022-10-29T04:50:45Z2022-10-29T04:50:46ZfooPT45S1024truefalseP10675199DT2H48M5.477SfalsePT2M7true00falseSharedAccessKeyNoneSendtest-ruleREDACTEDREDACTEDActivehttps://foo.servicebus.windows.net/queue-52022-10-29T04:50:45.91Z2022-10-29T04:50:46Z0001-01-01T00:00:00Zsome-metadata-for-testingtrue00000P10675199DT2H48M5.4775807SfalseAvailablehttps://foo.servicebus.windows.net/queue-5false1024https://foo.servicebus.windows.net/queue-5?api-version=2021-05queue-52022-10-28T20:18:57Z2022-10-28T20:18:57ZfooPT30S1024falsefalseP14DfalsePT10M10true00falseActive2022-10-28T20:18:57.14Z2022-10-28T20:18:57.303Z0001-01-01T00:00:00Ztrue00000P10675199DT2H48M5.4775807SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/$Resources/queues?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Queueshttps://foo.servicebus.windows.net/$Resources/queues?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:46Zhttps://foo.servicebus.windows.net/queue-2?api-version=2021-05queue-22022-10-29T04:50:45Z2022-10-29T04:50:46ZfooPT45S1024truefalseP10675199DT2H48M5.477SfalsePT2M7true00falseSharedAccessKeyNoneSendtest-ruleREDACTEDREDACTEDActivehttps://foo.servicebus.windows.net/queue-52022-10-29T04:50:45.91Z2022-10-29T04:50:46Z0001-01-01T00:00:00Zsome-metadata-for-testingtrue00000P10675199DT2H48M5.4775807SfalseAvailablehttps://foo.servicebus.windows.net/queue-5false1024https://foo.servicebus.windows.net/queue-5?api-version=2021-05queue-52022-10-28T20:18:57Z2022-10-28T20:18:57ZfooPT30S1024falsefalseP14DfalsePT10M10true00falseActive2022-10-28T20:18:57.14Z2022-10-28T20:18:57.303Z0001-01-01T00:00:00Ztrue00000P10675199DT2H48M5.4775807SfalseAvailablefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listRules.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listRules.json new file mode 100644 index 000000000000..19188bb2b91d --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listRules.json @@ -0,0 +1,40 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Ruleshttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:45Zhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/14844cd?api-version=2021-0514844cd2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.1315237Z14844cdhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-2?api-version=2021-05rule-22022-10-29T04:42:54Z2022-10-29T04:42:54Z1=1202022-10-29T04:42:54.9654865Zrule-2", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Ruleshttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:45Zhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/14844cd?api-version=2021-0514844cd2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.1315237Z14844cdhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule-2?api-version=2021-05rule-22022-10-29T04:42:54Z2022-10-29T04:42:54Z1=1202022-10-29T04:42:54.9654865Zrule-2https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule719177af?api-version=2021-05rule719177af2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.2877018Zrule719177af", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listSubscriptions.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listSubscriptions.json new file mode 100644 index 000000000000..c0167c563b38 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listSubscriptions.json @@ -0,0 +1,40 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Subscriptionshttps://foo.servicebus.windows.net/topic-2/subscriptions?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:45Zhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2?api-version=2021-05subscription-22022-10-29T04:42:30Z2022-10-29T04:42:30ZPT30SfalseP14Dfalsefalse07trueActive2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z00000P14DAvailablefalsehttps://foo.servicebus.windows.net/topic-2/subscriptions/15b3069b73?api-version=2021-0515b3069b732022-10-29T04:50:45Z2022-10-29T04:50:45ZPT45SfalseP10675199DT2H48M5.477Sfalsetrue07trueActivehttps://foo.servicebus.windows.net/topic-12022-10-29T04:50:45.1315237Z2022-10-29T04:50:45.1315237Z2022-10-29T04:50:45.1315237Zsome-metadata-for-testing-subscriptions00000https://foo.servicebus.windows.net/topic-1P10675199DT2H48M5.4775807SAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Subscriptionshttps://foo.servicebus.windows.net/topic-2/subscriptions?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:45Zhttps://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2?api-version=2021-05subscription-22022-10-29T04:42:30Z2022-10-29T04:42:30ZPT30SfalseP14Dfalsefalse07trueActive2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z2022-10-29T04:42:30.1170519Z00000P14DAvailablefalsehttps://foo.servicebus.windows.net/topic-2/subscriptions/15b3069b73?api-version=2021-0515b3069b732022-10-29T04:50:45Z2022-10-29T04:50:45ZPT45SfalseP10675199DT2H48M5.477Sfalsetrue07trueActivehttps://foo.servicebus.windows.net/topic-12022-10-29T04:50:45.1315237Z2022-10-29T04:50:45.1315237Z2022-10-29T04:50:45.1315237Zsome-metadata-for-testing-subscriptions00000https://foo.servicebus.windows.net/topic-1P10675199DT2H48M5.4775807SAvailablefalse", + "Date" : "Sat, 29 Oct 2022 04:50:44 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listTopics.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listTopics.json new file mode 100644 index 000000000000..37ac9e6225f0 --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.listTopics.json @@ -0,0 +1,36 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/$Resources/topics?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Topicshttps://foo.servicebus.windows.net/$Resources/topics?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:46Zhttps://foo.servicebus.windows.net/topic-1?api-version=2021-05topic-12022-10-29T03:00:14Z2022-10-29T03:00:14ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-29T03:00:14Z2022-10-29T03:00:14.073Z0001-01-01T00:00:00Ztrue000000P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024https://foo.servicebus.windows.net/topic-2?api-version=2021-05topic-22022-10-28T20:19:03Z2022-10-28T20:19:03ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-28T20:19:03.8230901Z2022-10-28T20:19:03.8230901Z2022-10-29T04:50:45.3658371Ztrue000002P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024https://foo.servicebus.windows.net/topic-3?api-version=2021-05topic-32022-10-29T04:50:46Z2022-10-29T04:50:46ZfooP10675199DT2H48M5.477S2048truePT2Mtrue0falsefalseActive2022-10-29T04:50:46.53Z2022-10-29T04:50:46.627Z0001-01-01T00:00:00Zfalse000000P10675199DT2H48M5.477Sfalsesome-metadata-for-testing-topicAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.servicebus.windows.net/$Resources/topics?$skip=0&$top=100&api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "Microsoft-HTTPAPI/2.0", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "Topicshttps://foo.servicebus.windows.net/$Resources/topics?$skip=0&$top=100&api-version=2021-052022-10-29T04:50:47Zhttps://foo.servicebus.windows.net/topic-1?api-version=2021-05topic-12022-10-29T03:00:14Z2022-10-29T03:00:14ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-29T03:00:14Z2022-10-29T03:00:14.073Z0001-01-01T00:00:00Ztrue000000P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024https://foo.servicebus.windows.net/topic-2?api-version=2021-05topic-22022-10-28T20:19:03Z2022-10-28T20:19:03ZfooP14D1024falsePT10Mtrue0falsefalseActive2022-10-28T20:19:03.8230901Z2022-10-28T20:19:03.8230901Z2022-10-29T04:50:45.3658371Ztrue000002P10675199DT2H48M5.4775807SfalseAvailablefalsefalse1024https://foo.servicebus.windows.net/topic-3?api-version=2021-05topic-32022-10-29T04:50:46Z2022-10-29T04:50:46ZfooP10675199DT2H48M5.477S2048truePT2Mtrue0falsefalseActive2022-10-29T04:50:46.53Z2022-10-29T04:50:46.627Z0001-01-01T00:00:00Zfalse000000P10675199DT2H48M5.477Sfalsesome-metadata-for-testing-topicAvailablefalsefalse1024", + "Date" : "Sat, 29 Oct 2022 04:50:46 GMT", + "Content-Type" : "application/atom+xml;type=feed;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.updateRuleResponse.json b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.updateRuleResponse.json new file mode 100644 index 000000000000..ed7c9b229adc --- /dev/null +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/resources/session-records/ServiceBusAdministrationClientIntegrationTest.updateRuleResponse.json @@ -0,0 +1,42 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule719177af?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "201", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule719177af?api-version=2021-05rule719177af2022-10-29T04:50:45Z2022-10-29T04:50:45Z1=1202022-10-29T04:50:45.2899066Zrule719177af", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "https://REDACTED.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule719177af?api-version=2021-05", + "Headers" : { + "User-Agent" : "azsdk-java-azure-messaging-servicebus/7.13.0-beta.1 (11.0.11; Windows 10; 10.0)", + "Content-Type" : "application/atom+xml" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Strict-Transport-Security" : "max-age=31536000", + "Server" : "Microsoft-HTTPAPI/2.0", + "ETag" : "638025851438830000", + "retry-after" : "0", + "StatusCode" : "200", + "Body" : "https://foo.servicebus.windows.net/topic-2/subscriptions/subscription-2/rules/rule719177af?api-version=2021-05rule719177af2022-10-29T04:50:45Z2022-10-29T04:50:45Zsys.To = 'telemetry-event'20SET MessageId = 'matching-id'202022-10-29T04:50:45.3367863Zrule719177af", + "Date" : "Sat, 29 Oct 2022 04:50:45 GMT", + "Content-Type" : "application/atom+xml;type=entry;charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "rule719177af" ] +} diff --git a/sdk/servicelinker/azure-resourcemanager-servicelinker/src/samples/java/com/azure/resourcemanager/servicelinker/CreateServiceLinker.java b/sdk/servicelinker/azure-resourcemanager-servicelinker/src/samples/java/com/azure/resourcemanager/servicelinker/CreateServiceLinker.java index 3bdace912e4c..2f659209784b 100644 --- a/sdk/servicelinker/azure-resourcemanager-servicelinker/src/samples/java/com/azure/resourcemanager/servicelinker/CreateServiceLinker.java +++ b/sdk/servicelinker/azure-resourcemanager-servicelinker/src/samples/java/com/azure/resourcemanager/servicelinker/CreateServiceLinker.java @@ -75,8 +75,8 @@ private static void createSpringCloudAndSQLConnection(AzureResourceManager azure String springAppName = "app" + randomString(8); String sqlServerName = "sqlserver" + randomString(8); String sqlDatabaseName = "sqldb" + randomString(8); - String sqlUserName = "sql" + randomString(8); - String sqlPassword = "5$Ql" + randomString(8); + String sqlUserName = "fakeNamePlaceholder" + randomString(8); + String sqlPassword = "fakePasswordPlaceholder" + randomString(8); SpringService springService = azureResourceManager.springServices().define(springServiceName) .withRegion(region) diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/AutoBackupSettingsTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/AutoBackupSettingsTests.java index 35c50a3ee7ff..e1c368795e29 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/AutoBackupSettingsTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/AutoBackupSettingsTests.java @@ -19,15 +19,15 @@ public void testDeserialize() { AutoBackupSettings model = BinaryData .fromString( - "{\"enable\":false,\"enableEncryption\":true,\"retentionPeriod\":1821646506,\"storageAccountUrl\":\"xw\",\"storageContainerName\":\"pwhonowkg\",\"storageAccessKey\":\"wankixzbi\",\"password\":\"eputtmrywnuzoqf\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[\"Saturday\",\"Monday\",\"Sunday\",\"Tuesday\"],\"fullBackupStartTime\":798441434,\"fullBackupWindowHours\":1495315655,\"logBackupFrequency\":1368622267}") + "{\"enable\":false,\"enableEncryption\":true,\"retentionPeriod\":1821646506,\"storageAccountUrl\":\"xw\",\"storageContainerName\":\"pwhonowkg\",\"storageAccessKey\":\"fakeStorageAccessKeyPlaceholder\",\"password\":\"fakePasswordPlaceholder\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[\"Saturday\",\"Monday\",\"Sunday\",\"Tuesday\"],\"fullBackupStartTime\":798441434,\"fullBackupWindowHours\":1495315655,\"logBackupFrequency\":1368622267}") .toObject(AutoBackupSettings.class); Assertions.assertEquals(false, model.enable()); Assertions.assertEquals(true, model.enableEncryption()); Assertions.assertEquals(1821646506, model.retentionPeriod()); Assertions.assertEquals("xw", model.storageAccountUrl()); Assertions.assertEquals("pwhonowkg", model.storageContainerName()); - Assertions.assertEquals("wankixzbi", model.storageAccessKey()); - Assertions.assertEquals("eputtmrywnuzoqf", model.password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", model.storageAccessKey()); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); Assertions.assertEquals(true, model.backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.AUTOMATED, model.backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.DAILY, model.fullBackupFrequency()); @@ -46,8 +46,8 @@ public void testSerialize() { .withRetentionPeriod(1821646506) .withStorageAccountUrl("xw") .withStorageContainerName("pwhonowkg") - .withStorageAccessKey("wankixzbi") - .withPassword("eputtmrywnuzoqf") + .withStorageAccessKey("fakeStorageAccessKeyPlaceholder") + .withPassword("fakePasswordPlaceholder") .withBackupSystemDbs(true) .withBackupScheduleType(BackupScheduleType.AUTOMATED) .withFullBackupFrequency(FullBackupFrequencyType.DAILY) @@ -67,8 +67,8 @@ public void testSerialize() { Assertions.assertEquals(1821646506, model.retentionPeriod()); Assertions.assertEquals("xw", model.storageAccountUrl()); Assertions.assertEquals("pwhonowkg", model.storageContainerName()); - Assertions.assertEquals("wankixzbi", model.storageAccessKey()); - Assertions.assertEquals("eputtmrywnuzoqf", model.password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", model.storageAccessKey()); + Assertions.assertEquals("fakePasswordPlaceholder", model.password()); Assertions.assertEquals(true, model.backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.AUTOMATED, model.backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.DAILY, model.fullBackupFrequency()); diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/ServerConfigurationsManagementSettingsTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/ServerConfigurationsManagementSettingsTests.java index 4f70d04ce866..daca73a14896 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/ServerConfigurationsManagementSettingsTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/ServerConfigurationsManagementSettingsTests.java @@ -23,12 +23,12 @@ public void testDeserialize() { ServerConfigurationsManagementSettings model = BinaryData .fromString( - "{\"sqlConnectivityUpdateSettings\":{\"connectivityType\":\"PRIVATE\",\"port\":731084227,\"sqlAuthUpdateUserName\":\"pewr\",\"sqlAuthUpdatePassword\":\"mwvvjektcxsenhw\"},\"sqlWorkloadTypeUpdateSettings\":{\"sqlWorkloadType\":\"DW\"},\"sqlStorageUpdateSettings\":{\"diskCount\":842863771,\"startingDeviceId\":2007426179,\"diskConfigurationType\":\"ADD\"},\"additionalFeaturesServerConfigurations\":{\"isRServicesEnabled\":false},\"sqlInstanceSettings\":{\"collation\":\"iqylihkaetck\",\"maxDop\":385263599,\"isOptimizeForAdHocWorkloadsEnabled\":false,\"minServerMemoryMB\":533172139,\"maxServerMemoryMB\":1960016252,\"isLpimEnabled\":true,\"isIfiEnabled\":true}}") + "{\"sqlConnectivityUpdateSettings\":{\"connectivityType\":\"PRIVATE\",\"port\":731084227,\"sqlAuthUpdateUserName\":\"fakeSqlAuthUpdateUsernamePlaceholder\",\"sqlAuthUpdatePassword\":\"fakeSqlAuthUpdatePasswordPlaceholder\"},\"sqlWorkloadTypeUpdateSettings\":{\"sqlWorkloadType\":\"DW\"},\"sqlStorageUpdateSettings\":{\"diskCount\":842863771,\"startingDeviceId\":2007426179,\"diskConfigurationType\":\"ADD\"},\"additionalFeaturesServerConfigurations\":{\"isRServicesEnabled\":false},\"sqlInstanceSettings\":{\"collation\":\"iqylihkaetck\",\"maxDop\":385263599,\"isOptimizeForAdHocWorkloadsEnabled\":false,\"minServerMemoryMB\":533172139,\"maxServerMemoryMB\":1960016252,\"isLpimEnabled\":true,\"isIfiEnabled\":true}}") .toObject(ServerConfigurationsManagementSettings.class); Assertions.assertEquals(ConnectivityType.PRIVATE, model.sqlConnectivityUpdateSettings().connectivityType()); Assertions.assertEquals(731084227, model.sqlConnectivityUpdateSettings().port()); - Assertions.assertEquals("pewr", model.sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); - Assertions.assertEquals("mwvvjektcxsenhw", model.sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); + Assertions.assertEquals("fakeSqlAuthUpdateUsernamePlaceholder", model.sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); + Assertions.assertEquals("fakeSqlAuthUpdatePasswordPlaceholder", model.sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); Assertions.assertEquals(SqlWorkloadType.DW, model.sqlWorkloadTypeUpdateSettings().sqlWorkloadType()); Assertions.assertEquals(842863771, model.sqlStorageUpdateSettings().diskCount()); Assertions.assertEquals(2007426179, model.sqlStorageUpdateSettings().startingDeviceId()); @@ -51,8 +51,8 @@ public void testSerialize() { new SqlConnectivityUpdateSettings() .withConnectivityType(ConnectivityType.PRIVATE) .withPort(731084227) - .withSqlAuthUpdateUsername("pewr") - .withSqlAuthUpdatePassword("mwvvjektcxsenhw")) + .withSqlAuthUpdateUsername("fakeSqlAuthUpdateUsernamePlaceholder") + .withSqlAuthUpdatePassword("fakeSqlAuthUpdatePasswordPlaceholder")) .withSqlWorkloadTypeUpdateSettings( new SqlWorkloadTypeUpdateSettings().withSqlWorkloadType(SqlWorkloadType.DW)) .withSqlStorageUpdateSettings( @@ -74,8 +74,8 @@ public void testSerialize() { model = BinaryData.fromObject(model).toObject(ServerConfigurationsManagementSettings.class); Assertions.assertEquals(ConnectivityType.PRIVATE, model.sqlConnectivityUpdateSettings().connectivityType()); Assertions.assertEquals(731084227, model.sqlConnectivityUpdateSettings().port()); - Assertions.assertEquals("pewr", model.sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); - Assertions.assertEquals("mwvvjektcxsenhw", model.sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); + Assertions.assertEquals("fakeSqlAuthUpdateUsernamePlaceholder", model.sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); + Assertions.assertEquals("fakeSqlAuthUpdatePasswordPlaceholder", model.sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); Assertions.assertEquals(SqlWorkloadType.DW, model.sqlWorkloadTypeUpdateSettings().sqlWorkloadType()); Assertions.assertEquals(842863771, model.sqlStorageUpdateSettings().diskCount()); Assertions.assertEquals(2007426179, model.sqlStorageUpdateSettings().startingDeviceId()); diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlConnectivityUpdateSettingsTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlConnectivityUpdateSettingsTests.java index 24c412792a14..e432c64921e2 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlConnectivityUpdateSettingsTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlConnectivityUpdateSettingsTests.java @@ -16,12 +16,12 @@ public void testDeserialize() { SqlConnectivityUpdateSettings model = BinaryData .fromString( - "{\"connectivityType\":\"PRIVATE\",\"port\":639676552,\"sqlAuthUpdateUserName\":\"fbebrjcxer\",\"sqlAuthUpdatePassword\":\"wutttxfvjrbi\"}") + "{\"connectivityType\":\"PRIVATE\",\"port\":639676552,\"sqlAuthUpdateUserName\":\"fakeSqlAuthUpdateUsernamePlaceholder\",\"sqlAuthUpdatePassword\":\"fakeSqlAuthUpdatePasswordPlaceholder\"}") .toObject(SqlConnectivityUpdateSettings.class); Assertions.assertEquals(ConnectivityType.PRIVATE, model.connectivityType()); Assertions.assertEquals(639676552, model.port()); - Assertions.assertEquals("fbebrjcxer", model.sqlAuthUpdateUsername()); - Assertions.assertEquals("wutttxfvjrbi", model.sqlAuthUpdatePassword()); + Assertions.assertEquals("fakeSqlAuthUpdateUsernamePlaceholder", model.sqlAuthUpdateUsername()); + Assertions.assertEquals("fakeSqlAuthUpdatePasswordPlaceholder", model.sqlAuthUpdatePassword()); } @Test @@ -30,12 +30,12 @@ public void testSerialize() { new SqlConnectivityUpdateSettings() .withConnectivityType(ConnectivityType.PRIVATE) .withPort(639676552) - .withSqlAuthUpdateUsername("fbebrjcxer") - .withSqlAuthUpdatePassword("wutttxfvjrbi"); + .withSqlAuthUpdateUsername("fakeSqlAuthUpdateUsernamePlaceholder") + .withSqlAuthUpdatePassword("fakeSqlAuthUpdatePasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(SqlConnectivityUpdateSettings.class); Assertions.assertEquals(ConnectivityType.PRIVATE, model.connectivityType()); Assertions.assertEquals(639676552, model.port()); - Assertions.assertEquals("fbebrjcxer", model.sqlAuthUpdateUsername()); - Assertions.assertEquals("wutttxfvjrbi", model.sqlAuthUpdatePassword()); + Assertions.assertEquals("fakeSqlAuthUpdateUsernamePlaceholder", model.sqlAuthUpdateUsername()); + Assertions.assertEquals("fakeSqlAuthUpdatePasswordPlaceholder", model.sqlAuthUpdatePassword()); } } diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupPropertiesTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupPropertiesTests.java index 230f1a413e5e..92a4fa5fd9b5 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupPropertiesTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupPropertiesTests.java @@ -18,7 +18,7 @@ public void testDeserialize() { SqlVirtualMachineGroupProperties model = BinaryData .fromString( - "{\"provisioningState\":\"g\",\"sqlImageOffer\":\"tnwu\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"ckyfih\",\"ouPath\":\"idf\",\"clusterBootstrapAccount\":\"wdzuhtymwisd\",\"clusterOperatorAccount\":\"thwxmnteiwaopvkm\",\"sqlServiceAccount\":\"c\",\"fileShareWitnessPath\":\"xdcu\",\"storageAccountUrl\":\"fsrpymzidnse\",\"storageAccountPrimaryKey\":\"xtbzsgfyccsne\",\"clusterSubnetType\":\"MultiSubnet\"}}") + "{\"provisioningState\":\"g\",\"sqlImageOffer\":\"tnwu\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"ckyfih\",\"ouPath\":\"idf\",\"clusterBootstrapAccount\":\"wdzuhtymwisd\",\"clusterOperatorAccount\":\"thwxmnteiwaopvkm\",\"sqlServiceAccount\":\"c\",\"fileShareWitnessPath\":\"xdcu\",\"storageAccountUrl\":\"fsrpymzidnse\",\"storageAccountPrimaryKey\":\"fakeStorageAccountPrimaryKeyPlaceholder\",\"clusterSubnetType\":\"MultiSubnet\"}}") .toObject(SqlVirtualMachineGroupProperties.class); Assertions.assertEquals("tnwu", model.sqlImageOffer()); Assertions.assertEquals(SqlVmGroupImageSku.DEVELOPER, model.sqlImageSku()); @@ -29,7 +29,7 @@ public void testDeserialize() { Assertions.assertEquals("c", model.wsfcDomainProfile().sqlServiceAccount()); Assertions.assertEquals("xdcu", model.wsfcDomainProfile().fileShareWitnessPath()); Assertions.assertEquals("fsrpymzidnse", model.wsfcDomainProfile().storageAccountUrl()); - Assertions.assertEquals("xtbzsgfyccsne", model.wsfcDomainProfile().storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", model.wsfcDomainProfile().storageAccountPrimaryKey()); Assertions.assertEquals(ClusterSubnetType.MULTI_SUBNET, model.wsfcDomainProfile().clusterSubnetType()); } @@ -48,7 +48,7 @@ public void testSerialize() { .withSqlServiceAccount("c") .withFileShareWitnessPath("xdcu") .withStorageAccountUrl("fsrpymzidnse") - .withStorageAccountPrimaryKey("xtbzsgfyccsne") + .withStorageAccountPrimaryKey("fakeStorageAccountPrimaryKeyPlaceholder") .withClusterSubnetType(ClusterSubnetType.MULTI_SUBNET)); model = BinaryData.fromObject(model).toObject(SqlVirtualMachineGroupProperties.class); Assertions.assertEquals("tnwu", model.sqlImageOffer()); @@ -60,7 +60,7 @@ public void testSerialize() { Assertions.assertEquals("c", model.wsfcDomainProfile().sqlServiceAccount()); Assertions.assertEquals("xdcu", model.wsfcDomainProfile().fileShareWitnessPath()); Assertions.assertEquals("fsrpymzidnse", model.wsfcDomainProfile().storageAccountUrl()); - Assertions.assertEquals("xtbzsgfyccsne", model.wsfcDomainProfile().storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", model.wsfcDomainProfile().storageAccountPrimaryKey()); Assertions.assertEquals(ClusterSubnetType.MULTI_SUBNET, model.wsfcDomainProfile().clusterSubnetType()); } } diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsCreateOrUpdateTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsCreateOrUpdateTests.java index 688de6948753..3dd50593dece 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsCreateOrUpdateTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsCreateOrUpdateTests.java @@ -36,7 +36,7 @@ public void testCreateOrUpdate() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"properties\":{\"provisioningState\":\"Succeeded\",\"sqlImageOffer\":\"aboekqv\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"jsflhhcaalnjix\",\"ouPath\":\"xyawj\",\"clusterBootstrapAccount\":\"aq\",\"clusterOperatorAccount\":\"lyjpk\",\"sqlServiceAccount\":\"dzyexznelixh\",\"fileShareWitnessPath\":\"ztfolhbnxk\",\"storageAccountUrl\":\"laulppg\",\"storageAccountPrimaryKey\":\"tpnapnyiropuhpig\",\"clusterSubnetType\":\"MultiSubnet\"}},\"location\":\"lgqg\",\"tags\":{\"zhxgktrmgucn\":\"medjvcslynqwwncw\",\"llwptfdy\":\"pkteo\",\"rhhuaopppcqeqx\":\"pfqbuaceopzf\"},\"id\":\"lzdahzxctobgbkdm\",\"name\":\"izpost\",\"type\":\"grcfb\"}"; + "{\"properties\":{\"provisioningState\":\"Succeeded\",\"sqlImageOffer\":\"aboekqv\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"jsflhhcaalnjix\",\"ouPath\":\"xyawj\",\"clusterBootstrapAccount\":\"aq\",\"clusterOperatorAccount\":\"lyjpk\",\"sqlServiceAccount\":\"dzyexznelixh\",\"fileShareWitnessPath\":\"ztfolhbnxk\",\"storageAccountUrl\":\"laulppg\",\"storageAccountPrimaryKey\":\"fakeStorageAccountPrimaryKeyPlaceholder\",\"clusterSubnetType\":\"MultiSubnet\"}},\"location\":\"lgqg\",\"tags\":{\"zhxgktrmgucn\":\"medjvcslynqwwncw\",\"llwptfdy\":\"pkteo\",\"rhhuaopppcqeqx\":\"pfqbuaceopzf\"},\"id\":\"lzdahzxctobgbkdm\",\"name\":\"izpost\",\"type\":\"grcfb\"}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -82,7 +82,7 @@ public void testCreateOrUpdate() throws Exception { .withSqlServiceAccount("jcbpwxqpsrknft") .withFileShareWitnessPath("vriuhprwmdyvx") .withStorageAccountUrl("ayriwwroyqbexrm") - .withStorageAccountPrimaryKey("ibycno") + .withStorageAccountPrimaryKey("fakeStorageAccountPrimaryKeyPlaceholder") .withClusterSubnetType(ClusterSubnetType.SINGLE_SUBNET)) .create(); @@ -97,7 +97,7 @@ public void testCreateOrUpdate() throws Exception { Assertions.assertEquals("dzyexznelixh", response.wsfcDomainProfile().sqlServiceAccount()); Assertions.assertEquals("ztfolhbnxk", response.wsfcDomainProfile().fileShareWitnessPath()); Assertions.assertEquals("laulppg", response.wsfcDomainProfile().storageAccountUrl()); - Assertions.assertEquals("tpnapnyiropuhpig", response.wsfcDomainProfile().storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", response.wsfcDomainProfile().storageAccountPrimaryKey()); Assertions.assertEquals(ClusterSubnetType.MULTI_SUBNET, response.wsfcDomainProfile().clusterSubnetType()); } diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListByResourceGroupTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListByResourceGroupTests.java index dc9f6cc92148..2f0641c18d36 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListByResourceGroupTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListByResourceGroupTests.java @@ -35,7 +35,7 @@ public void testListByResourceGroup() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"properties\":{\"provisioningState\":\"rmclfplphoxu\",\"sqlImageOffer\":\"rpabg\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"gxywpmue\",\"ouPath\":\"jzwf\",\"clusterBootstrapAccount\":\"q\",\"clusterOperatorAccount\":\"ids\",\"sqlServiceAccount\":\"onobglaocqx\",\"fileShareWitnessPath\":\"cmgyud\",\"storageAccountUrl\":\"tlmoyrx\",\"storageAccountPrimaryKey\":\"fudwpznt\",\"clusterSubnetType\":\"SingleSubnet\"}},\"location\":\"hl\",\"tags\":{\"kfrlhrxsbky\":\"bh\",\"afkuwb\":\"pycanuzbpz\",\"ehhseyvjusrts\":\"rnwb\"},\"id\":\"hspkdeemao\",\"name\":\"mx\",\"type\":\"gkvtmelmqkrhah\"}]}"; + "{\"value\":[{\"properties\":{\"provisioningState\":\"rmclfplphoxu\",\"sqlImageOffer\":\"rpabg\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"gxywpmue\",\"ouPath\":\"jzwf\",\"clusterBootstrapAccount\":\"q\",\"clusterOperatorAccount\":\"ids\",\"sqlServiceAccount\":\"onobglaocqx\",\"fileShareWitnessPath\":\"cmgyud\",\"storageAccountUrl\":\"tlmoyrx\",\"storageAccountPrimaryKey\":\"fakeStorageAccountPrimaryKeyPlaceholder\",\"clusterSubnetType\":\"SingleSubnet\"}},\"location\":\"hl\",\"tags\":{\"kfrlhrxsbky\":\"bh\",\"afkuwb\":\"pycanuzbpz\",\"ehhseyvjusrts\":\"rnwb\"},\"id\":\"hspkdeemao\",\"name\":\"mx\",\"type\":\"gkvtmelmqkrhah\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -77,7 +77,7 @@ public void testListByResourceGroup() throws Exception { Assertions.assertEquals("onobglaocqx", response.iterator().next().wsfcDomainProfile().sqlServiceAccount()); Assertions.assertEquals("cmgyud", response.iterator().next().wsfcDomainProfile().fileShareWitnessPath()); Assertions.assertEquals("tlmoyrx", response.iterator().next().wsfcDomainProfile().storageAccountUrl()); - Assertions.assertEquals("fudwpznt", response.iterator().next().wsfcDomainProfile().storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", response.iterator().next().wsfcDomainProfile().storageAccountPrimaryKey()); Assertions .assertEquals( ClusterSubnetType.SINGLE_SUBNET, response.iterator().next().wsfcDomainProfile().clusterSubnetType()); diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListTests.java index 8f5db687413a..645e69dc0ca6 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineGroupsListTests.java @@ -35,7 +35,7 @@ public void testList() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"properties\":{\"provisioningState\":\"uahaquhcdhmd\",\"sqlImageOffer\":\"laexqp\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"vxpvgomz\",\"ouPath\":\"misgwbnb\",\"clusterBootstrapAccount\":\"ldawkzbaliourqha\",\"clusterOperatorAccount\":\"uhashsfwx\",\"sqlServiceAccount\":\"owzxcu\",\"fileShareWitnessPath\":\"cjooxdjebwpucwwf\",\"storageAccountUrl\":\"vbvmeu\",\"storageAccountPrimaryKey\":\"ivyhzceuojgjrwju\",\"clusterSubnetType\":\"SingleSubnet\"}},\"location\":\"wmcdytdxwi\",\"tags\":{\"qwgxhniskx\":\"rjaw\",\"klwndnhjdauwhv\":\"bkpyc\",\"zbtd\":\"l\"},\"id\":\"xujznbmpowu\",\"name\":\"przqlveu\",\"type\":\"lupj\"}]}"; + "{\"value\":[{\"properties\":{\"provisioningState\":\"uahaquhcdhmd\",\"sqlImageOffer\":\"laexqp\",\"sqlImageSku\":\"Developer\",\"scaleType\":\"HA\",\"clusterManagerType\":\"WSFC\",\"clusterConfiguration\":\"Domainful\",\"wsfcDomainProfile\":{\"domainFqdn\":\"vxpvgomz\",\"ouPath\":\"misgwbnb\",\"clusterBootstrapAccount\":\"ldawkzbaliourqha\",\"clusterOperatorAccount\":\"uhashsfwx\",\"sqlServiceAccount\":\"owzxcu\",\"fileShareWitnessPath\":\"cjooxdjebwpucwwf\",\"storageAccountUrl\":\"vbvmeu\",\"storageAccountPrimaryKey\":\"fakeStorageAccountPrimaryKeyPlaceholder\",\"clusterSubnetType\":\"SingleSubnet\"}},\"location\":\"wmcdytdxwi\",\"tags\":{\"qwgxhniskx\":\"rjaw\",\"klwndnhjdauwhv\":\"bkpyc\",\"zbtd\":\"l\"},\"id\":\"xujznbmpowu\",\"name\":\"przqlveu\",\"type\":\"lupj\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -80,7 +80,7 @@ public void testList() throws Exception { Assertions.assertEquals("vbvmeu", response.iterator().next().wsfcDomainProfile().storageAccountUrl()); Assertions .assertEquals( - "ivyhzceuojgjrwju", response.iterator().next().wsfcDomainProfile().storageAccountPrimaryKey()); + "fakeStorageAccountPrimaryKeyPlaceholder", response.iterator().next().wsfcDomainProfile().storageAccountPrimaryKey()); Assertions .assertEquals( ClusterSubnetType.SINGLE_SUBNET, response.iterator().next().wsfcDomainProfile().clusterSubnetType()); diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineInnerTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineInnerTests.java index b4e08271df7a..e5a9ee641945 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineInnerTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachineInnerTests.java @@ -37,7 +37,7 @@ public void testDeserialize() { SqlVirtualMachineInner model = BinaryData .fromString( - "{\"identity\":{\"type\":\"SystemAssigned\"},\"properties\":{\"virtualMachineResourceId\":\"scxaq\",\"provisioningState\":\"ochcbonqvpkvl\",\"sqlImageOffer\":\"njeaseipheofloke\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"NoAgent\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Express\",\"sqlVirtualMachineGroupResourceId\":\"tgrhpdjpjumas\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"jpqyegu\",\"clusterOperatorAccountPassword\":\"hb\",\"sqlServiceAccountPassword\":\"hejjz\"},\"wsfcStaticIp\":\"dudgwdslfhot\",\"autoPatchingSettings\":{\"enable\":false,\"dayOfWeek\":\"Wednesday\",\"maintenanceWindowStartingHour\":1733107709,\"maintenanceWindowDuration\":991937495},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":false,\"retentionPeriod\":1625524147,\"storageAccountUrl\":\"dehxnltyfsoppu\",\"storageContainerName\":\"esnzwde\",\"storageAccessKey\":\"avo\",\"password\":\"zdmohctbqvu\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[\"Sunday\",\"Saturday\",\"Friday\",\"Wednesday\"],\"fullBackupStartTime\":766815263,\"fullBackupWindowHours\":247911704,\"logBackupFrequency\":175400299},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"slazjdyg\",\"azureKeyVaultUrl\":\"tjixhbkuofqweyk\",\"servicePrincipalName\":\"enevfyexfwhybci\",\"servicePrincipalSecret\":\"yvdcsitynnaa\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"NEW\",\"storageWorkloadType\":\"DW\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true},\"enableAutomaticUpgrade\":true},\"location\":\"jrefovgmkqsle\",\"tags\":{\"k\":\"xyqj\",\"jh\":\"attpngjcrcczsq\",\"ysou\":\"mdajv\",\"canoaeupf\":\"q\"},\"id\":\"yhltrpmopjmcm\",\"name\":\"tuo\",\"type\":\"thfuiuaodsfcpkvx\"}") + "{\"identity\":{\"type\":\"SystemAssigned\"},\"properties\":{\"virtualMachineResourceId\":\"scxaq\",\"provisioningState\":\"ochcbonqvpkvl\",\"sqlImageOffer\":\"njeaseipheofloke\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"NoAgent\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Express\",\"sqlVirtualMachineGroupResourceId\":\"tgrhpdjpjumas\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeClusterOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"dudgwdslfhot\",\"autoPatchingSettings\":{\"enable\":false,\"dayOfWeek\":\"Wednesday\",\"maintenanceWindowStartingHour\":1733107709,\"maintenanceWindowDuration\":991937495},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":false,\"retentionPeriod\":1625524147,\"storageAccountUrl\":\"dehxnltyfsoppu\",\"storageContainerName\":\"esnzwde\",\"storageAccessKey\":\"fakeStorageAccessKeyPlaceholder\",\"password\":\"fakeAutoBackupPasswordPlaceholder\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[\"Sunday\",\"Saturday\",\"Friday\",\"Wednesday\"],\"fullBackupStartTime\":766815263,\"fullBackupWindowHours\":247911704,\"logBackupFrequency\":175400299},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"slazjdyg\",\"azureKeyVaultUrl\":\"tjixhbkuofqweyk\",\"servicePrincipalName\":\"enevfyexfwhybci\",\"servicePrincipalSecret\":\"fakeSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"NEW\",\"storageWorkloadType\":\"DW\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true},\"enableAutomaticUpgrade\":true},\"location\":\"jrefovgmkqsle\",\"tags\":{\"k\":\"xyqj\",\"jh\":\"attpngjcrcczsq\",\"ysou\":\"mdajv\",\"canoaeupf\":\"q\"},\"id\":\"yhltrpmopjmcm\",\"name\":\"tuo\",\"type\":\"thfuiuaodsfcpkvx\"}") .toObject(SqlVirtualMachineInner.class); Assertions.assertEquals("jrefovgmkqsle", model.location()); Assertions.assertEquals("xyqj", model.tags().get("k")); @@ -49,9 +49,12 @@ public void testDeserialize() { Assertions.assertEquals(LeastPrivilegeMode.ENABLED, model.leastPrivilegeMode()); Assertions.assertEquals(SqlImageSku.EXPRESS, model.sqlImageSku()); Assertions.assertEquals("tgrhpdjpjumas", model.sqlVirtualMachineGroupResourceId()); - Assertions.assertEquals("jpqyegu", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); - Assertions.assertEquals("hb", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); - Assertions.assertEquals("hejjz", model.wsfcDomainCredentials().sqlServiceAccountPassword()); + Assertions.assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", + model.wsfcDomainCredentials().clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", + model.wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("dudgwdslfhot", model.wsfcStaticIp()); Assertions.assertEquals(false, model.autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.WEDNESDAY, model.autoPatchingSettings().dayOfWeek()); @@ -62,8 +65,8 @@ public void testDeserialize() { Assertions.assertEquals(1625524147, model.autoBackupSettings().retentionPeriod()); Assertions.assertEquals("dehxnltyfsoppu", model.autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("esnzwde", model.autoBackupSettings().storageContainerName()); - Assertions.assertEquals("avo", model.autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("zdmohctbqvu", model.autoBackupSettings().password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", model.autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakeAutoBackupPasswordPlaceholder", model.autoBackupSettings().password()); Assertions.assertEquals(false, model.autoBackupSettings().backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.MANUAL, model.autoBackupSettings().backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.WEEKLY, model.autoBackupSettings().fullBackupFrequency()); @@ -75,7 +78,7 @@ public void testDeserialize() { Assertions.assertEquals("slazjdyg", model.keyVaultCredentialSettings().credentialName()); Assertions.assertEquals("tjixhbkuofqweyk", model.keyVaultCredentialSettings().azureKeyVaultUrl()); Assertions.assertEquals("enevfyexfwhybci", model.keyVaultCredentialSettings().servicePrincipalName()); - Assertions.assertEquals("yvdcsitynnaa", model.keyVaultCredentialSettings().servicePrincipalSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.keyVaultCredentialSettings().servicePrincipalSecret()); Assertions.assertEquals(false, model.storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions .assertEquals(DiskConfigurationType.NEW, model.storageConfigurationSettings().diskConfigurationType()); @@ -101,9 +104,9 @@ public void testSerialize() { .withSqlVirtualMachineGroupResourceId("tgrhpdjpjumas") .withWsfcDomainCredentials( new WsfcDomainCredentials() - .withClusterBootstrapAccountPassword("jpqyegu") - .withClusterOperatorAccountPassword("hb") - .withSqlServiceAccountPassword("hejjz")) + .withClusterBootstrapAccountPassword("fakeClusterBootstrapAccountPasswordPlaceholder") + .withClusterOperatorAccountPassword("fakeClusterOperatorAccountPasswordPlaceholder") + .withSqlServiceAccountPassword("fakeSqlServiceAccountPasswordPlaceholder")) .withWsfcStaticIp("dudgwdslfhot") .withAutoPatchingSettings( new AutoPatchingSettings() @@ -118,8 +121,8 @@ public void testSerialize() { .withRetentionPeriod(1625524147) .withStorageAccountUrl("dehxnltyfsoppu") .withStorageContainerName("esnzwde") - .withStorageAccessKey("avo") - .withPassword("zdmohctbqvu") + .withStorageAccessKey("fakeStorageAccessKeyPlaceholder") + .withPassword("fakeAutoBackupPasswordPlaceholder") .withBackupSystemDbs(false) .withBackupScheduleType(BackupScheduleType.MANUAL) .withFullBackupFrequency(FullBackupFrequencyType.WEEKLY) @@ -139,7 +142,7 @@ public void testSerialize() { .withCredentialName("slazjdyg") .withAzureKeyVaultUrl("tjixhbkuofqweyk") .withServicePrincipalName("enevfyexfwhybci") - .withServicePrincipalSecret("yvdcsitynnaa")) + .withServicePrincipalSecret("fakeSecretPlaceholder")) .withServerConfigurationsManagementSettings(new ServerConfigurationsManagementSettings()) .withStorageConfigurationSettings( new StorageConfigurationSettings() @@ -159,9 +162,12 @@ public void testSerialize() { Assertions.assertEquals(LeastPrivilegeMode.ENABLED, model.leastPrivilegeMode()); Assertions.assertEquals(SqlImageSku.EXPRESS, model.sqlImageSku()); Assertions.assertEquals("tgrhpdjpjumas", model.sqlVirtualMachineGroupResourceId()); - Assertions.assertEquals("jpqyegu", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); - Assertions.assertEquals("hb", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); - Assertions.assertEquals("hejjz", model.wsfcDomainCredentials().sqlServiceAccountPassword()); + Assertions.assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", + model.wsfcDomainCredentials().clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", + model.wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("dudgwdslfhot", model.wsfcStaticIp()); Assertions.assertEquals(false, model.autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.WEDNESDAY, model.autoPatchingSettings().dayOfWeek()); @@ -172,8 +178,8 @@ public void testSerialize() { Assertions.assertEquals(1625524147, model.autoBackupSettings().retentionPeriod()); Assertions.assertEquals("dehxnltyfsoppu", model.autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("esnzwde", model.autoBackupSettings().storageContainerName()); - Assertions.assertEquals("avo", model.autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("zdmohctbqvu", model.autoBackupSettings().password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", model.autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakeAutoBackupPasswordPlaceholder", model.autoBackupSettings().password()); Assertions.assertEquals(false, model.autoBackupSettings().backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.MANUAL, model.autoBackupSettings().backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.WEEKLY, model.autoBackupSettings().fullBackupFrequency()); @@ -185,7 +191,7 @@ public void testSerialize() { Assertions.assertEquals("slazjdyg", model.keyVaultCredentialSettings().credentialName()); Assertions.assertEquals("tjixhbkuofqweyk", model.keyVaultCredentialSettings().azureKeyVaultUrl()); Assertions.assertEquals("enevfyexfwhybci", model.keyVaultCredentialSettings().servicePrincipalName()); - Assertions.assertEquals("yvdcsitynnaa", model.keyVaultCredentialSettings().servicePrincipalSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", model.keyVaultCredentialSettings().servicePrincipalSecret()); Assertions.assertEquals(false, model.storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions .assertEquals(DiskConfigurationType.NEW, model.storageConfigurationSettings().diskConfigurationType()); diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinePropertiesTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinePropertiesTests.java index bd5d26446405..8a49abe0cd08 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinePropertiesTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinePropertiesTests.java @@ -44,7 +44,7 @@ public void testDeserialize() { SqlVirtualMachineProperties model = BinaryData .fromString( - "{\"virtualMachineResourceId\":\"myzydagfuaxbez\",\"provisioningState\":\"uokktwhrdxwz\",\"sqlImageOffer\":\"q\",\"sqlServerLicenseType\":\"DR\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Web\",\"sqlVirtualMachineGroupResourceId\":\"o\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"cfsf\",\"clusterOperatorAccountPassword\":\"ymddys\",\"sqlServiceAccountPassword\":\"i\"},\"wsfcStaticIp\":\"xhqyudxorrqnb\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Sunday\",\"maintenanceWindowStartingHour\":2041227856,\"maintenanceWindowDuration\":688230720},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":false,\"retentionPeriod\":711383541,\"storageAccountUrl\":\"rm\",\"storageContainerName\":\"d\",\"storageAccessKey\":\"atkpnp\",\"password\":\"exxbczwtr\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[\"Monday\",\"Tuesday\",\"Sunday\"],\"fullBackupStartTime\":79438477,\"fullBackupWindowHours\":1785940860,\"logBackupFrequency\":1882721753},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"lhzdobp\",\"azureKeyVaultUrl\":\"mflbv\",\"servicePrincipalName\":\"chrkcciwwzjuqk\",\"servicePrincipalSecret\":\"sa\"},\"serverConfigurationsManagementSettings\":{\"sqlConnectivityUpdateSettings\":{\"connectivityType\":\"PUBLIC\",\"port\":1163138760,\"sqlAuthUpdateUserName\":\"skghsauuimj\",\"sqlAuthUpdatePassword\":\"xieduugidyjrr\"},\"sqlWorkloadTypeUpdateSettings\":{\"sqlWorkloadType\":\"DW\"},\"sqlStorageUpdateSettings\":{\"diskCount\":93185233,\"startingDeviceId\":499062312,\"diskConfigurationType\":\"NEW\"},\"additionalFeaturesServerConfigurations\":{\"isRServicesEnabled\":true},\"sqlInstanceSettings\":{\"collation\":\"hocohslkev\",\"maxDop\":1452843037,\"isOptimizeForAdHocWorkloadsEnabled\":false,\"minServerMemoryMB\":1915206631,\"maxServerMemoryMB\":635098272,\"isLpimEnabled\":true,\"isIfiEnabled\":true}},\"storageConfigurationSettings\":{\"sqlDataSettings\":{\"luns\":[750094319,441262471],\"defaultFilePath\":\"ithlvmezyvshxm\"},\"sqlLogSettings\":{\"luns\":[2042967034,820071175,681165656],\"defaultFilePath\":\"igrxwburvjxxjn\"},\"sqlTempDbSettings\":{\"dataFileSize\":655244901,\"dataGrowth\":796522407,\"logFileSize\":1581089013,\"logGrowth\":1482419493,\"dataFileCount\":368872056,\"persistFolder\":true,\"persistFolderPath\":\"vudwtiukbldng\",\"luns\":[2138211196,1997522468,655680628],\"defaultFilePath\":\"z\"},\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"ADD\",\"storageWorkloadType\":\"OLTP\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true,\"schedule\":{\"enable\":false,\"weeklyInterval\":2112033193,\"monthlyOccurrence\":2000492920,\"dayOfWeek\":\"Sunday\",\"startTime\":\"typmrbpizcdrqjsd\"}},\"enableAutomaticUpgrade\":true}") + "{\"virtualMachineResourceId\":\"myzydagfuaxbez\",\"provisioningState\":\"uokktwhrdxwz\",\"sqlImageOffer\":\"q\",\"sqlServerLicenseType\":\"DR\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Web\",\"sqlVirtualMachineGroupResourceId\":\"o\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeBootstrapCredentialPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeOperatorCredentialPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"xhqyudxorrqnb\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Sunday\",\"maintenanceWindowStartingHour\":2041227856,\"maintenanceWindowDuration\":688230720},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":false,\"retentionPeriod\":711383541,\"storageAccountUrl\":\"rm\",\"storageContainerName\":\"d\",\"storageAccessKey\":\"fakeAutoBackupStorageCredentialPlaceholder\",\"password\":\"fakeAutoBackupCredentialPlaceholder\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[\"Monday\",\"Tuesday\",\"Sunday\"],\"fullBackupStartTime\":79438477,\"fullBackupWindowHours\":1785940860,\"logBackupFrequency\":1882721753},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"lhzdobp\",\"azureKeyVaultUrl\":\"mflbv\",\"servicePrincipalName\":\"chrkcciwwzjuqk\",\"servicePrincipalSecret\":\"fakeServicePrincipleSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{\"sqlConnectivityUpdateSettings\":{\"connectivityType\":\"PUBLIC\",\"port\":1163138760,\"sqlAuthUpdateUserName\":\"fakeSqlAuthUpdateUserNamePlaceholder\",\"sqlAuthUpdatePassword\":\"fakeSqlAuthUpdatePasswordPlaceholder\"},\"sqlWorkloadTypeUpdateSettings\":{\"sqlWorkloadType\":\"DW\"},\"sqlStorageUpdateSettings\":{\"diskCount\":93185233,\"startingDeviceId\":499062312,\"diskConfigurationType\":\"NEW\"},\"additionalFeaturesServerConfigurations\":{\"isRServicesEnabled\":true},\"sqlInstanceSettings\":{\"collation\":\"hocohslkev\",\"maxDop\":1452843037,\"isOptimizeForAdHocWorkloadsEnabled\":false,\"minServerMemoryMB\":1915206631,\"maxServerMemoryMB\":635098272,\"isLpimEnabled\":true,\"isIfiEnabled\":true}},\"storageConfigurationSettings\":{\"sqlDataSettings\":{\"luns\":[750094319,441262471],\"defaultFilePath\":\"ithlvmezyvshxm\"},\"sqlLogSettings\":{\"luns\":[2042967034,820071175,681165656],\"defaultFilePath\":\"igrxwburvjxxjn\"},\"sqlTempDbSettings\":{\"dataFileSize\":655244901,\"dataGrowth\":796522407,\"logFileSize\":1581089013,\"logGrowth\":1482419493,\"dataFileCount\":368872056,\"persistFolder\":true,\"persistFolderPath\":\"vudwtiukbldng\",\"luns\":[2138211196,1997522468,655680628],\"defaultFilePath\":\"z\"},\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"ADD\",\"storageWorkloadType\":\"OLTP\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true,\"schedule\":{\"enable\":false,\"weeklyInterval\":2112033193,\"monthlyOccurrence\":2000492920,\"dayOfWeek\":\"Sunday\",\"startTime\":\"typmrbpizcdrqjsd\"}},\"enableAutomaticUpgrade\":true}") .toObject(SqlVirtualMachineProperties.class); Assertions.assertEquals("myzydagfuaxbez", model.virtualMachineResourceId()); Assertions.assertEquals("q", model.sqlImageOffer()); @@ -53,9 +53,9 @@ public void testDeserialize() { Assertions.assertEquals(LeastPrivilegeMode.ENABLED, model.leastPrivilegeMode()); Assertions.assertEquals(SqlImageSku.WEB, model.sqlImageSku()); Assertions.assertEquals("o", model.sqlVirtualMachineGroupResourceId()); - Assertions.assertEquals("cfsf", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); - Assertions.assertEquals("ymddys", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); - Assertions.assertEquals("i", model.wsfcDomainCredentials().sqlServiceAccountPassword()); + Assertions.assertEquals("fakeBootstrapCredentialPlaceholder", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeOperatorCredentialPlaceholder", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", model.wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("xhqyudxorrqnb", model.wsfcStaticIp()); Assertions.assertEquals(true, model.autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.SUNDAY, model.autoPatchingSettings().dayOfWeek()); @@ -66,8 +66,8 @@ public void testDeserialize() { Assertions.assertEquals(711383541, model.autoBackupSettings().retentionPeriod()); Assertions.assertEquals("rm", model.autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("d", model.autoBackupSettings().storageContainerName()); - Assertions.assertEquals("atkpnp", model.autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("exxbczwtr", model.autoBackupSettings().password()); + Assertions.assertEquals("fakeAutoBackupStorageCredentialPlaceholder", model.autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakeAutoBackupCredentialPlaceholder", model.autoBackupSettings().password()); Assertions.assertEquals(false, model.autoBackupSettings().backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.MANUAL, model.autoBackupSettings().backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.WEEKLY, model.autoBackupSettings().fullBackupFrequency()); @@ -79,7 +79,7 @@ public void testDeserialize() { Assertions.assertEquals("lhzdobp", model.keyVaultCredentialSettings().credentialName()); Assertions.assertEquals("mflbv", model.keyVaultCredentialSettings().azureKeyVaultUrl()); Assertions.assertEquals("chrkcciwwzjuqk", model.keyVaultCredentialSettings().servicePrincipalName()); - Assertions.assertEquals("sa", model.keyVaultCredentialSettings().servicePrincipalSecret()); + Assertions.assertEquals("fakeServicePrincipleSecretPlaceholder", model.keyVaultCredentialSettings().servicePrincipalSecret()); Assertions .assertEquals( ConnectivityType.PUBLIC, @@ -89,11 +89,11 @@ public void testDeserialize() { 1163138760, model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().port()); Assertions .assertEquals( - "skghsauuimj", + "fakeSqlAuthUpdateUserNamePlaceholder", model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); Assertions .assertEquals( - "xieduugidyjrr", + "fakeSqlAuthUpdatePasswordPlaceholder", model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); Assertions .assertEquals( @@ -183,9 +183,9 @@ public void testSerialize() { .withSqlVirtualMachineGroupResourceId("o") .withWsfcDomainCredentials( new WsfcDomainCredentials() - .withClusterBootstrapAccountPassword("cfsf") - .withClusterOperatorAccountPassword("ymddys") - .withSqlServiceAccountPassword("i")) + .withClusterBootstrapAccountPassword("fakeBootstrapCredentialPlaceholder") + .withClusterOperatorAccountPassword("fakeOperatorCredentialPlaceholder") + .withSqlServiceAccountPassword("fakeSqlServiceAccountPasswordPlaceholder")) .withWsfcStaticIp("xhqyudxorrqnb") .withAutoPatchingSettings( new AutoPatchingSettings() @@ -200,8 +200,8 @@ public void testSerialize() { .withRetentionPeriod(711383541) .withStorageAccountUrl("rm") .withStorageContainerName("d") - .withStorageAccessKey("atkpnp") - .withPassword("exxbczwtr") + .withStorageAccessKey("fakeAutoBackupStorageCredentialPlaceholder") + .withPassword("fakeAutoBackupCredentialPlaceholder") .withBackupSystemDbs(false) .withBackupScheduleType(BackupScheduleType.MANUAL) .withFullBackupFrequency(FullBackupFrequencyType.WEEKLY) @@ -220,15 +220,15 @@ public void testSerialize() { .withCredentialName("lhzdobp") .withAzureKeyVaultUrl("mflbv") .withServicePrincipalName("chrkcciwwzjuqk") - .withServicePrincipalSecret("sa")) + .withServicePrincipalSecret("fakeServicePrincipleSecretPlaceholder")) .withServerConfigurationsManagementSettings( new ServerConfigurationsManagementSettings() .withSqlConnectivityUpdateSettings( new SqlConnectivityUpdateSettings() .withConnectivityType(ConnectivityType.PUBLIC) .withPort(1163138760) - .withSqlAuthUpdateUsername("skghsauuimj") - .withSqlAuthUpdatePassword("xieduugidyjrr")) + .withSqlAuthUpdateUsername("fakeSqlAuthUpdateUserNamePlaceholder") + .withSqlAuthUpdatePassword("fakeSqlAuthUpdatePasswordPlaceholder")) .withSqlWorkloadTypeUpdateSettings( new SqlWorkloadTypeUpdateSettings().withSqlWorkloadType(SqlWorkloadType.DW)) .withSqlStorageUpdateSettings( @@ -291,9 +291,9 @@ public void testSerialize() { Assertions.assertEquals(LeastPrivilegeMode.ENABLED, model.leastPrivilegeMode()); Assertions.assertEquals(SqlImageSku.WEB, model.sqlImageSku()); Assertions.assertEquals("o", model.sqlVirtualMachineGroupResourceId()); - Assertions.assertEquals("cfsf", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); - Assertions.assertEquals("ymddys", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); - Assertions.assertEquals("i", model.wsfcDomainCredentials().sqlServiceAccountPassword()); + Assertions.assertEquals("fakeBootstrapCredentialPlaceholder", model.wsfcDomainCredentials().clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeOperatorCredentialPlaceholder", model.wsfcDomainCredentials().clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", model.wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("xhqyudxorrqnb", model.wsfcStaticIp()); Assertions.assertEquals(true, model.autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.SUNDAY, model.autoPatchingSettings().dayOfWeek()); @@ -304,8 +304,8 @@ public void testSerialize() { Assertions.assertEquals(711383541, model.autoBackupSettings().retentionPeriod()); Assertions.assertEquals("rm", model.autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("d", model.autoBackupSettings().storageContainerName()); - Assertions.assertEquals("atkpnp", model.autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("exxbczwtr", model.autoBackupSettings().password()); + Assertions.assertEquals("fakeAutoBackupStorageCredentialPlaceholder", model.autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakeAutoBackupCredentialPlaceholder", model.autoBackupSettings().password()); Assertions.assertEquals(false, model.autoBackupSettings().backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.MANUAL, model.autoBackupSettings().backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.WEEKLY, model.autoBackupSettings().fullBackupFrequency()); @@ -317,7 +317,7 @@ public void testSerialize() { Assertions.assertEquals("lhzdobp", model.keyVaultCredentialSettings().credentialName()); Assertions.assertEquals("mflbv", model.keyVaultCredentialSettings().azureKeyVaultUrl()); Assertions.assertEquals("chrkcciwwzjuqk", model.keyVaultCredentialSettings().servicePrincipalName()); - Assertions.assertEquals("sa", model.keyVaultCredentialSettings().servicePrincipalSecret()); + Assertions.assertEquals("fakeServicePrincipleSecretPlaceholder", model.keyVaultCredentialSettings().servicePrincipalSecret()); Assertions .assertEquals( ConnectivityType.PUBLIC, @@ -327,11 +327,11 @@ public void testSerialize() { 1163138760, model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().port()); Assertions .assertEquals( - "skghsauuimj", + "fakeSqlAuthUpdateUserNamePlaceholder", model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().sqlAuthUpdateUsername()); Assertions .assertEquals( - "xieduugidyjrr", + "fakeSqlAuthUpdatePasswordPlaceholder", model.serverConfigurationsManagementSettings().sqlConnectivityUpdateSettings().sqlAuthUpdatePassword()); Assertions .assertEquals( diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesCreateOrUpdateTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesCreateOrUpdateTests.java index dab007eebea5..9532bebb7600 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesCreateOrUpdateTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesCreateOrUpdateTests.java @@ -52,7 +52,7 @@ public void testCreateOrUpdate() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"y\",\"provisioningState\":\"Succeeded\",\"sqlImageOffer\":\"dvstkw\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Web\",\"sqlVirtualMachineGroupResourceId\":\"mtdaa\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"v\",\"clusterOperatorAccountPassword\":\"gpiohgwxrtfudxe\",\"sqlServiceAccountPassword\":\"gyqagvrvmnpkuk\"},\"wsfcStaticIp\":\"i\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Tuesday\",\"maintenanceWindowStartingHour\":261614569,\"maintenanceWindowDuration\":1772217773},\"autoBackupSettings\":{\"enable\":false,\"enableEncryption\":false,\"retentionPeriod\":1453079674,\"storageAccountUrl\":\"szkkfoqre\",\"storageContainerName\":\"kzikfjawneaivxwc\",\"storageAccessKey\":\"lpcirelsf\",\"password\":\"enwabfatk\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[],\"fullBackupStartTime\":1879278925,\"fullBackupWindowHours\":883019177,\"logBackupFrequency\":1246118617},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"hyoulpjr\",\"azureKeyVaultUrl\":\"ag\",\"servicePrincipalName\":\"vimjwos\",\"servicePrincipalSecret\":\"xitc\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"EXTEND\",\"storageWorkloadType\":\"GENERAL\"},\"assessmentSettings\":{\"enable\":false,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"qgge\",\"tags\":{\"qidbqfatpxllrxcy\":\"nyga\",\"dmjsjqb\":\"moadsuvarmy\",\"yc\":\"hhyxxrw\"},\"id\":\"duhpk\",\"name\":\"kgymareqnajxqug\",\"type\":\"hky\"}"; + "{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"y\",\"provisioningState\":\"Succeeded\",\"sqlImageOffer\":\"dvstkw\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Web\",\"sqlVirtualMachineGroupResourceId\":\"mtdaa\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"i\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Tuesday\",\"maintenanceWindowStartingHour\":261614569,\"maintenanceWindowDuration\":1772217773},\"autoBackupSettings\":{\"enable\":false,\"enableEncryption\":false,\"retentionPeriod\":1453079674,\"storageAccountUrl\":\"szkkfoqre\",\"storageContainerName\":\"kzikfjawneaivxwc\",\"storageAccessKey\":\"fakeAutoBackupStorageAccessKeyPlaceholder\",\"password\":\"fakeAutoBackupPasswordPlaceholder\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[],\"fullBackupStartTime\":1879278925,\"fullBackupWindowHours\":883019177,\"logBackupFrequency\":1246118617},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"hyoulpjr\",\"azureKeyVaultUrl\":\"ag\",\"servicePrincipalName\":\"vimjwos\",\"servicePrincipalSecret\":\"fakeSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"EXTEND\",\"storageWorkloadType\":\"GENERAL\"},\"assessmentSettings\":{\"enable\":false,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"qgge\",\"tags\":{\"qidbqfatpxllrxcy\":\"nyga\",\"dmjsjqb\":\"moadsuvarmy\",\"yc\":\"hhyxxrw\"},\"id\":\"duhpk\",\"name\":\"kgymareqnajxqug\",\"type\":\"hky\"}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -96,9 +96,9 @@ public void testCreateOrUpdate() throws Exception { .withSqlImageSku(SqlImageSku.ENTERPRISE) .withWsfcDomainCredentials( new WsfcDomainCredentials() - .withClusterBootstrapAccountPassword("ibwwiftohqkv") - .withClusterOperatorAccountPassword("vksgplsaknynfsy") - .withSqlServiceAccountPassword("jphuopxodlqi")) + .withClusterBootstrapAccountPassword("fakeClusterBootstrapAccountPasswordPlaceholder") + .withClusterOperatorAccountPassword("fakeClusterOperatorAccountPasswordPlaceholder") + .withSqlServiceAccountPassword("fakeSqlServiceAccountPasswordPlaceholder")) .withWsfcStaticIp("torzih") .withAutoPatchingSettings( new AutoPatchingSettings() @@ -113,8 +113,8 @@ public void testCreateOrUpdate() throws Exception { .withRetentionPeriod(1849555195) .withStorageAccountUrl("c") .withStorageContainerName("kqqzqioxiysu") - .withStorageAccessKey("zynkedya") - .withPassword("wyhqmibzyhwits") + .withStorageAccessKey("fakeStorageCredentialPlaceholder") + .withPassword("fakePasswordPlaceholder") .withBackupSystemDbs(false) .withBackupScheduleType(BackupScheduleType.AUTOMATED) .withFullBackupFrequency(FullBackupFrequencyType.DAILY) @@ -149,9 +149,12 @@ public void testCreateOrUpdate() throws Exception { Assertions.assertEquals(LeastPrivilegeMode.ENABLED, response.leastPrivilegeMode()); Assertions.assertEquals(SqlImageSku.WEB, response.sqlImageSku()); Assertions.assertEquals("mtdaa", response.sqlVirtualMachineGroupResourceId()); - Assertions.assertEquals("v", response.wsfcDomainCredentials().clusterBootstrapAccountPassword()); - Assertions.assertEquals("gpiohgwxrtfudxe", response.wsfcDomainCredentials().clusterOperatorAccountPassword()); - Assertions.assertEquals("gyqagvrvmnpkuk", response.wsfcDomainCredentials().sqlServiceAccountPassword()); + Assertions.assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + response.wsfcDomainCredentials().clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeOperatorAccountPasswordPlaceholder", + response.wsfcDomainCredentials().clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", + response.wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("i", response.wsfcStaticIp()); Assertions.assertEquals(true, response.autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.TUESDAY, response.autoPatchingSettings().dayOfWeek()); @@ -162,8 +165,9 @@ public void testCreateOrUpdate() throws Exception { Assertions.assertEquals(1453079674, response.autoBackupSettings().retentionPeriod()); Assertions.assertEquals("szkkfoqre", response.autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("kzikfjawneaivxwc", response.autoBackupSettings().storageContainerName()); - Assertions.assertEquals("lpcirelsf", response.autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("enwabfatk", response.autoBackupSettings().password()); + Assertions.assertEquals("fakeAutoBackupStorageAccessKeyPlaceholder", + response.autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakeAutoBackupPasswordPlaceholder", response.autoBackupSettings().password()); Assertions.assertEquals(true, response.autoBackupSettings().backupSystemDbs()); Assertions.assertEquals(BackupScheduleType.MANUAL, response.autoBackupSettings().backupScheduleType()); Assertions.assertEquals(FullBackupFrequencyType.WEEKLY, response.autoBackupSettings().fullBackupFrequency()); @@ -174,7 +178,7 @@ public void testCreateOrUpdate() throws Exception { Assertions.assertEquals("hyoulpjr", response.keyVaultCredentialSettings().credentialName()); Assertions.assertEquals("ag", response.keyVaultCredentialSettings().azureKeyVaultUrl()); Assertions.assertEquals("vimjwos", response.keyVaultCredentialSettings().servicePrincipalName()); - Assertions.assertEquals("xitc", response.keyVaultCredentialSettings().servicePrincipalSecret()); + Assertions.assertEquals("fakeSecretPlaceholder", response.keyVaultCredentialSettings().servicePrincipalSecret()); Assertions.assertEquals(false, response.storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions .assertEquals( diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListByResourceGroupTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListByResourceGroupTests.java index 099785795d79..0931ce2d638a 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListByResourceGroupTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListByResourceGroupTests.java @@ -43,7 +43,7 @@ public void testListByResourceGroup() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"odsotbobzdop\",\"provisioningState\":\"wvnhdldwmgx\",\"sqlImageOffer\":\"rslpmutwuoeg\",\"sqlServerLicenseType\":\"AHUB\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Developer\",\"sqlVirtualMachineGroupResourceId\":\"sluicpdggkzz\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"bmpaxmodfvu\",\"clusterOperatorAccountPassword\":\"yw\",\"sqlServiceAccountPassword\":\"pfvmwyhrfou\"},\"wsfcStaticIp\":\"taakc\",\"autoPatchingSettings\":{\"enable\":false,\"dayOfWeek\":\"Wednesday\",\"maintenanceWindowStartingHour\":1814420357,\"maintenanceWindowDuration\":1349275484},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":true,\"retentionPeriod\":1989438546,\"storageAccountUrl\":\"smond\",\"storageContainerName\":\"quxvypomgkop\",\"storageAccessKey\":\"hojvpajqgxysmocm\",\"password\":\"fqvm\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[],\"fullBackupStartTime\":1382848835,\"fullBackupWindowHours\":760338850,\"logBackupFrequency\":1009044014},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"tddckcb\",\"azureKeyVaultUrl\":\"ejrjxgciqibrho\",\"servicePrincipalName\":\"sdqrhzoymibmrq\",\"servicePrincipalSecret\":\"bahwfl\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"NEW\",\"storageWorkloadType\":\"OLTP\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"giwbwoenwa\",\"tags\":{\"xwbpokulpiuj\":\"tdtkcn\",\"obyu\":\"aasipqi\",\"dbutauvfbtkuwhh\":\"erpqlpqwcciuqg\"},\"id\":\"hykojoxafnndlpic\",\"name\":\"koymkcd\",\"type\":\"h\"}]}"; + "{\"value\":[{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"odsotbobzdop\",\"provisioningState\":\"wvnhdldwmgx\",\"sqlImageOffer\":\"rslpmutwuoeg\",\"sqlServerLicenseType\":\"AHUB\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Developer\",\"sqlVirtualMachineGroupResourceId\":\"sluicpdggkzz\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeClusterOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"taakc\",\"autoPatchingSettings\":{\"enable\":false,\"dayOfWeek\":\"Wednesday\",\"maintenanceWindowStartingHour\":1814420357,\"maintenanceWindowDuration\":1349275484},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":true,\"retentionPeriod\":1989438546,\"storageAccountUrl\":\"smond\",\"storageContainerName\":\"quxvypomgkop\",\"storageAccessKey\":\"fakeStorageAccessKeyPlaceholder\",\"password\":\"fakePasswordPlaceholder\",\"backupSystemDbs\":false,\"backupScheduleType\":\"Manual\",\"fullBackupFrequency\":\"Weekly\",\"daysOfWeek\":[],\"fullBackupStartTime\":1382848835,\"fullBackupWindowHours\":760338850,\"logBackupFrequency\":1009044014},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"tddckcb\",\"azureKeyVaultUrl\":\"ejrjxgciqibrho\",\"servicePrincipalName\":\"sdqrhzoymibmrq\",\"servicePrincipalSecret\":\"fakeSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"NEW\",\"storageWorkloadType\":\"OLTP\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"giwbwoenwa\",\"tags\":{\"xwbpokulpiuj\":\"tdtkcn\",\"obyu\":\"aasipqi\",\"dbutauvfbtkuwhh\":\"erpqlpqwcciuqg\"},\"id\":\"hykojoxafnndlpic\",\"name\":\"koymkcd\",\"type\":\"h\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -85,13 +85,14 @@ public void testListByResourceGroup() throws Exception { Assertions.assertEquals(SqlImageSku.DEVELOPER, response.iterator().next().sqlImageSku()); Assertions.assertEquals("sluicpdggkzz", response.iterator().next().sqlVirtualMachineGroupResourceId()); Assertions - .assertEquals( - "bmpaxmodfvu", response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); + .assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); Assertions - .assertEquals("yw", response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); + .assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", + response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); Assertions .assertEquals( - "pfvmwyhrfou", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); + "fakeSqlServiceAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("taakc", response.iterator().next().wsfcStaticIp()); Assertions.assertEquals(false, response.iterator().next().autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.WEDNESDAY, response.iterator().next().autoPatchingSettings().dayOfWeek()); @@ -105,8 +106,8 @@ public void testListByResourceGroup() throws Exception { Assertions.assertEquals(1989438546, response.iterator().next().autoBackupSettings().retentionPeriod()); Assertions.assertEquals("smond", response.iterator().next().autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("quxvypomgkop", response.iterator().next().autoBackupSettings().storageContainerName()); - Assertions.assertEquals("hojvpajqgxysmocm", response.iterator().next().autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("fqvm", response.iterator().next().autoBackupSettings().password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", response.iterator().next().autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakePasswordPlaceholder", response.iterator().next().autoBackupSettings().password()); Assertions.assertEquals(false, response.iterator().next().autoBackupSettings().backupSystemDbs()); Assertions .assertEquals( @@ -125,7 +126,7 @@ public void testListByResourceGroup() throws Exception { .assertEquals( "sdqrhzoymibmrq", response.iterator().next().keyVaultCredentialSettings().servicePrincipalName()); Assertions - .assertEquals("bahwfl", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); + .assertEquals("fakeSecretPlaceholder", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); Assertions .assertEquals(false, response.iterator().next().storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListBySqlVmGroupTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListBySqlVmGroupTests.java index 7c36a14d7c0f..a3a2457bb598 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListBySqlVmGroupTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListBySqlVmGroupTests.java @@ -43,7 +43,7 @@ public void testListBySqlVmGroup() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"identity\":{\"type\":\"SystemAssigned\"},\"properties\":{\"virtualMachineResourceId\":\"vkr\",\"provisioningState\":\"wbxqzvszjfau\",\"sqlImageOffer\":\"fdxxivetvtcqaqtd\",\"sqlServerLicenseType\":\"DR\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Developer\",\"sqlVirtualMachineGroupResourceId\":\"yslqbhsfx\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"ytkblmpew\",\"clusterOperatorAccountPassword\":\"fbkrvrnsvs\",\"sqlServiceAccountPassword\":\"johxcrsb\"},\"wsfcStaticIp\":\"vasrruvwb\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Thursday\",\"maintenanceWindowStartingHour\":213257698,\"maintenanceWindowDuration\":540005244},\"autoBackupSettings\":{\"enable\":false,\"enableEncryption\":true,\"retentionPeriod\":1282258802,\"storageAccountUrl\":\"srfbjfdtwss\",\"storageContainerName\":\"ftpvjzbexil\",\"storageAccessKey\":\"nfqqnvwp\",\"password\":\"taruoujmkcj\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[],\"fullBackupStartTime\":151199466,\"fullBackupWindowHours\":395045632,\"logBackupFrequency\":1463995661},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"ervnaenqpehi\",\"azureKeyVaultUrl\":\"oygmift\",\"servicePrincipalName\":\"zdnds\",\"servicePrincipalSecret\":\"nayqi\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"EXTEND\",\"storageWorkloadType\":\"DW\"},\"assessmentSettings\":{\"enable\":false,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"iertgccymvaolp\",\"tags\":{\"lzpswiydm\":\"qlfmmdnbb\",\"sadbz\":\"wyhzdx\"},\"id\":\"nvdfznuda\",\"name\":\"dvxzbncblylpst\",\"type\":\"bhhxsrzdzuc\"}]}"; + "{\"value\":[{\"identity\":{\"type\":\"SystemAssigned\"},\"properties\":{\"virtualMachineResourceId\":\"vkr\",\"provisioningState\":\"wbxqzvszjfau\",\"sqlImageOffer\":\"fdxxivetvtcqaqtd\",\"sqlServerLicenseType\":\"DR\",\"sqlManagement\":\"LightWeight\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Developer\",\"sqlVirtualMachineGroupResourceId\":\"yslqbhsfx\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeClusterOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"vasrruvwb\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Thursday\",\"maintenanceWindowStartingHour\":213257698,\"maintenanceWindowDuration\":540005244},\"autoBackupSettings\":{\"enable\":false,\"enableEncryption\":true,\"retentionPeriod\":1282258802,\"storageAccountUrl\":\"srfbjfdtwss\",\"storageContainerName\":\"ftpvjzbexil\",\"storageAccessKey\":\"fakeStorageAccessKeyPlaceholder\",\"password\":\"fakePasswordPlaceholder\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[],\"fullBackupStartTime\":151199466,\"fullBackupWindowHours\":395045632,\"logBackupFrequency\":1463995661},\"keyVaultCredentialSettings\":{\"enable\":false,\"credentialName\":\"ervnaenqpehi\",\"azureKeyVaultUrl\":\"oygmift\",\"servicePrincipalName\":\"zdnds\",\"servicePrincipalSecret\":\"fakeSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"EXTEND\",\"storageWorkloadType\":\"DW\"},\"assessmentSettings\":{\"enable\":false,\"runImmediately\":false},\"enableAutomaticUpgrade\":true},\"location\":\"iertgccymvaolp\",\"tags\":{\"lzpswiydm\":\"qlfmmdnbb\",\"sadbz\":\"wyhzdx\"},\"id\":\"nvdfznuda\",\"name\":\"dvxzbncblylpst\",\"type\":\"bhhxsrzdzuc\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -86,12 +86,12 @@ public void testListBySqlVmGroup() throws Exception { Assertions.assertEquals("yslqbhsfx", response.iterator().next().sqlVirtualMachineGroupResourceId()); Assertions .assertEquals( - "ytkblmpew", response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); + "fakeClusterBootstrapAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); Assertions .assertEquals( - "fbkrvrnsvs", response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); + "fakeClusterOperatorAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); Assertions - .assertEquals("johxcrsb", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); + .assertEquals("fakeSqlServiceAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("vasrruvwb", response.iterator().next().wsfcStaticIp()); Assertions.assertEquals(true, response.iterator().next().autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.THURSDAY, response.iterator().next().autoPatchingSettings().dayOfWeek()); @@ -104,8 +104,8 @@ public void testListBySqlVmGroup() throws Exception { Assertions.assertEquals(1282258802, response.iterator().next().autoBackupSettings().retentionPeriod()); Assertions.assertEquals("srfbjfdtwss", response.iterator().next().autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("ftpvjzbexil", response.iterator().next().autoBackupSettings().storageContainerName()); - Assertions.assertEquals("nfqqnvwp", response.iterator().next().autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("taruoujmkcj", response.iterator().next().autoBackupSettings().password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", response.iterator().next().autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakePasswordPlaceholder", response.iterator().next().autoBackupSettings().password()); Assertions.assertEquals(true, response.iterator().next().autoBackupSettings().backupSystemDbs()); Assertions .assertEquals( @@ -123,7 +123,7 @@ public void testListBySqlVmGroup() throws Exception { Assertions .assertEquals("zdnds", response.iterator().next().keyVaultCredentialSettings().servicePrincipalName()); Assertions - .assertEquals("nayqi", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); + .assertEquals("fakeSecretPlaceholder", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); Assertions .assertEquals(false, response.iterator().next().storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListTests.java index 1a15e904458c..ab45750d2c3f 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/SqlVirtualMachinesListTests.java @@ -43,7 +43,7 @@ public void testList() throws Exception { ArgumentCaptor httpRequest = ArgumentCaptor.forClass(HttpRequest.class); String responseStr = - "{\"value\":[{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"evfiwjmygt\",\"provisioningState\":\"slswtm\",\"sqlImageOffer\":\"riofzpyqse\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"Full\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Enterprise\",\"sqlVirtualMachineGroupResourceId\":\"szhedplvw\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"bmwmbesldnkw\",\"clusterOperatorAccountPassword\":\"pp\",\"sqlServiceAccountPassword\":\"lcxog\"},\"wsfcStaticIp\":\"konzmnsik\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Friday\",\"maintenanceWindowStartingHour\":1625673068,\"maintenanceWindowDuration\":1175665004},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":true,\"retentionPeriod\":992785532,\"storageAccountUrl\":\"v\",\"storageContainerName\":\"ur\",\"storageAccessKey\":\"dkwobdagx\",\"password\":\"bqdxbx\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[],\"fullBackupStartTime\":442330150,\"fullBackupWindowHours\":90744470,\"logBackupFrequency\":299284831},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"iplbpodxunkbebxm\",\"azureKeyVaultUrl\":\"yyntwl\",\"servicePrincipalName\":\"qtkoievs\",\"servicePrincipalSecret\":\"tgqr\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"ADD\",\"storageWorkloadType\":\"GENERAL\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true},\"enableAutomaticUpgrade\":false},\"location\":\"vpbttd\",\"tags\":{\"xe\":\"rp\",\"bhjpglkfgohdne\":\"mnzb\",\"phsdyhto\":\"el\",\"v\":\"fikdowwqu\"},\"id\":\"zx\",\"name\":\"lvithhqzonosgg\",\"type\":\"hcohfwdsjnk\"}]}"; + "{\"value\":[{\"identity\":{\"type\":\"None\"},\"properties\":{\"virtualMachineResourceId\":\"evfiwjmygt\",\"provisioningState\":\"slswtm\",\"sqlImageOffer\":\"riofzpyqse\",\"sqlServerLicenseType\":\"PAYG\",\"sqlManagement\":\"Full\",\"leastPrivilegeMode\":\"Enabled\",\"sqlImageSku\":\"Enterprise\",\"sqlVirtualMachineGroupResourceId\":\"szhedplvw\",\"wsfcDomainCredentials\":{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeClusterOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"},\"wsfcStaticIp\":\"konzmnsik\",\"autoPatchingSettings\":{\"enable\":true,\"dayOfWeek\":\"Friday\",\"maintenanceWindowStartingHour\":1625673068,\"maintenanceWindowDuration\":1175665004},\"autoBackupSettings\":{\"enable\":true,\"enableEncryption\":true,\"retentionPeriod\":992785532,\"storageAccountUrl\":\"v\",\"storageContainerName\":\"ur\",\"storageAccessKey\":\"fakeStorageAccessKeyPlaceholder\",\"password\":\"fakePasswordPlaceholder\",\"backupSystemDbs\":true,\"backupScheduleType\":\"Automated\",\"fullBackupFrequency\":\"Daily\",\"daysOfWeek\":[],\"fullBackupStartTime\":442330150,\"fullBackupWindowHours\":90744470,\"logBackupFrequency\":299284831},\"keyVaultCredentialSettings\":{\"enable\":true,\"credentialName\":\"iplbpodxunkbebxm\",\"azureKeyVaultUrl\":\"yyntwl\",\"servicePrincipalName\":\"qtkoievs\",\"servicePrincipalSecret\":\"fakeSecretPlaceholder\"},\"serverConfigurationsManagementSettings\":{},\"storageConfigurationSettings\":{\"sqlSystemDbOnDataDisk\":false,\"diskConfigurationType\":\"ADD\",\"storageWorkloadType\":\"GENERAL\"},\"assessmentSettings\":{\"enable\":true,\"runImmediately\":true},\"enableAutomaticUpgrade\":false},\"location\":\"vpbttd\",\"tags\":{\"xe\":\"rp\",\"bhjpglkfgohdne\":\"mnzb\",\"phsdyhto\":\"el\",\"v\":\"fikdowwqu\"},\"id\":\"zx\",\"name\":\"lvithhqzonosgg\",\"type\":\"hcohfwdsjnk\"}]}"; Mockito.when(httpResponse.getStatusCode()).thenReturn(200); Mockito.when(httpResponse.getHeaders()).thenReturn(new HttpHeaders()); @@ -85,11 +85,11 @@ public void testList() throws Exception { Assertions.assertEquals("szhedplvw", response.iterator().next().sqlVirtualMachineGroupResourceId()); Assertions .assertEquals( - "bmwmbesldnkw", response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); + "fakeClusterBootstrapAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().clusterBootstrapAccountPassword()); Assertions - .assertEquals("pp", response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); + .assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().clusterOperatorAccountPassword()); Assertions - .assertEquals("lcxog", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); + .assertEquals("fakeSqlServiceAccountPasswordPlaceholder", response.iterator().next().wsfcDomainCredentials().sqlServiceAccountPassword()); Assertions.assertEquals("konzmnsik", response.iterator().next().wsfcStaticIp()); Assertions.assertEquals(true, response.iterator().next().autoPatchingSettings().enable()); Assertions.assertEquals(DayOfWeek.FRIDAY, response.iterator().next().autoPatchingSettings().dayOfWeek()); @@ -103,8 +103,8 @@ public void testList() throws Exception { Assertions.assertEquals(992785532, response.iterator().next().autoBackupSettings().retentionPeriod()); Assertions.assertEquals("v", response.iterator().next().autoBackupSettings().storageAccountUrl()); Assertions.assertEquals("ur", response.iterator().next().autoBackupSettings().storageContainerName()); - Assertions.assertEquals("dkwobdagx", response.iterator().next().autoBackupSettings().storageAccessKey()); - Assertions.assertEquals("bqdxbx", response.iterator().next().autoBackupSettings().password()); + Assertions.assertEquals("fakeStorageAccessKeyPlaceholder", response.iterator().next().autoBackupSettings().storageAccessKey()); + Assertions.assertEquals("fakePasswordPlaceholder", response.iterator().next().autoBackupSettings().password()); Assertions.assertEquals(true, response.iterator().next().autoBackupSettings().backupSystemDbs()); Assertions .assertEquals( @@ -122,7 +122,7 @@ public void testList() throws Exception { Assertions .assertEquals("qtkoievs", response.iterator().next().keyVaultCredentialSettings().servicePrincipalName()); Assertions - .assertEquals("tgqr", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); + .assertEquals("fakeSecretPlaceholder", response.iterator().next().keyVaultCredentialSettings().servicePrincipalSecret()); Assertions .assertEquals(false, response.iterator().next().storageConfigurationSettings().sqlSystemDbOnDataDisk()); Assertions diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainCredentialsTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainCredentialsTests.java index 38bfb5323c94..3d9c0d553b45 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainCredentialsTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainCredentialsTests.java @@ -15,23 +15,27 @@ public void testDeserialize() { WsfcDomainCredentials model = BinaryData .fromString( - "{\"clusterBootstrapAccountPassword\":\"fyhxde\",\"clusterOperatorAccountPassword\":\"jzicwifsjt\",\"sqlServiceAccountPassword\":\"zfbishcbkhaj\"}") + "{\"clusterBootstrapAccountPassword\":\"fakeClusterBootstrapAccountPasswordPlaceholder\",\"clusterOperatorAccountPassword\":\"fakeClusterOperatorAccountPasswordPlaceholder\",\"sqlServiceAccountPassword\":\"fakeSqlServiceAccountPasswordPlaceholder\"}") .toObject(WsfcDomainCredentials.class); - Assertions.assertEquals("fyhxde", model.clusterBootstrapAccountPassword()); - Assertions.assertEquals("jzicwifsjt", model.clusterOperatorAccountPassword()); - Assertions.assertEquals("zfbishcbkhaj", model.sqlServiceAccountPassword()); + Assertions.assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + model.clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", + model.clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", model.sqlServiceAccountPassword()); } @Test public void testSerialize() { WsfcDomainCredentials model = new WsfcDomainCredentials() - .withClusterBootstrapAccountPassword("fyhxde") - .withClusterOperatorAccountPassword("jzicwifsjt") - .withSqlServiceAccountPassword("zfbishcbkhaj"); + .withClusterBootstrapAccountPassword("fakeClusterBootstrapAccountPasswordPlaceholder") + .withClusterOperatorAccountPassword("fakeClusterOperatorAccountPasswordPlaceholder") + .withSqlServiceAccountPassword("fakeSqlServiceAccountPasswordPlaceholder"); model = BinaryData.fromObject(model).toObject(WsfcDomainCredentials.class); - Assertions.assertEquals("fyhxde", model.clusterBootstrapAccountPassword()); - Assertions.assertEquals("jzicwifsjt", model.clusterOperatorAccountPassword()); - Assertions.assertEquals("zfbishcbkhaj", model.sqlServiceAccountPassword()); + Assertions.assertEquals("fakeClusterBootstrapAccountPasswordPlaceholder", + model.clusterBootstrapAccountPassword()); + Assertions.assertEquals("fakeClusterOperatorAccountPasswordPlaceholder", + model.clusterOperatorAccountPassword()); + Assertions.assertEquals("fakeSqlServiceAccountPasswordPlaceholder", model.sqlServiceAccountPassword()); } } diff --git a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainProfileTests.java b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainProfileTests.java index 94fe34cac0c8..aff8194db34a 100644 --- a/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainProfileTests.java +++ b/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/src/test/java/com/azure/resourcemanager/sqlvirtualmachine/generated/WsfcDomainProfileTests.java @@ -16,16 +16,16 @@ public void testDeserialize() { WsfcDomainProfile model = BinaryData .fromString( - "{\"domainFqdn\":\"z\",\"ouPath\":\"iachbo\",\"clusterBootstrapAccount\":\"flnrosfqpteehzz\",\"clusterOperatorAccount\":\"pyqr\",\"sqlServiceAccount\":\"z\",\"fileShareWitnessPath\":\"pvswjdkirso\",\"storageAccountUrl\":\"qxhcrmn\",\"storageAccountPrimaryKey\":\"jtckwhdso\",\"clusterSubnetType\":\"SingleSubnet\"}") + "{\"domainFqdn\":\"z\",\"ouPath\":\"iachbo\",\"clusterBootstrapAccount\":\"fakeClusterBootstrapAccountPlaceholder\",\"clusterOperatorAccount\":\"pyqr\",\"sqlServiceAccount\":\"z\",\"fileShareWitnessPath\":\"pvswjdkirso\",\"storageAccountUrl\":\"qxhcrmn\",\"storageAccountPrimaryKey\":\"fakeStorageAccountPrimaryKeyPlaceholder\",\"clusterSubnetType\":\"SingleSubnet\"}") .toObject(WsfcDomainProfile.class); Assertions.assertEquals("z", model.domainFqdn()); Assertions.assertEquals("iachbo", model.ouPath()); - Assertions.assertEquals("flnrosfqpteehzz", model.clusterBootstrapAccount()); + Assertions.assertEquals("fakeClusterBootstrapAccountPlaceholder", model.clusterBootstrapAccount()); Assertions.assertEquals("pyqr", model.clusterOperatorAccount()); Assertions.assertEquals("z", model.sqlServiceAccount()); Assertions.assertEquals("pvswjdkirso", model.fileShareWitnessPath()); Assertions.assertEquals("qxhcrmn", model.storageAccountUrl()); - Assertions.assertEquals("jtckwhdso", model.storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", model.storageAccountPrimaryKey()); Assertions.assertEquals(ClusterSubnetType.SINGLE_SUBNET, model.clusterSubnetType()); } @@ -35,22 +35,22 @@ public void testSerialize() { new WsfcDomainProfile() .withDomainFqdn("z") .withOuPath("iachbo") - .withClusterBootstrapAccount("flnrosfqpteehzz") + .withClusterBootstrapAccount("fakeClusterBootstrapAccountPlaceholder") .withClusterOperatorAccount("pyqr") .withSqlServiceAccount("z") .withFileShareWitnessPath("pvswjdkirso") .withStorageAccountUrl("qxhcrmn") - .withStorageAccountPrimaryKey("jtckwhdso") + .withStorageAccountPrimaryKey("fakeStorageAccountPrimaryKeyPlaceholder") .withClusterSubnetType(ClusterSubnetType.SINGLE_SUBNET); model = BinaryData.fromObject(model).toObject(WsfcDomainProfile.class); Assertions.assertEquals("z", model.domainFqdn()); Assertions.assertEquals("iachbo", model.ouPath()); - Assertions.assertEquals("flnrosfqpteehzz", model.clusterBootstrapAccount()); + Assertions.assertEquals("fakeClusterBootstrapAccountPlaceholder", model.clusterBootstrapAccount()); Assertions.assertEquals("pyqr", model.clusterOperatorAccount()); Assertions.assertEquals("z", model.sqlServiceAccount()); Assertions.assertEquals("pvswjdkirso", model.fileShareWitnessPath()); Assertions.assertEquals("qxhcrmn", model.storageAccountUrl()); - Assertions.assertEquals("jtckwhdso", model.storageAccountPrimaryKey()); + Assertions.assertEquals("fakeStorageAccountPrimaryKeyPlaceholder", model.storageAccountPrimaryKey()); Assertions.assertEquals(ClusterSubnetType.SINGLE_SUBNET, model.clusterSubnetType()); } } diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/FakeCredentialInTest.groovy b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/FakeCredentialInTest.groovy new file mode 100644 index 000000000000..6559e70d7034 --- /dev/null +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/FakeCredentialInTest.groovy @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.storage.blob + +/** + * Fake credential shared in Tests + */ +class FakeCredentialInTest { + /** + * Fake Storage SAS signature value used in test + */ + public static final String fakeSignaturePlaceholder = "sD3fPKLnFKZUjnSV4qA%2FXoJOqsmDfNfxWcZ7kPtLc0I%3D"; +} diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/HelperTest.groovy b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/HelperTest.groovy index 7b6370639181..e85b386f4f4c 100644 --- a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/HelperTest.groovy +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/HelperTest.groovy @@ -9,6 +9,7 @@ import com.azure.core.util.serializer.SerializerEncoding import com.azure.storage.blob.APISpec import com.azure.storage.blob.BlobContainerAsyncClient import com.azure.storage.blob.BlobUrlParts +import com.azure.storage.blob.FakeCredentialInTest import com.azure.storage.blob.implementation.util.BlobSasImplUtil import com.azure.storage.blob.models.BlobRange import com.azure.storage.blob.models.PageList @@ -68,7 +69,7 @@ class HelperTest extends APISpec { def "URLParser"() { when: - def parts = BlobUrlParts.parse(new URL("http://host/container/" + originalBlobName + "?snapshot=snapshot&sv=" + Constants.SAS_SERVICE_VERSION + "&sr=c&sp=r&sig=sD3fPKLnFKZUjnSV4qA%2FXoJOqsmDfNfxWcZ7kPtLc0I%3D")) + def parts = BlobUrlParts.parse(new URL("http://host/container/" + originalBlobName + "?snapshot=snapshot&sv=" + Constants.SAS_SERVICE_VERSION + "&sr=c&sp=r&sig=" + FakeCredentialInTest.fakeSignaturePlaceholder)) then: parts.getScheme() == "http" diff --git a/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/FakeCredentialInTest.java b/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/FakeCredentialInTest.java new file mode 100644 index 000000000000..6d6da4d5d586 --- /dev/null +++ b/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/FakeCredentialInTest.java @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.storage.common; + +/** + * Fake or well known credential list in Tests + */ +public final class FakeCredentialInTest { + /** + * Well known account key value. + */ + public static final String WELL_KNOWN_ACCOUNT_KEY_VALUE = + "95o6TL9jkIjNr6HurD6Xa+zLQ+PX9/VWR8fI2ofHatbrUb8kRJ75B6enwRU3q1OP8fmjghaoxdqnwhN7m3pZow=="; + + /** + * Fake Storage SAS signature value used in test + */ + public static final String FAKE_SIGNATURE_PLACEHOLDER = "sD3fPKLnFKZUjnSV4qA%2FXoJOqsmDfNfxWcZ7kPtLc0I%3D"; +} diff --git a/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/implementation/connectionstring/StorageConnectionStringTest.java b/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/implementation/connectionstring/StorageConnectionStringTest.java index 3d66396394c4..23f9d958bdf1 100644 --- a/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/implementation/connectionstring/StorageConnectionStringTest.java +++ b/sdk/storage/azure-storage-common/src/test/java/com/azure/storage/common/implementation/connectionstring/StorageConnectionStringTest.java @@ -13,15 +13,15 @@ import java.util.Map; import java.util.Set; +import static com.azure.storage.common.FakeCredentialInTest.FAKE_SIGNATURE_PLACEHOLDER; +import static com.azure.storage.common.FakeCredentialInTest.WELL_KNOWN_ACCOUNT_KEY_VALUE; import static org.junit.jupiter.api.Assertions.assertThrows; public class StorageConnectionStringTest { private final ClientLogger logger = new ClientLogger(StorageConnectionStringTest.class); private static final String ACCOUNT_NAME_VALUE = "contoso"; - private static final String ACCOUNT_KEY_VALUE = - "95o6TL9jkIjNr6HurD6Xa+zLQ+PX9/VWR8fI2ofHatbrUb8kRJ75B6enwRU3q1OP8fmjghaoxdqnwhN7m3pZow=="; private static final String SAS_TOKEN = - "sv=2015-07-08&sig=sD3fPKLnFKZUjnSV4qA%2FXoJOqsmDfNfxWcZ7kPtLc0I%3D&spr=https" + "sv=2015-07-08&sig=" + FAKE_SIGNATURE_PLACEHOLDER + "&spr=https" + "&st=2016-04-12T03%3A24%3A31Z" + "&se=2016-04-13T03%3A29%3A31Z&srt=s&ss=bf&sp=rwl"; private static final String CHINA_CLOUD_ENDPOINT_SUFFIX = "core.chinacloudapi.cn"; @@ -112,7 +112,7 @@ private static void assertSasTokensEqual(String left, String right) { public void accountNameKey() { final String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;", ACCOUNT_NAME_VALUE, - ACCOUNT_KEY_VALUE); + WELL_KNOWN_ACCOUNT_KEY_VALUE); StorageConnectionString storageConnectionString = StorageConnectionString.create(connectionString, logger); Assertions.assertNotNull(storageConnectionString); @@ -149,7 +149,7 @@ public void accountNameKey() { Assertions.assertNotNull(authSettings.getAccount().getName()); Assertions.assertNotNull(authSettings.getAccount().getAccessKey()); Assertions.assertTrue(authSettings.getAccount().getName().equals(ACCOUNT_NAME_VALUE)); - Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(ACCOUNT_KEY_VALUE)); + Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(WELL_KNOWN_ACCOUNT_KEY_VALUE)); } @Test @@ -157,7 +157,7 @@ public void customEndpointSuffix() { final String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;EndpointSuffix=%s", ACCOUNT_NAME_VALUE, - ACCOUNT_KEY_VALUE, + WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); StorageConnectionString storageConnectionString = StorageConnectionString.create(connectionString, logger); @@ -204,7 +204,7 @@ public void customEndpointSuffix() { Assertions.assertNotNull(authSettings.getAccount().getName()); Assertions.assertNotNull(authSettings.getAccount().getAccessKey()); Assertions.assertTrue(authSettings.getAccount().getName().equals(ACCOUNT_NAME_VALUE)); - Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(ACCOUNT_KEY_VALUE)); + Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(WELL_KNOWN_ACCOUNT_KEY_VALUE)); } @Test @@ -215,7 +215,7 @@ public void explicitEndpointsAndAccountName() { blobEndpointStr, fileEndpointStr, ACCOUNT_NAME_VALUE, - ACCOUNT_KEY_VALUE); + WELL_KNOWN_ACCOUNT_KEY_VALUE); StorageConnectionString storageConnectionString = StorageConnectionString.create(connectionString, logger); Assertions.assertNotNull(storageConnectionString); @@ -250,7 +250,7 @@ public void explicitEndpointsAndAccountName() { Assertions.assertNotNull(authSettings.getAccount().getName()); Assertions.assertNotNull(authSettings.getAccount().getAccessKey()); Assertions.assertTrue(authSettings.getAccount().getName().equals(ACCOUNT_NAME_VALUE)); - Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(ACCOUNT_KEY_VALUE)); + Assertions.assertTrue(authSettings.getAccount().getAccessKey().equals(WELL_KNOWN_ACCOUNT_KEY_VALUE)); } @Test @@ -294,7 +294,7 @@ public void skipEmptyEntries() { // connection string with empty entries (;; after protocol) final String connectionString = String.format("DefaultEndpointsProtocol=https;;;AccountName=%s;AccountKey=%s; EndpointSuffix=%s", - ACCOUNT_NAME_VALUE, ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + ACCOUNT_NAME_VALUE, WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); StorageConnectionString.create(connectionString, logger); } @@ -312,7 +312,7 @@ public void missingEqualDelimiter() { // A connection string with missing equal symbol between AccountKey and it's value final String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=%s;AccountKey%s;EndpointSuffix=%s", - ACCOUNT_NAME_VALUE, ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + ACCOUNT_NAME_VALUE, WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -321,7 +321,7 @@ public void missingKey() { // A connection string with missing 'AccountName' key for it's value final String connectionString = String.format("DefaultEndpointsProtocol=https;=%s;AccountKey=%s;EndpointSuffix=%s", - ACCOUNT_NAME_VALUE, ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + ACCOUNT_NAME_VALUE, WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -330,7 +330,7 @@ public void missingValue() { // A connection string with missing value for 'AccountName' key final String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=;AccountKey%s;EndpointSuffix=%s", - ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -339,7 +339,7 @@ public void missingKeyValue() { // a connection string with key and value missing for equal (=) delimiter final String connectionString = String.format("DefaultEndpointsProtocol=https;=;AccountName=%s;AccountKey%s;EndpointSuffix=%s", - ACCOUNT_NAME_VALUE, ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + ACCOUNT_NAME_VALUE, WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -347,7 +347,7 @@ public void missingKeyValue() { public void missingAccountKey() { final String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=%s;%s;EndpointSuffix=%s", - ACCOUNT_NAME_VALUE, ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); + ACCOUNT_NAME_VALUE, WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -362,7 +362,7 @@ public void sasTokenAccountKeyMutuallyExclusive() { fileEndpointStr, SAS_TOKEN, ACCOUNT_NAME_VALUE, - ACCOUNT_KEY_VALUE); + WELL_KNOWN_ACCOUNT_KEY_VALUE); assertThrows(IllegalArgumentException.class, () -> StorageConnectionString.create(connectionString, logger)); } @@ -385,7 +385,7 @@ public void overrideDefaultProtocolToHttp() { final String connectionString = String.format("DefaultEndpointsProtocol=http;AccountName=%s;AccountKey=%s;EndpointSuffix=%s", ACCOUNT_NAME_VALUE, - ACCOUNT_KEY_VALUE, + WELL_KNOWN_ACCOUNT_KEY_VALUE, CHINA_CLOUD_ENDPOINT_SUFFIX); StorageConnectionString storageConnectionString = StorageConnectionString.create(connectionString, logger); diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java index 4ba746ad3346..f8fb72824de6 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java @@ -129,7 +129,7 @@ public final StorageFileInputStream openInputStream() { * @throws ShareStorageException If a storage service error occurred. */ public final StorageFileInputStream openInputStream(ShareFileRange range) { - return new StorageFileInputStream(shareFileAsyncClient, range.getStart(), range.getEnd()); + return new StorageFileInputStream(shareFileAsyncClient, range.getStart(), (range.getEnd() - range.getStart() + 1)); } /** diff --git a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAPITests.groovy b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAPITests.groovy index fad702b5cc93..5926879fc354 100644 --- a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAPITests.groovy +++ b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAPITests.groovy @@ -981,6 +981,25 @@ class FileAPITests extends APISpec { FileLastWrittenMode.PRESERVE | _ } + def "Open input stream with range"() { + setup: + primaryFileClient.create(1024) + def shareFileRange = new ShareFileRange(5L, 10L) + def dataBytes = "long test string".getBytes(StandardCharsets.UTF_8) + def inputStreamData = new ByteArrayInputStream(dataBytes) + + when: + primaryFileClient.upload(inputStreamData, dataBytes.size(), null) + def totalBytesRead = 0 + def stream = primaryFileClient.openInputStream(shareFileRange) + while (stream.read() != -1) { + totalBytesRead++ + } + stream.close() + then: + assert totalBytesRead == 6 + } + @Unroll def "Start copy"() { given: diff --git a/sdk/storage/azure-storage-file-share/src/test/resources/session-records/FileAPITestsOpenInputStreamWithRange.json b/sdk/storage/azure-storage-file-share/src/test/resources/session-records/FileAPITestsOpenInputStreamWithRange.json new file mode 100644 index 000000000000..15c3f6dd708a --- /dev/null +++ b/sdk/storage/azure-storage-file-share/src/test/resources/session-records/FileAPITestsOpenInputStreamWithRange.json @@ -0,0 +1,143 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://REDACTED.file.preprod.core.windows.net/ce3cbc63ce3cbc632c684222f5807cb9ebd242268f?restype=share", + "Headers" : { + "x-ms-version" : "2021-10-04", + "User-Agent" : "azsdk-java-azure-storage-file-share/12.17.0-beta.1 (11.0.16.1; Windows 11; 10.0)", + "x-ms-client-request-id" : "1b0c1ba2-96d0-4e9b-9aa3-1000483bf87a" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2021-10-04", + "eTag" : "0x8DABC531CB0F1BC", + "Last-Modified" : "Tue, 01 Nov 2022 21:50:37 GMT", + "retry-after" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "2291e178-201a-0006-673b-ee03a9000000", + "x-ms-client-request-id" : "1b0c1ba2-96d0-4e9b-9aa3-1000483bf87a", + "Date" : "Tue, 01 Nov 2022 21:50:36 GMT" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "https://REDACTED.file.preprod.core.windows.net/ce3cbc63ce3cbc632c684222f5807cb9ebd242268f/ce3cbc63ce3cbc632c6344965fb006783d134bef8f", + "Headers" : { + "x-ms-version" : "2021-10-04", + "User-Agent" : "azsdk-java-azure-storage-file-share/12.17.0-beta.1 (11.0.16.1; Windows 11; 10.0)", + "x-ms-client-request-id" : "0dd4e67e-aae2-4588-859a-bb10e3363323" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2021-10-04", + "x-ms-file-permission-key" : "9945064027553397782*7508646553028463472", + "x-ms-file-id" : "13835128424026341376", + "x-ms-file-creation-time" : "2022-11-01T21:50:37.9480673Z", + "Last-Modified" : "Tue, 01 Nov 2022 21:50:37 GMT", + "retry-after" : "0", + "StatusCode" : "201", + "x-ms-request-server-encrypted" : "true", + "Date" : "Tue, 01 Nov 2022 21:50:37 GMT", + "x-ms-file-attributes" : "Archive", + "x-ms-file-change-time" : "2022-11-01T21:50:37.9480673Z", + "x-ms-file-parent-id" : "0", + "eTag" : "0x8DABC531CE5DE61", + "x-ms-request-id" : "2291e17b-201a-0006-683b-ee03a9000000", + "x-ms-client-request-id" : "0dd4e67e-aae2-4588-859a-bb10e3363323", + "x-ms-file-last-write-time" : "2022-11-01T21:50:37.9480673Z" + }, + "Exception" : null + }, { + "Method" : "PUT", + "Uri" : "https://REDACTED.file.preprod.core.windows.net/ce3cbc63ce3cbc632c684222f5807cb9ebd242268f/ce3cbc63ce3cbc632c6344965fb006783d134bef8f?comp=range", + "Headers" : { + "x-ms-version" : "2021-10-04", + "User-Agent" : "azsdk-java-azure-storage-file-share/12.17.0-beta.1 (11.0.16.1; Windows 11; 10.0)", + "x-ms-client-request-id" : "a48b3129-9567-43b1-9248-89aaea378374", + "Content-Type" : "application/octet-stream" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-ms-version" : "2021-10-04", + "eTag" : "0x8DABC531D10E6A3", + "Last-Modified" : "Tue, 01 Nov 2022 21:50:38 GMT", + "retry-after" : "0", + "StatusCode" : "201", + "x-ms-request-id" : "2291e17d-201a-0006-693b-ee03a9000000", + "x-ms-request-server-encrypted" : "true", + "x-ms-client-request-id" : "a48b3129-9567-43b1-9248-89aaea378374", + "x-ms-file-last-write-time" : "2022-11-01T21:50:38.2300835Z", + "Date" : "Tue, 01 Nov 2022 21:50:37 GMT", + "Content-MD5" : "K1x6Aez9I61xPII8Y4xMyg==" + }, + "Exception" : null + }, { + "Method" : "HEAD", + "Uri" : "https://REDACTED.file.preprod.core.windows.net/ce3cbc63ce3cbc632c684222f5807cb9ebd242268f/ce3cbc63ce3cbc632c6344965fb006783d134bef8f", + "Headers" : { + "x-ms-version" : "2021-10-04", + "User-Agent" : "azsdk-java-azure-storage-file-share/12.17.0-beta.1 (11.0.16.1; Windows 11; 10.0)", + "x-ms-client-request-id" : "018c0227-30e9-4a16-902b-0a9c9ca554ea" + }, + "Response" : { + "content-length" : "1024", + "x-ms-version" : "2021-10-04", + "x-ms-lease-status" : "unlocked", + "x-ms-file-permission-key" : "9945064027553397782*7508646553028463472", + "x-ms-file-id" : "13835128424026341376", + "x-ms-file-creation-time" : "2022-11-01T21:50:37.9480673Z", + "x-ms-lease-state" : "available", + "Last-Modified" : "Tue, 01 Nov 2022 21:50:38 GMT", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Tue, 01 Nov 2022 21:50:37 GMT", + "x-ms-server-encrypted" : "true", + "x-ms-type" : "File", + "x-ms-file-attributes" : "Archive", + "x-ms-file-change-time" : "2022-11-01T21:50:38.2300835Z", + "x-ms-file-parent-id" : "0", + "eTag" : "0x8DABC531D10E6A3", + "x-ms-request-id" : "2291e17e-201a-0006-6a3b-ee03a9000000", + "x-ms-client-request-id" : "018c0227-30e9-4a16-902b-0a9c9ca554ea", + "x-ms-file-last-write-time" : "2022-11-01T21:50:38.2300835Z", + "Content-Type" : "application/octet-stream" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://REDACTED.file.preprod.core.windows.net/ce3cbc63ce3cbc632c684222f5807cb9ebd242268f/ce3cbc63ce3cbc632c6344965fb006783d134bef8f", + "Headers" : { + "x-ms-version" : "2021-10-04", + "User-Agent" : "azsdk-java-azure-storage-file-share/12.17.0-beta.1 (11.0.16.1; Windows 11; 10.0)", + "x-ms-client-request-id" : "4a2ae446-7ea6-4ea8-accc-b22114bf7a91" + }, + "Response" : { + "content-length" : "6", + "x-ms-version" : "2021-10-04", + "x-ms-lease-status" : "unlocked", + "x-ms-file-permission-key" : "9945064027553397782*7508646553028463472", + "x-ms-file-id" : "13835128424026341376", + "x-ms-file-creation-time" : "2022-11-01T21:50:37.9480673Z", + "Content-Range" : "bytes 5-10/1024", + "x-ms-lease-state" : "available", + "Last-Modified" : "Tue, 01 Nov 2022 21:50:38 GMT", + "retry-after" : "0", + "StatusCode" : "206", + "Date" : "Tue, 01 Nov 2022 21:50:37 GMT", + "Accept-Ranges" : "bytes", + "x-ms-server-encrypted" : "true", + "x-ms-type" : "File", + "x-ms-file-attributes" : "Archive", + "x-ms-file-change-time" : "2022-11-01T21:50:38.2300835Z", + "x-ms-file-parent-id" : "0", + "eTag" : "0x8DABC531D10E6A3", + "x-ms-request-id" : "2291e180-201a-0006-6b3b-ee03a9000000", + "Body" : "dGVzdCBz", + "x-ms-client-request-id" : "4a2ae446-7ea6-4ea8-accc-b22114bf7a91", + "x-ms-file-last-write-time" : "2022-11-01T21:50:38.2300835Z", + "Content-Type" : "application/octet-stream" + }, + "Exception" : null + } ], + "variables" : [ "ce3cbc63ce3cbc632c684222f5807cb9ebd242268f", "ce3cbc63ce3cbc632c6344965fb006783d134bef8f" ] +} \ No newline at end of file diff --git a/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/ListBlobsTest.java b/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/ListBlobsTest.java index f30eb998da0b..71a3365de858 100644 --- a/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/ListBlobsTest.java +++ b/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/ListBlobsTest.java @@ -7,6 +7,8 @@ import com.azure.storage.blob.perf.core.ContainerTest; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.core.scheduler.Scheduler; +import reactor.core.scheduler.Schedulers; import java.util.UUID; @@ -16,10 +18,19 @@ public ListBlobsTest(PerfStressOptions options) { } public Mono globalSetupAsync() { + // Perform blob uploading in parallel. + // + // This not only results in faster setup it also helps guard against an edge case seen in Reactor Netty + // where only one IO thread could end up owning all connections in the connection pool. This results in + // drastically less CPU usage and throughput, there is ongoing discussions with Reactor Netty on what causes + // this edge case, whether we had a design flaw in the performance tests, or if there is a configuration change + // needed in Reactor Netty. return super.globalSetupAsync().then( Flux.range(0, options.getCount()) - .map(i -> "getblobstest-" + UUID.randomUUID()) - .flatMap(b -> blobContainerAsyncClient.getBlobAsyncClient(b).upload(Flux.empty(), null)) + .parallel(options.getParallel()) + .runOn(Schedulers.boundedElastic()) + .flatMap(iteration -> blobContainerAsyncClient.getBlobAsyncClient("getblobstest-" + UUID.randomUUID()) + .upload(Flux.empty(), null), false, Math.min(options.getParallel(), 1000 / options.getParallel()), 1) .then()); } diff --git a/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/core/ServiceTest.java b/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/core/ServiceTest.java index 54894fa8db56..be3f013c92c6 100644 --- a/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/core/ServiceTest.java +++ b/sdk/storage/azure-storage-perf/src/main/java/com/azure/storage/blob/perf/core/ServiceTest.java @@ -10,6 +10,9 @@ import com.azure.storage.blob.BlobServiceAsyncClient; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; public abstract class ServiceTest extends PerfStressTest { @@ -36,4 +39,19 @@ public ServiceTest(TOptions options) { blobServiceClient = builder.buildClient(); blobServiceAsyncClient = builder.buildAsyncClient(); } + + @Override + public Mono globalSetupAsync() { + // Arbitrarily run 1000 service get properties calls to warm up the connection pool used by the HttpClient. + // This helps guard against an edge case seen in Reactor Netty where only one IO thread could end up owning all + // connections in the connection pool. This results in drastically less CPU usage and throughput, there is + // ongoing discussions with Reactor Netty on what causes this edge case, whether we had a design flaw in the + // performance tests, or if there is a configuration change needed in Reactor Netty. + return super.globalSetupAsync().then(Flux.range(0, 1000) + .parallel(options.getParallel()) + .runOn(Schedulers.boundedElastic()) + .flatMap(ignored -> blobServiceAsyncClient.getProperties(), false, + Math.min(options.getParallel(), 1000 / options.getParallel()), 1) + .then()); + } } diff --git a/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/FakeCredentialInTest.groovy b/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/FakeCredentialInTest.groovy new file mode 100644 index 000000000000..86e9f101baf2 --- /dev/null +++ b/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/FakeCredentialInTest.groovy @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.azure.storage; + +/** + * Fake credential shared in Tests + */ +class FakeCredentialInTest { + /** + * Fake Storage SAS signature value used in test + */ + public static final String fakeSignaturePlaceholder = "Ee%2BSodSXamKSzivSdRTqYGh7AeMVEk3wEoRZ1yzkpSc%3D"; +} diff --git a/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/blob/HelperTest.groovy b/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/blob/HelperTest.groovy index 6ba69dfc4f1a..dc382a642353 100644 --- a/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/blob/HelperTest.groovy +++ b/sdk/storage/microsoft-azure-storage-blob/src/test/java/com/microsoft/azure/storage/blob/HelperTest.groovy @@ -4,6 +4,7 @@ package com.microsoft.azure.storage.blob import com.microsoft.azure.storage.APISpec +import com.microsoft.azure.storage.FakeCredentialInTest import com.microsoft.azure.storage.blob.models.AccessPolicy import com.microsoft.azure.storage.blob.models.SignedIdentifier import com.microsoft.azure.storage.blob.models.StorageErrorCode @@ -912,7 +913,7 @@ class HelperTest extends APISpec { def "URLParser"() { when: - def parts = URLParser.parse(new URL("http://host/container/blob?snapshot=snapshot&sv=" + Constants.HeaderConstants.TARGET_STORAGE_VERSION + "&sr=c&sp=r&sig=Ee%2BSodSXamKSzivSdRTqYGh7AeMVEk3wEoRZ1yzkpSc%3D")) + def parts = URLParser.parse(new URL("http://host/container/blob?snapshot=snapshot&sv=" + Constants.HeaderConstants.TARGET_STORAGE_VERSION + "&sr=c&sp=r&sig=" + FakeCredentialInTest.fakeSignaturePlaceholder)) then: parts.scheme() == "http" @@ -923,6 +924,6 @@ class HelperTest extends APISpec { parts.sasQueryParameters().permissions() == "r" parts.sasQueryParameters().version() == Constants.HeaderConstants.TARGET_STORAGE_VERSION parts.sasQueryParameters().resource() == "c" - parts.sasQueryParameters().signature() == Utility.safeURLDecode("Ee%2BSodSXamKSzivSdRTqYGh7AeMVEk3wEoRZ1yzkpSc%3D") + parts.sasQueryParameters().signature() == Utility.safeURLDecode(FakeCredentialInTest.fakeSignaturePlaceholder) } } diff --git a/sdk/textanalytics/azure-ai-textanalytics/src/test/java/com/azure/ai/textanalytics/TestUtils.java b/sdk/textanalytics/azure-ai-textanalytics/src/test/java/com/azure/ai/textanalytics/TestUtils.java index a1b1f2d3c325..a3a4e5d4aeb8 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/src/test/java/com/azure/ai/textanalytics/TestUtils.java +++ b/sdk/textanalytics/azure-ai-textanalytics/src/test/java/com/azure/ai/textanalytics/TestUtils.java @@ -101,7 +101,7 @@ final class TestUtils { static final OffsetDateTime TIME_NOW = OffsetDateTime.now(); static final String INVALID_URL = "htttttttps://localhost:8080"; static final String VALID_HTTPS_LOCALHOST = "https://localhost:8080"; - static final String FAKE_API_KEY = "1234567890"; + static final String FAKE_API_KEY = "fakeKeyPlaceholder"; static final String AZURE_TEXT_ANALYTICS_API_KEY = "AZURE_TEXT_ANALYTICS_API_KEY"; static final String CUSTOM_ACTION_NAME = "customActionName"; diff --git a/sdk/translation/azure-ai-documenttranslator/src/test/java/com/azure/ai/documenttranslator/BatchDocumentTranslationClientTestBase.java b/sdk/translation/azure-ai-documenttranslator/src/test/java/com/azure/ai/documenttranslator/BatchDocumentTranslationClientTestBase.java index 39b01594464a..236a86d98825 100644 --- a/sdk/translation/azure-ai-documenttranslator/src/test/java/com/azure/ai/documenttranslator/BatchDocumentTranslationClientTestBase.java +++ b/sdk/translation/azure-ai-documenttranslator/src/test/java/com/azure/ai/documenttranslator/BatchDocumentTranslationClientTestBase.java @@ -14,7 +14,7 @@ import com.azure.core.util.Configuration; public class BatchDocumentTranslationClientTestBase extends TestBase { - private static final String FAKE_API_KEY = "1234567890"; + private static final String FAKE_API_KEY = "fakeKeyPlaceholder"; private static final String OCP_APIM_SUBSCRIPTION_KEY = "Ocp-Apim-Subscription-Key"; BatchDocumentTranslationRestClient getClient() {