From 369c44b3aac29f37584bb4bcd6ac86991d33c76d Mon Sep 17 00:00:00 2001 From: timtay-microsoft Date: Tue, 20 Oct 2020 11:23:15 -0700 Subject: [PATCH 1/3] Fix digital twins samples --- .../DTDL/DigitalTwins/BuildingTwin.json | 2 +- .../DTDL/DigitalTwins/FloorTwin.json | 2 +- .../DTDL/DigitalTwins/HVACTwin.json | 2 +- .../DTDL/DigitalTwins/RoomTwin.json | 2 +- .../DTDL/Models/Building.json | 6 +-- .../DTDL/Models/Floor.json | 4 +- .../DTDL/Models/HVAC.json | 4 +- .../DTDL/Models/Room.json | 4 +- .../DTDL/Models/Wifi.json | 2 +- .../RelationshipSamples.cs | 45 ++++++++++++++----- .../SamplesConstants.cs | 14 +++--- 11 files changed, 54 insertions(+), 33 deletions(-) diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/BuildingTwin.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/BuildingTwin.json index ba5291c2b571..085f3ca3d530 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/BuildingTwin.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/BuildingTwin.json @@ -1,6 +1,6 @@ { "$metadata": { - "$model": "dtmi:samples:Building;1" + "$model": "dtmi:com:samples:Building;1" }, "AverageTemperature": 68, "TemperatureUnit": "Celsius" diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/FloorTwin.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/FloorTwin.json index f9a08edfd8bb..acbe3c91c0aa 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/FloorTwin.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/FloorTwin.json @@ -1,6 +1,6 @@ { "$metadata": { - "$model": "dtmi:samples:Floor;1" + "$model": "dtmi:com:samples:Floor;1" }, "AverageTemperature": 75 } diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/HVACTwin.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/HVACTwin.json index 49b4ad617232..75c0ba9a8e9f 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/HVACTwin.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/HVACTwin.json @@ -1,6 +1,6 @@ { "$metadata": { - "$model": "dtmi:samples:HVAC;1" + "$model": "dtmi:com:samples:HVAC;1" }, "Efficiency": 94, "TargetTemperature": 72, diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/RoomTwin.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/RoomTwin.json index bc75da2917f4..e9ad94f496e9 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/RoomTwin.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/DigitalTwins/RoomTwin.json @@ -1,6 +1,6 @@ { "$metadata": { - "$model": "dtmi:samples:Room;1" + "$model": "dtmi:com:samples:Room;1" }, "Temperature": 80, "Humidity": 25, diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Building.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Building.json index 1a032d636473..b9c7e4f674a5 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Building.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Building.json @@ -1,5 +1,5 @@ { - "@id": "dtmi:samples:Building;1", + "@id": "dtmi:com:samples:Building;1", "@type": "Interface", "@context": "dtmi:dtdl:context;2", "displayName": "Building", @@ -7,7 +7,7 @@ { "@type": "Relationship", "name": "has", - "target": "dtmi:samples:Floor;1", + "target": "dtmi:com:samples:Floor;1", "properties": [ { "@type": "Property", @@ -19,7 +19,7 @@ { "@type": "Relationship", "name": "isEquippedWith", - "target": "dtmi:samples:HVAC;1" + "target": "dtmi:com:samples:HVAC;1" }, { "@type": "Property", diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Floor.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Floor.json index fe4ea891228b..b7765e08bf0f 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Floor.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Floor.json @@ -1,5 +1,5 @@ { - "@id": "dtmi:samples:Floor;1", + "@id": "dtmi:com:samples:Floor;1", "@type": "Interface", "@context": "dtmi:dtdl:context;2", "displayName": "Floor", @@ -7,7 +7,7 @@ { "@type": "Relationship", "name": "contains", - "target": "dtmi:samples:Room;1" + "target": "dtmi:com:samples:Room;1" }, { "@type": "Property", diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/HVAC.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/HVAC.json index 35186f130a95..821c5aa20422 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/HVAC.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/HVAC.json @@ -1,5 +1,5 @@ { - "@id": "dtmi:samples:HVAC;1", + "@id": "dtmi:com:samples:HVAC;1", "@type": "Interface", "@context": "dtmi:dtdl:context;2", "displayName": "HVAC", @@ -22,7 +22,7 @@ { "@type": "Relationship", "name": "controlsTemperature", - "target": "dtmi:samples:Floor;1" + "target": "dtmi:com:samples:Floor;1" } ] } diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Room.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Room.json index a6c2dfe6bd78..9389f44a61af 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Room.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Room.json @@ -1,5 +1,5 @@ { - "@id": "dtmi:samples:Room;1", + "@id": "dtmi:com:samples:Room;1", "@type": "Interface", "@context": "dtmi:dtdl:context;2", "displayName": "Room", @@ -27,7 +27,7 @@ { "@type": "Component", "name": "wifiAccessPoint", - "schema": "dtmi:samples:Wifi;1" + "schema": "dtmi:com:samples:Wifi;1" } ] } diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Wifi.json b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Wifi.json index a2b07b484334..62337d212cb5 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Wifi.json +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/DTDL/Models/Wifi.json @@ -1,5 +1,5 @@ { - "@id": "dtmi:samples:Wifi;1", + "@id": "dtmi:com:samples:Wifi;1", "@type": "Interface", "@context": "dtmi:dtdl:context;2", "displayName": "Wifi", diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs index 416f0c69646d..32aaee83fecd 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs @@ -21,36 +21,57 @@ public async Task RunSamplesAsync(DigitalTwinsClient client) // Despite not being a good code practice, this prevents code snippets from being out of context for the user when making API calls that accept Ids as parameters. PrintHeader("RELATIONSHIP SAMPLE"); + string sampleBuildingModelId = "dtmi:com:samples:SampleBuilding;1"; + string sampleFloorModelId = "dtmi:com:samples:SampleFloor;1"; + try + { + Console.WriteLine($"Deleting model Id '{sampleBuildingModelId}' if it exists."); + await client.DeleteModelAsync(sampleBuildingModelId); + } + catch (Exception ex) + { + // Model did not exist yet, and that's fine + } + + try + { + Console.WriteLine($"Deleting model Id '{sampleFloorModelId}' if it exists."); + await client.DeleteModelAsync(sampleFloorModelId); + } + catch (Exception ex) + { + // Model did not exist yet, and that's fine + } // Create a building digital twin model. string buildingModelPayload = SamplesConstants.TemporaryModelWithRelationshipPayload - .Replace(SamplesConstants.ModelId, "dtmi:samples:SampleBuilding;1") + .Replace(SamplesConstants.RelationshipTargetModelId, sampleFloorModelId) + .Replace(SamplesConstants.ModelId, sampleBuildingModelId) .Replace(SamplesConstants.ModelDisplayName, "Building") - .Replace(SamplesConstants.RelationshipName, "contains") - .Replace(SamplesConstants.RelationshipTargetModelId, "dtmi:samples:SampleFloor;1"); + .Replace(SamplesConstants.RelationshipName, "contains"); await client.CreateModelsAsync( new[] { buildingModelPayload }); - Console.WriteLine($"Created model 'dtmi:samples:SampleBuilding;1'."); + Console.WriteLine($"Created model '{sampleBuildingModelId}'."); // Create a floor digital twin model. string floorModelPayload = SamplesConstants.TemporaryModelWithRelationshipPayload - .Replace(SamplesConstants.ModelId, "dtmi:samples:SampleFloor;1") + .Replace(SamplesConstants.RelationshipTargetModelId, sampleBuildingModelId) + .Replace(SamplesConstants.ModelId, sampleFloorModelId) .Replace(SamplesConstants.ModelDisplayName, "Floor") - .Replace(SamplesConstants.RelationshipName, "containedIn") - .Replace(SamplesConstants.RelationshipTargetModelId, "dtmi:samples:SampleBuilding;1"); + .Replace(SamplesConstants.RelationshipName, "containedIn"); await client.CreateModelsAsync(new[] { floorModelPayload }); - Console.WriteLine($"Created model 'dtmi:samples:SampleFloor;1.'"); + Console.WriteLine($"Created model '{sampleFloorModelId}'"); // Create a building digital twin. var buildingDigitalTwin = new BasicDigitalTwin { Id = "buildingTwinId", - Metadata = { ModelId = "dtmi:samples:SampleBuilding;1" } + Metadata = { ModelId = sampleBuildingModelId } }; string buildingDigitalTwinPayload = JsonSerializer.Serialize(buildingDigitalTwin); @@ -61,7 +82,7 @@ await client.CreateModelsAsync( var floorDigitalTwin = new BasicDigitalTwin { Id = "floorTwinId", - Metadata = { ModelId = "dtmi:samples:SampleFloor;1" } + Metadata = { ModelId = sampleFloorModelId } }; string floorDigitalTwinPayload = JsonSerializer.Serialize(floorDigitalTwin); @@ -197,8 +218,8 @@ await client.CreateModelsAsync( try { - await client.DeleteModelAsync("dtmi:samples:SampleBuilding;1"); - await client.DeleteModelAsync("dtmi:samples:SampleFloor;1"); + await client.DeleteModelAsync(sampleBuildingModelId); + await client.DeleteModelAsync(sampleFloorModelId); } catch (RequestFailedException ex) { diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/SamplesConstants.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/SamplesConstants.cs index 3a9b5e1150d4..f646bed01ffc 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/SamplesConstants.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/SamplesConstants.cs @@ -8,27 +8,27 @@ public static class SamplesConstants /// /// Room model Id /// - public const string RoomModelId = "dtmi:samples:Room;1"; + public const string RoomModelId = "dtmi:com:samples:Room;1"; /// /// WiFi model Id /// - public const string WifiModelId = "dtmi:samples:Wifi;1"; + public const string WifiModelId = "dtmi:com:samples:Wifi;1"; /// /// Building model Id /// - public const string BuildingModelId = "dtmi:samples:Building;1"; + public const string BuildingModelId = "dtmi:com:samples:Building;1"; /// /// Floor model Id /// - public const string FloorModelId = "dtmi:samples:Floor;1"; + public const string FloorModelId = "dtmi:com:samples:Floor;1"; /// /// HVAC model Id /// - public const string HvacModelId = "dtmi:samples:HVAC;1"; + public const string HvacModelId = "dtmi:com:samples:HVAC;1"; /// /// Placeholder for model Id in the temporary payload. @@ -43,12 +43,12 @@ public static class SamplesConstants /// /// Temporary model Id prefix /// - public const string TemporaryModelPrefix = "dtmi:samples:TempModel;"; + public const string TemporaryModelPrefix = "dtmi:com:samples:TempModel;"; /// /// Temporary component model Id prefix /// - public const string TemporaryComponentModelPrefix = "dtmi:samples:ComponentModel;"; + public const string TemporaryComponentModelPrefix = "dtmi:com:samples:ComponentModel;"; /// /// Placeholder for model display name in the temporary payload. From dd6394af92cee18fe336ec22aecf8ddb9a253cd5 Mon Sep 17 00:00:00 2001 From: timtay-microsoft Date: Tue, 20 Oct 2020 11:43:24 -0700 Subject: [PATCH 2/3] fixup --- .../samples/DigitalTwinsClientSample/RelationshipSamples.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs index 32aaee83fecd..ff3be7b634b6 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs @@ -28,7 +28,7 @@ public async Task RunSamplesAsync(DigitalTwinsClient client) Console.WriteLine($"Deleting model Id '{sampleBuildingModelId}' if it exists."); await client.DeleteModelAsync(sampleBuildingModelId); } - catch (Exception ex) + catch (RequestFailedException ex) when (ex.Status == 404) { // Model did not exist yet, and that's fine } @@ -38,7 +38,7 @@ public async Task RunSamplesAsync(DigitalTwinsClient client) Console.WriteLine($"Deleting model Id '{sampleFloorModelId}' if it exists."); await client.DeleteModelAsync(sampleFloorModelId); } - catch (Exception ex) + catch (RequestFailedException ex) when (ex.Status == 404) { // Model did not exist yet, and that's fine } From 58eed9bbdf4e6dfa1c5689073f728d13ace601ab Mon Sep 17 00:00:00 2001 From: timtay-microsoft Date: Tue, 20 Oct 2020 11:55:15 -0700 Subject: [PATCH 3/3] fixup --- .../ModelLifecycleSamples.cs | 20 +++++++++++++++++ .../RelationshipSamples.cs | 22 +++---------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/ModelLifecycleSamples.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/ModelLifecycleSamples.cs index bb46b09d8e6d..95ff783a461b 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/ModelLifecycleSamples.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/ModelLifecycleSamples.cs @@ -101,5 +101,25 @@ public async Task RunSamplesAsync(DigitalTwinsClient client) #endregion Snippet:DigitalTwinsSampleDeleteModel } + + /// + /// Try to delete a model, but don't fail if the model does not exist. Useful in setting up or tearing down after running a sample if the + /// sample re-uses the same model Id each time + /// + /// The client to use when deleting the model + /// The id of the model to delete + /// An empty task once the model has been deleted. + public static async Task TryDeleteModelAsync(DigitalTwinsClient client, string modelId) + { + try + { + Console.WriteLine($"Deleting model Id '{modelId}' if it exists."); + await client.DeleteModelAsync(modelId); + } + catch (RequestFailedException ex) when (ex.Status == 404) + { + // Model did not exist yet, and that's fine + } + } } } diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs index ff3be7b634b6..910794aaf70b 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/samples/DigitalTwinsClientSample/RelationshipSamples.cs @@ -6,6 +6,7 @@ using System.Text.Json; using System.Threading.Tasks; using Azure.DigitalTwins.Core.Serialization; +using Azure.DigitalTwins.Samples; using static Azure.DigitalTwins.Core.Samples.SampleLogger; namespace Azure.DigitalTwins.Core.Samples @@ -23,25 +24,8 @@ public async Task RunSamplesAsync(DigitalTwinsClient client) PrintHeader("RELATIONSHIP SAMPLE"); string sampleBuildingModelId = "dtmi:com:samples:SampleBuilding;1"; string sampleFloorModelId = "dtmi:com:samples:SampleFloor;1"; - try - { - Console.WriteLine($"Deleting model Id '{sampleBuildingModelId}' if it exists."); - await client.DeleteModelAsync(sampleBuildingModelId); - } - catch (RequestFailedException ex) when (ex.Status == 404) - { - // Model did not exist yet, and that's fine - } - - try - { - Console.WriteLine($"Deleting model Id '{sampleFloorModelId}' if it exists."); - await client.DeleteModelAsync(sampleFloorModelId); - } - catch (RequestFailedException ex) when (ex.Status == 404) - { - // Model did not exist yet, and that's fine - } + await ModelLifecycleSamples.TryDeleteModelAsync(client, sampleBuildingModelId); + await ModelLifecycleSamples.TryDeleteModelAsync(client, sampleFloorModelId); // Create a building digital twin model. string buildingModelPayload = SamplesConstants.TemporaryModelWithRelationshipPayload