diff --git a/.gitignore b/.gitignore index 0160ec82cf1ff..08f1238124660 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ temp/ # Spring **/*packageOutputDirectory* +# Sensitive files +*.json.env + #javadoc overview files generated from README.md readme_overview.html **/javadocTemp/** diff --git a/sdk/digitaltwins/Print-MyEnvData.ps1 b/sdk/digitaltwins/Print-MyEnvData.ps1 new file mode 100644 index 0000000000000..9c03422e3e87f --- /dev/null +++ b/sdk/digitaltwins/Print-MyEnvData.ps1 @@ -0,0 +1,5 @@ +param( + [Parameter()] + [string] $fileName = "test-resources.json.env" +) +([System.Text.Encoding]::UTF8).GetString([Security.Cryptography.ProtectedData]::Unprotect([IO.File]::ReadAllBytes((Resolve-path $fileName)), $null, [Security.Cryptography.DataProtectionScope]::CurrentUser)) \ No newline at end of file diff --git a/sdk/digitaltwins/azure-digitaltwins-core/pom.xml b/sdk/digitaltwins/azure-digitaltwins-core/pom.xml index 01c52fa892309..04dc54125c671 100644 --- a/sdk/digitaltwins/azure-digitaltwins-core/pom.xml +++ b/sdk/digitaltwins/azure-digitaltwins-core/pom.xml @@ -15,6 +15,12 @@ azure-digitaltwins-core 1.0.0-beta.1 + + + 0.01 + 0.01 + + com.azure @@ -22,7 +28,24 @@ 1.7.0 - + com.azure + azure-core-http-netty + 1.5.4 + + + com.fasterxml.jackson.core + jackson-annotations + 2.11.2 + + + + + com.azure + azure-core-test + 1.4.0 + test + + com.azure azure-identity 1.1.0 @@ -30,13 +53,27 @@ com.azure - azure-core-http-netty - 1.5.4 + azure-core-http-okhttp + 1.2.5 + test - com.fasterxml.jackson.core - jackson-annotations - 2.11.2 + org.junit.jupiter + junit-jupiter-api + 5.6.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.6.2 + test + + + org.junit.jupiter + junit-jupiter-params + 5.6.2 + test diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsTestBase.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsTestBase.java new file mode 100644 index 0000000000000..4f9396d5be0e7 --- /dev/null +++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/DigitalTwinsTestBase.java @@ -0,0 +1,110 @@ +package com.azure.digitaltwins.core; + +import com.azure.core.credential.AccessToken; +import com.azure.core.credential.TokenCredential; +import com.azure.core.credential.TokenRequestContext; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.test.TestBase; +import com.azure.core.test.TestMode; +import com.azure.core.util.Configuration; +import com.azure.core.util.logging.ClientLogger; +import com.azure.identity.ClientSecretCredentialBuilder; +import reactor.core.publisher.Mono; + +import java.util.Locale; + +public class DigitalTwinsTestBase extends TestBase +{ + protected static final String TENANT_ID = Configuration.getGlobalConfiguration() + .get("TENANT_ID", "tenantId"); + + protected static final String CLIENT_SECRET = Configuration.getGlobalConfiguration() + .get("CLIENT_SECRET", "clientSecret"); + + protected static final String CLIENT_ID = Configuration.getGlobalConfiguration() + .get("CLIENT_ID", "clientId"); + + protected static final String DIGITALTWINS_URL = Configuration.getGlobalConfiguration() + .get("DIGITALTWINS_URL", "https://playback.api.wus2.digitaltwins.azure.net"); + + protected DigitalTwinsClientBuilder getDigitalTwinsClientBuilder() { + DigitalTwinsClientBuilder builder = new DigitalTwinsClientBuilder() + .endpoint(DIGITALTWINS_URL); + + if (interceptorManager.isPlaybackMode()){ + builder.httpClient(interceptorManager.getPlaybackClient()); + // Use fake credentials for playback mode. + builder.tokenCredential(new FakeCredentials()); + return builder; + } + + // TODO: investigate whether or not we need to add a retry policy. + + // If it is record mode, we add record mode policies to the builder. + // There is no isRecordMode method on interceptorManger. + if (!interceptorManager.isLiveMode()){ + builder.addPolicy(interceptorManager.getRecordPolicy()); + } + + // Only get valid live token when running live tests. + builder.tokenCredential(new ClientSecretCredentialBuilder() + .tenantId(TENANT_ID) + .clientId(CLIENT_ID) + .clientSecret(CLIENT_SECRET) + .build()); + + return builder; + } + + protected DigitalTwinsClientBuilder getDigitalTwinsClientBuilder(HttpPipelinePolicy... policies) { + DigitalTwinsClientBuilder builder = new DigitalTwinsClientBuilder() + .endpoint(DIGITALTWINS_URL); + + if (interceptorManager.isPlaybackMode()){ + builder.httpClient(interceptorManager.getPlaybackClient()); + // Use fake credentials for playback mode. + builder.tokenCredential(new FakeCredentials()); + addPolicies(builder, policies); + return builder; + } + + addPolicies(builder, policies); + + // TODO: investigate whether or not we need to add a retry policy. + + // If it is record mode, we add record mode policies to the builder. + // There is no isRecordMode method on interceptorManger. + if (!interceptorManager.isLiveMode()) { + builder.addPolicy(interceptorManager.getRecordPolicy()); + } + + // Only get valid live token when running live tests. + builder.tokenCredential(new ClientSecretCredentialBuilder() + .tenantId(TENANT_ID) + .clientId(CLIENT_ID) + .clientSecret(CLIENT_SECRET) + .build()); + + return builder; + } + + private static void addPolicies(DigitalTwinsClientBuilder builder, HttpPipelinePolicy... policies) { + if (policies == null) { + return; + } + + for (HttpPipelinePolicy policy : policies) { + builder.addPolicy(policy); + } + } + + static class FakeCredentials implements TokenCredential + { + @Override + public Mono getToken(TokenRequestContext tokenRequestContext) { + return Mono.empty(); + } + } +} diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/SampleTest.java b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/SampleTest.java new file mode 100644 index 0000000000000..fdec1b94937a6 --- /dev/null +++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/java/com/azure/digitaltwins/core/SampleTest.java @@ -0,0 +1,41 @@ +package com.azure.digitaltwins.core; + +import com.azure.core.http.rest.PagedIterable; +import com.azure.digitaltwins.core.models.ModelData; +import org.junit.jupiter.api.Test; + +public class SampleTest extends DigitalTwinsTestBase { + + private static DigitalTwinsClient client; + + @Override + protected void beforeTest(){ + super.beforeTest(); + client = setupClient(); + } + + @Override + protected void afterTest() + { + super.afterTest(); + } + + private DigitalTwinsClient setupClient(){ + return getDigitalTwinsClientBuilder() + .buildClient(); + } + + @Test + public void ListTest(){ + PagedIterable models = client.listModels(); + + // Process using the Stream interface by iterating over each page + models + // You can also subscribe to pages by specifying the preferred page size or the associated continuation token to start the processing from. + .streamByPage() + .forEach(page -> { + System.out.println("Response headers status code is " + page.getStatusCode()); + page.getValue().forEach(item -> System.out.println("Model retrieved: " + item.getId())); + }); + } +} diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/prerequisite readme.md b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/prerequisite readme.md new file mode 100644 index 0000000000000..4729abf44bee1 --- /dev/null +++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/prerequisite readme.md @@ -0,0 +1,26 @@ +# Prerequisites + +## Install + +### Install the latest Powershell 7 + +- Make sure you run the script using the latest stable version of [powershell 7](https://github.com/PowerShell/PowerShell/releases) + +### Install the latest Azure CLI package + +- If already installed, check latest version: + - Run `az --version` to make sure `azure-cli` is at least **version 2.3.1** + - If it isn't, update it +- Use this link to install [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest]) + +## Delete + +To delete the digital twins instance, you need to first delete the endpoint added by the script (the service doesn't yet support cascading delete). + +1. To do this, run the command `az dt endpoint delete -n
-g --en someEventHubEndpoint`. +1. If you have other endpoints that have been added outside this script, you can discover them with the command `az dt endpoint list -n
-g `. +1. Then delete them with the same command in step 1. + +## Maintenance + +In order to maintain the functionality of the Setup.ps1 file, make sure this document stays updated with all the required changes if you run/alter this script. diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/setup.ps1 b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/setup.ps1 new file mode 100644 index 0000000000000..086f7bbce370b --- /dev/null +++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/prerequisite/setup.ps1 @@ -0,0 +1,131 @@ +param( + [Parameter(Mandatory)] + [string] $Region, + + [Parameter(Mandatory)] + [string] $ResourceGroup, + + [Parameter(Mandatory)] + [string] $SubscriptionId, + + [Parameter(Mandatory)] + [ValidateLength(6, 50)] + [string] $DigitalTwinName, + + [Parameter()] + [string] $AppRegistrationName +) + +Function Connect-AzureSubscription +{ + # Ensure the user is logged in + try + { + $azureContext = az account show + } + catch { } + + if (-not $azureContext) + { + Write-Host "`nPlease login to Azure..." + az login + $azureContext = az account show + } + + # Ensure the desired subscription is selected + $sub = az account show --output tsv --query id + if ($sub -ne $SubscriptionId) + { + Write-Host "`nSelecting subscription $SubscriptionId" + az account set --subscription $SubscriptionId + } + + return $azureContext +} + +$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") +if (-not $isAdmin) +{ + throw "This script must be run in administrative mode." +} + +Connect-AzureSubscription + +$Region = $Region.Replace(' ', '') + +if (-not $AppRegistrationName) +{ + $AppRegistrationName = $ResourceGroup +} + +$appId = az ad app list --show-mine --query "[?displayName=='$AppRegistrationName'].appId" --output tsv +if (-not $appId) +{ + Write-Host "`nCreating App Registration $AppRegistrationName`n" + $appId = az ad app create --display-name $AppRegistrationName --native-app --query 'appId' --output tsv +} + +$sp = az ad sp list --show-mine --query "[?appId=='$appId'].appId" --output tsv +if (-not $sp) +{ + Write-Host "`nCreating service principal for app $appId`n" + az ad sp create --id $appId --output none +} + +# Get test application OID from the service principal +$applicationOId = az ad sp show --id $sp --query "objectId" --output tsv + +$rgExists = az group exists --name $ResourceGroup +if ($rgExists -eq "False") +{ + Write-Host "`nCreating Resource Group $ResourceGroup in $Region`n" + az group create --name $ResourceGroup --location $Region --output none +} + +Write-Host "`nDeploying resources to $ResourceGroup in $Region`n" + +$armTemplateFile = Join-Path -Path $PSScriptRoot -ChildPath "../../../../../test-resources.json"; + +if (-not (Test-Path $armTemplateFile -PathType leaf)) +{ + throw "`nARM template was not found. Please make sure you have an ARM template file named test-resources.json in the root of the service directory`n" +} + +# Deploy test-resources.json ARM template. +az deployment group create --resource-group $ResourceGroup --name $($DigitalTwinName.ToLower()) --template-file $armTemplateFile --parameters ` + baseName=$($DigitalTwinName.ToLower()) ` + testApplicationOid=$applicationOId ` + location=$Region + +# Even though the output variable names are all capital letters in the script, ARM turns them into a strange casing +# and we have to use that casing in order to get them from the deployment outputs. +$dtHostName = az deployment group show -g $ResourceGroup -n $($DigitalTwinName.ToLower()) --query 'properties.outputs.digitaltwinS_URL.value' --output tsv + +Write-Host("`nSet a new client secret for $appId`n") +$appSecret = az ad app credential reset --id $appId --years 2 --query 'password' --output tsv + +$outputfileDir = (Get-Item -Path $PSScriptRoot).Parent.Parent.Parent.Parent.Parent.Fullname +$outputFile = Join-Path -Path $outputfileDir -ChildPath "test-resources.json.env" +$tenantId = "72f988bf-86f1-41af-91ab-2d7cd011db47" + +Add-Type -AssemblyName System.Security + +$appSecretJsonEscaped = ConvertTo-Json $appSecret +$environmentText = @" +{ + "DIGITALTWINS_URL": "$dtHostName", + "DIGITALTWINS_CLIENT_ID": "$appId", + "DIGITALTWINS_CLIENT_SECRET": $appSecretJsonEscaped, + "DIGITALTWINS_TENANT_ID": "$tenantId" +} +"@ + +Write-Host "`n$environmentText`n" + +Write-Host "`nEnvironment variables set, this will now be encrypted. Copy these values for future reference.`n" +$bytes = ([System.Text.Encoding]::UTF8).GetBytes($environmentText) +$protectedBytes = [Security.Cryptography.ProtectedData]::Protect($bytes, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser) +Set-Content $outputFile -Value $protectedBytes -AsByteStream -Force +Write-Host "`nTest environment settings stored into encrypted $outputFile`n" + +Write-Host "Done!" diff --git a/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/session-records/ListTest.json b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/session-records/ListTest.json new file mode 100644 index 0000000000000..0fbc08187eead --- /dev/null +++ b/sdk/digitaltwins/azure-digitaltwins-core/src/test/resources/session-records/ListTest.json @@ -0,0 +1,21 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.api.wus2.digitaltwins.azure.net/models?api-version=2020-05-31-preview", + "Headers" : { + "User-Agent" : "azsdk-java-azure-digitaltwins-core/1.0.0-beta.1 (11.0.7; Windows 10; 10.0)", + "x-ms-client-request-id" : "2c291200-e7dc-4262-89bc-7b9d33e0cf08" + }, + "Response" : { + "Strict-Transport-Security" : "max-age=2592000", + "retry-after" : "0", + "Content-Length" : "8404", + "StatusCode" : "200", + "Body" : "{\"value\":[{\"id\":\"dtmi:example:Ward;114653809\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:35:57.0043855+00:00\"},{\"id\":\"dtmi:example:Ward;111815882\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:35:57.3524717+00:00\"},{\"id\":\"dtmi:example:Ward;189947004\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:04.264631+00:00\"},{\"id\":\"dtmi:example:Ward;134000272\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:05.0983867+00:00\"},{\"id\":\"dtmi:example:Ward;192739528\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:11.4816322+00:00\"},{\"id\":\"dtmi:example:Ward;116332842\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:11.7749519+00:00\"},{\"id\":\"dtmi:example:Ward;116238422\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:29.4055305+00:00\"},{\"id\":\"dtmi:example:Ward;198163867\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:29.8807133+00:00\"},{\"id\":\"dtmi:example:Ward;121159740\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:51.8135839+00:00\"},{\"id\":\"dtmi:example:Ward;121200167\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:36:52.3203982+00:00\"},{\"id\":\"dtmi:example:Ward;112162783\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:08.6579838+00:00\"},{\"id\":\"dtmi:example:Ward;147373991\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:09.529767+00:00\"},{\"id\":\"dtmi:example:Ward;161147759\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:15.2200393+00:00\"},{\"id\":\"dtmi:example:Ward;120708472\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:15.2352591+00:00\"},{\"id\":\"dtmi:example:Ward;110887268\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:22.2311573+00:00\"},{\"id\":\"dtmi:example:Ward;118301577\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:37:22.3667165+00:00\"},{\"id\":\"dtmi:example:Ward;139439832\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:40:48.8947652+00:00\"},{\"id\":\"dtmi:example:Ward;111263086\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:40:54.0431308+00:00\"},{\"id\":\"dtmi:example:Ward;168646450\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:05.1032132+00:00\"},{\"id\":\"dtmi:example:Ward;115143769\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:06.4744458+00:00\"},{\"id\":\"dtmi:example:Ward;128072960\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:10.0981475+00:00\"},{\"id\":\"dtmi:example:Ward;110184439\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:10.1085481+00:00\"},{\"id\":\"dtmi:example:Ward;116847374\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:16.6955258+00:00\"},{\"id\":\"dtmi:example:Ward;155773321\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:17.7553908+00:00\"},{\"id\":\"dtmi:example:Ward;114761833\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:37.6566323+00:00\"},{\"id\":\"dtmi:example:Ward;120391613\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:48.012186+00:00\"},{\"id\":\"dtmi:example:Ward;159816443\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:53.8412956+00:00\"},{\"id\":\"dtmi:example:Ward;112440549\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:41:58.1808299+00:00\"},{\"id\":\"dtmi:example:Ward;186622131\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:42:01.9623456+00:00\"},{\"id\":\"dtmi:example:Ward;145075813\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:42:02.2606087+00:00\"},{\"id\":\"dtmi:example:Ward;145121366\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:42:09.2690772+00:00\"},{\"id\":\"dtmi:example:Ward;116421010\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:42:09.6711432+00:00\"},{\"id\":\"dtmi:example:wifiroom;14907\",\"description\":{},\"displayName\":{\"en\":\"RoomWithWifi\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:44:42.3445106+00:00\"},{\"id\":\"dtmi:example:wifi;117599647\",\"description\":{},\"displayName\":{\"en\":\"Wifi\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:44:42.3447161+00:00\"},{\"id\":\"dtmi:example:Ward;115429255\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:48:26.6388005+00:00\"},{\"id\":\"dtmi:example:Ward;189540703\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:48:26.7312243+00:00\"},{\"id\":\"dtmi:example:Ward;144568920\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:48:30.5678849+00:00\"},{\"id\":\"dtmi:example:Ward;110855032\",\"description\":{\"en\":\"A separate partition in a building, made of rooms and hallways.\"},\"displayName\":{\"en\":\"Ward\"},\"decommissioned\":false,\"uploadTime\":\"2020-07-28T23:48:30.7037839+00:00\"}],\"nextLink\":null}", + "Date" : "Mon, 31 Aug 2020 20:27:27 GMT", + "Content-Type" : "application/json; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} \ No newline at end of file diff --git a/sdk/digitaltwins/test-resources.json b/sdk/digitaltwins/test-resources.json index 90b11322185f5..5d830cf1169de 100644 --- a/sdk/digitaltwins/test-resources.json +++ b/sdk/digitaltwins/test-resources.json @@ -147,7 +147,7 @@ } ], "outputs": { - "DIGITALTWINS_ADT_INSTANCE_ENDPOINT_URL": { + "DIGITALTWINS_URL": { "type": "string", "value": "[concat('https://', reference(variables('digitalTwinInstanceResourceId'), '2020-03-01-preview').hostName)]" } diff --git a/sdk/digitaltwins/tests.yml b/sdk/digitaltwins/tests.yml index b07ab1f79b184..2f799c176aa1e 100644 --- a/sdk/digitaltwins/tests.yml +++ b/sdk/digitaltwins/tests.yml @@ -5,7 +5,4 @@ extends: parameters: ServiceDirectory: digitaltwins Location: westus2 - SubscriptionConfiguration: $(sub-config-azure-cloud-test-resources-preview) - EnvVars: - # Runs live tests. - AZURE_IOT_TEST_MODE: Live \ No newline at end of file + SubscriptionConfiguration: $(sub-config-azure-cloud-test-resources-preview) \ No newline at end of file