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/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 416f0c69646d..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 @@ -21,36 +22,40 @@ 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"; + await ModelLifecycleSamples.TryDeleteModelAsync(client, sampleBuildingModelId); + await ModelLifecycleSamples.TryDeleteModelAsync(client, sampleFloorModelId); // 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 +66,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 +202,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.