Skip to content

Commit 39cf3fa

Browse files
authored
feat(samples): Twin configurations sample (#14683)
1 parent 3c69a12 commit 39cf3fa

File tree

10 files changed

+216
-21
lines changed

10 files changed

+216
-21
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Azure.Iot.Hub.Service.Samples
1414
/// bulk APIs that allow for creating, updating, and deleting of up to 100 device identities at a time.
1515
/// There are also bulk APIs for updating twins on up to 100 devices at time.
1616
/// </summary>
17-
internal class BulkDeviceIdentityLifecycleSamples
17+
internal class BulkDeviceIdentityLifecycleSample
1818
{
1919
public readonly IotHubServiceClient IoTHubServiceClient;
2020
public const int MaxRandomValue = 200;
@@ -23,7 +23,7 @@ internal class BulkDeviceIdentityLifecycleSamples
2323
// Can be 1 to 100, configures how many devices to create/update/delete per service API call.
2424
public const int BulkCount = 20;
2525

26-
public BulkDeviceIdentityLifecycleSamples(IotHubServiceClient client)
26+
public BulkDeviceIdentityLifecycleSample(IotHubServiceClient client)
2727
{
2828
IoTHubServiceClient = client;
2929
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Azure.Iot.Hub.Service.Samples
1313
/// bulk APIs that allow for creating, updating, and deleting of up to 100 module identities at a time.
1414
/// There are also bulk APIs for updating twins on up to 100 modules at time.
1515
/// </summary>
16-
internal class BulkModuleIdentityLifecycleSamples
16+
internal class BulkModuleIdentityLifecycleSample
1717
{
1818
public readonly IotHubServiceClient IoTHubServiceClient;
1919
public const int MaxRandomValue = 200;
@@ -22,7 +22,7 @@ internal class BulkModuleIdentityLifecycleSamples
2222
// Can be 1 to 100, configures how many modules to create/update/delete per service API call.
2323
public const int BulkCount = 20;
2424

25-
public BulkModuleIdentityLifecycleSamples(IotHubServiceClient client)
25+
public BulkModuleIdentityLifecycleSample(IotHubServiceClient client)
2626
{
2727
IoTHubServiceClient = client;
2828
}
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Threading.Tasks;
6+
using Azure.Iot.Hub.Service.Models;
7+
8+
namespace Azure.Iot.Hub.Service.Samples
9+
{
10+
/// <summary>
11+
/// This sample goes through the usage of Configuration on the IoT Hub.
12+
/// </summary>
13+
internal class ConfigurationSample
14+
{
15+
public readonly IotHubServiceClient IoTHubServiceClient;
16+
public const int MaxRandomValue = 200;
17+
public static readonly Random Random = new Random();
18+
19+
public ConfigurationSample(IotHubServiceClient client)
20+
{
21+
IoTHubServiceClient = client;
22+
}
23+
24+
public async Task RunSampleAsync()
25+
{
26+
string testConfigurationId = $"configuration{Random.Next(MaxRandomValue)}";
27+
TwinConfiguration twinConfiguration = CreateSampleConfig(testConfigurationId);
28+
29+
// Create a Twin Configuration.
30+
await CreateConfigurationAsync(twinConfiguration);
31+
32+
// Get the Twin Configuration.
33+
await GetConfigurationAsync(twinConfiguration);
34+
35+
// Update the Twin Configuration.
36+
await UpdateConfigurationAsync(twinConfiguration);
37+
38+
// Delete the Twin Configuration.
39+
await DeleteConfigurationAsync(twinConfiguration);
40+
}
41+
42+
/// <summary>
43+
/// Creates a new twin configuration.
44+
/// </summary>
45+
/// <param name="twinConfiguration">Twin Configuration to create.</param>
46+
public async Task<TwinConfiguration> CreateConfigurationAsync(TwinConfiguration twinConfiguration)
47+
{
48+
SampleLogger.PrintHeader("CREATE TWIN CONFIGURATION");
49+
TwinConfiguration createdConfig;
50+
51+
try
52+
{
53+
// Create a twin configuration
54+
#region Snippet:IotHubCreateConfiguration
55+
Response<TwinConfiguration> createResponse = await IoTHubServiceClient.Configurations
56+
.CreateOrUpdateConfigurationAsync(twinConfiguration)
57+
.ConfigureAwait(false);
58+
createdConfig = createResponse.Value;
59+
60+
Console.WriteLine($"Successfully created a new configuration with Id: '{createdConfig.Id}', ETag: '{createdConfig.Etag}'");
61+
62+
#endregion Snippet:IotHubCreateConfiguration
63+
64+
return createdConfig;
65+
}
66+
catch (Exception ex)
67+
{
68+
// Try to cleanup before exiting with fatal error.
69+
await DeleteConfigurationAsync(twinConfiguration);
70+
SampleLogger.FatalError($"Failed to create twin configuration due to:\n{ex}");
71+
throw;
72+
}
73+
}
74+
75+
/// <summary>
76+
/// Get a twin configuration.
77+
/// </summary>
78+
/// <param name="twinConfiguration">Twin Configuration</param>
79+
public async Task<TwinConfiguration> GetConfigurationAsync(TwinConfiguration twinConfiguration)
80+
{
81+
SampleLogger.PrintHeader("GET A CONFIGURATION");
82+
83+
try
84+
{
85+
Console.WriteLine($"Getting twin configuration with Id: '{twinConfiguration.Id}'\n");
86+
87+
#region Snippet:IotHubGetConfiguration
88+
89+
Response<TwinConfiguration> getResponse = await IoTHubServiceClient.Configurations
90+
.GetConfigurationAsync(twinConfiguration.Id)
91+
.ConfigureAwait(false);
92+
93+
TwinConfiguration responseConfiguration = getResponse.Value;
94+
95+
SampleLogger.PrintSuccess($"Configuration Id: '{responseConfiguration.Id}', ETag: '{responseConfiguration.Etag}'");
96+
97+
#endregion Snippet:IotHubGetConfiguration
98+
99+
return responseConfiguration;
100+
}
101+
catch (Exception ex)
102+
{
103+
// Try to cleanup before exiting with fatal error.
104+
await DeleteConfigurationAsync(twinConfiguration);
105+
SampleLogger.FatalError($"Failed to get a twin configuration due to:\n{ex}");
106+
throw;
107+
}
108+
}
109+
110+
/// <summary>
111+
/// Update a twin configuration.
112+
/// </summary>
113+
/// <param name="twinConfiguration">Twin Configuration to to be updated.</param>
114+
public async Task<TwinConfiguration> UpdateConfigurationAsync(TwinConfiguration twinConfiguration)
115+
{
116+
SampleLogger.PrintHeader("UPDATE A CONFIGURATION");
117+
118+
try
119+
{
120+
#region Snippet:IotHubUpdateConfiguration
121+
122+
twinConfiguration.Priority = Random.Next(MaxRandomValue);
123+
Console.WriteLine($"Updating twin configuration with Id: '{twinConfiguration.Id}''s priority to: '{twinConfiguration.Priority}'");
124+
Response <TwinConfiguration> response = await IoTHubServiceClient.Configurations
125+
.CreateOrUpdateConfigurationAsync(twinConfiguration, IfMatchPrecondition.UnconditionalIfMatch)
126+
.ConfigureAwait(false);
127+
128+
TwinConfiguration updatedConfiguration = response.Value;
129+
130+
SampleLogger.PrintSuccess($"Successfully updated twin configuration: Id: '{updatedConfiguration.Id}', Priority: '{updatedConfiguration.Priority}', ETag: '{updatedConfiguration.Etag}'");
131+
132+
#endregion Snippet:IotHubUpdateConfiguration
133+
134+
return updatedConfiguration;
135+
}
136+
catch (Exception ex)
137+
{
138+
// Try to cleanup before exiting with fatal error.
139+
await DeleteConfigurationAsync(twinConfiguration);
140+
SampleLogger.FatalError($"Failed to update a twin configuration due to:\n{ex}");
141+
throw;
142+
}
143+
}
144+
145+
/// <summary>
146+
/// Deletes a twin configuration.
147+
/// </summary>
148+
/// <param name="twinConfiguration">Twin Configuration to delete.</param>
149+
public async Task DeleteConfigurationAsync(TwinConfiguration twinConfiguration)
150+
{
151+
SampleLogger.PrintHeader("DELETE A CONFIGURATION");
152+
153+
try
154+
{
155+
Console.WriteLine($"Deleting twin configuration with Id: '{twinConfiguration.Id}'");
156+
157+
#region Snippet:IotHubDeleteConfiguration
158+
159+
Response response = await IoTHubServiceClient.Configurations
160+
.DeleteConfigurationAsync(twinConfiguration, IfMatchPrecondition.UnconditionalIfMatch)
161+
.ConfigureAwait(false);
162+
163+
SampleLogger.PrintSuccess($"Successfully deleted twin configuration with Id: '{twinConfiguration.Id}'");
164+
165+
#endregion Snippet:IotHubDeleteConfiguration
166+
}
167+
catch (Exception ex)
168+
{
169+
SampleLogger.FatalError($"Failed to delete twin configuration due to:\n{ex}");
170+
}
171+
}
172+
173+
private TwinConfiguration CreateSampleConfig(string testConfigurationId)
174+
{
175+
var twinConfiguration = new TwinConfiguration
176+
{
177+
Id = testConfigurationId,
178+
Labels =
179+
{
180+
{ "HostPlatform", "SomeValue" },
181+
},
182+
TargetCondition = "*",
183+
Priority = Random.Next(MaxRandomValue),
184+
};
185+
186+
twinConfiguration.Content = new ConfigurationContent();
187+
twinConfiguration.Content.DeviceContent.Add("properties.desired.deviceContent_key", $"deviceContent_value-{twinConfiguration.Id}");
188+
189+
return twinConfiguration;
190+
}
191+
}
192+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ namespace Azure.Iot.Hub.Service.Samples
1212
/// <summary>
1313
/// This sample goes through the lifecycle of a Device Identity for a device.
1414
/// </summary>
15-
internal class DeviceIdentityLifecycleSamples
15+
internal class DeviceIdentityLifecycleSample
1616
{
1717
public readonly IotHubServiceClient IoTHubServiceClient;
1818
public const int MaxRandomValue = 200;
1919
public static readonly Random Random = new Random();
2020

21-
public DeviceIdentityLifecycleSamples(IotHubServiceClient client)
21+
public DeviceIdentityLifecycleSample(IotHubServiceClient client)
2222
{
2323
IoTHubServiceClient = client;
2424
}

sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/JobsSamples.cs renamed to sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/JobsSample.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ namespace Azure.Iot.Hub.Service.Samples
1010
/// <summary>
1111
/// This sample shows how to start the import and export jobs and check their status.
1212
/// </summary>
13-
internal class JobsSamples
13+
internal class JobsSample
1414
{
1515
public readonly IotHubServiceClient IoTHubServiceClient;
1616
public const int MaxRandomValue = 200;
1717
public static readonly Random Random = new Random();
1818
public readonly Uri ContainerSasUri;
1919

20-
public JobsSamples(IotHubServiceClient client, Uri containerSasUri)
20+
public JobsSample(IotHubServiceClient client, Uri containerSasUri)
2121
{
2222
IoTHubServiceClient = client;
2323
ContainerSasUri = containerSasUri;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ namespace Azure.Iot.Hub.Service.Samples
1212
/// <summary>
1313
/// This sample goes through the lifecycle of a Module Identity for a device.
1414
/// </summary>
15-
internal class ModuleIdentityLifecycleSamples
15+
internal class ModuleIdentityLifecycleSample
1616
{
1717
public readonly IotHubServiceClient IoTHubServiceClient;
1818
public const int MaxRandomValue = 200;
1919
public static readonly Random Random = new Random();
2020

21-
public ModuleIdentityLifecycleSamples(IotHubServiceClient client)
21+
public ModuleIdentityLifecycleSample(IotHubServiceClient client)
2222
{
2323
IoTHubServiceClient = client;
2424
}

sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/Program.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,31 @@ public static async Task Main(string[] args)
4444

4545
// Run the samples
4646

47-
var deviceIdentityLifecycleSamples = new DeviceIdentityLifecycleSamples(hubClient);
47+
var deviceIdentityLifecycleSamples = new DeviceIdentityLifecycleSample(hubClient);
4848
await deviceIdentityLifecycleSamples.RunSampleAsync();
4949

50-
var moduleIdentityLifecycleSamples = new ModuleIdentityLifecycleSamples(hubClient);
50+
var moduleIdentityLifecycleSamples = new ModuleIdentityLifecycleSample(hubClient);
5151
await moduleIdentityLifecycleSamples.RunSampleAsync();
5252

53-
var bulkDeviceIdentityLifecycleSamples = new BulkDeviceIdentityLifecycleSamples(hubClient);
53+
var bulkDeviceIdentityLifecycleSamples = new BulkDeviceIdentityLifecycleSample(hubClient);
5454
await bulkDeviceIdentityLifecycleSamples.RunSampleAsync();
5555

56-
var bulkModuledentityLifecycleSamples = new BulkModuleIdentityLifecycleSamples(hubClient);
56+
var bulkModuledentityLifecycleSamples = new BulkModuleIdentityLifecycleSample(hubClient);
5757
await bulkModuledentityLifecycleSamples.RunSampleAsync();
5858

59-
var querySamples = new QueryTwinSamples(hubClient);
59+
var querySamples = new QueryTwinSample(hubClient);
6060
await querySamples.RunSampleAsync();
6161

62-
var statisticsSample = new StatisticsSamples(hubClient);
62+
var statisticsSample = new StatisticsSample(hubClient);
6363
await statisticsSample.RunSampleAsync();
6464

65+
var configurationsSample = new ConfigurationSample(hubClient);
66+
await configurationsSample.RunSampleAsync();
67+
6568
// Get SAS token to 'jobs' container in the storage account.
6669
Uri containerSasUri = await GetSasUriAsync(options.StorageAccountConnectionString, "jobs").ConfigureAwait(false);
6770

68-
var jobsSample = new JobsSamples(hubClient, containerSasUri);
71+
var jobsSample = new JobsSample(hubClient, containerSasUri);
6972
await jobsSample.RunSampleAsync();
7073

7174
// Run samples that require the device sample to be running.

sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/QueryTwinSamples.cs renamed to sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/QueryTwinSample.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ namespace Azure.Iot.Hub.Service.Samples
1010
/// <summary>
1111
/// This sample shows how to query the device twins to get data.
1212
/// </summary>
13-
internal class QueryTwinSamples
13+
internal class QueryTwinSample
1414
{
1515
public readonly IotHubServiceClient IoTHubServiceClient;
1616
public const int MaxRandomValue = 200;
1717
public static readonly Random Random = new Random();
1818

19-
public QueryTwinSamples(IotHubServiceClient client)
19+
public QueryTwinSample(IotHubServiceClient client)
2020
{
2121
IoTHubServiceClient = client;
2222
}

sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/StatisticsSamples.cs renamed to sdk/iot/Azure.Iot.Hub.Service/samples/IotHubClientSamples/StatisticsSample.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ namespace Azure.Iot.Hub.Service.Samples
99
/// <summary>
1010
/// This sample goes through the usage of statistics on the IoT Hub.
1111
/// </summary>
12-
internal class StatisticsSamples
12+
internal class StatisticsSample
1313
{
1414

1515
public readonly IotHubServiceClient IoTHubServiceClient;
1616

17-
public StatisticsSamples(IotHubServiceClient client)
17+
public StatisticsSample(IotHubServiceClient client)
1818
{
1919
IoTHubServiceClient = client;
2020
}

0 commit comments

Comments
 (0)