public async Task ConfigurationsClient_ConfigurationsLifecycle() { string testConfigurationId = $"configlifecycle{GetRandom()}"; // Generate a random priority less than 100 int testPriority = int.Parse(GetRandom()); IotHubServiceClient client = GetClient(); TwinConfiguration twinConfiguration = CreateTestConfig(testConfigurationId); TwinConfiguration createdConfig; try { // Create a twin configuration Response <TwinConfiguration> createResponse = await client.Configurations.CreateOrUpdateConfigurationAsync(twinConfiguration).ConfigureAwait(false); createdConfig = createResponse.Value; // Get twin configuration Response <TwinConfiguration> getResponse = await client.Configurations.GetConfigurationAsync(testConfigurationId).ConfigureAwait(false); getResponse.Value.Etag.Should().BeEquivalentTo(createdConfig.Etag, "ETag value should not have changed."); // Update a configuration createdConfig.Priority = testPriority; Response <TwinConfiguration> updatedConfig = await client.Configurations.CreateOrUpdateConfigurationAsync(createdConfig, IfMatchPrecondition.UnconditionalIfMatch).ConfigureAwait(false); updatedConfig.Value.Priority.Should().Be(testPriority, "Priority should have been updated."); } finally { // Delete twin configuration await CleanupAsync(client, twinConfiguration).ConfigureAwait(false); } }
/// <summary> /// Deletes a twin configuration on the IoT Hub for automatic device/module management /// </summary> /// <param name="configuration">Twin configuration to delete</param> /// <param name="precondition">The condition on which to perform this operation. If no ETag is present on the twin configuration, then the condition must be equal to <see cref="IfMatchPrecondition.UnconditionalIfMatch"/>."/>.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The http response <see cref="Response{T}"/>.</returns> public virtual Task <Response> DeleteConfigurationAsync(TwinConfiguration configuration, IfMatchPrecondition precondition = IfMatchPrecondition.IfMatch, CancellationToken cancellationToken = default) { Argument.AssertNotNull(configuration, nameof(configuration)); string ifMatchHeaderValue = IfMatchPreconditionExtensions.GetIfMatchHeaderValue(precondition, configuration.Etag); return(_configurationRestClient.DeleteAsync(configuration.Id, ifMatchHeaderValue, cancellationToken)); }
/// <summary> /// Create or update a twin configuration on the IoT Hub for automatic device/module management /// </summary> /// <param name="configuration">Twin configuration to update</param> /// <param name="precondition">The condition on which to perform this operation</param> /// In case of create, the condition must be equal to <see cref="IfMatchPrecondition.IfMatch"/>. /// In case of update, if no ETag is present on the twin configuration, then the condition must be equal to <see cref="IfMatchPrecondition.UnconditionalIfMatch"/>. /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The created automatic device/module management twin configuration</returns> public virtual Response <TwinConfiguration> CreateOrUpdateConfiguration(TwinConfiguration configuration, IfMatchPrecondition precondition = IfMatchPrecondition.IfMatch, CancellationToken cancellationToken = default) { Argument.AssertNotNull(configuration, nameof(configuration)); string ifMatchHeaderValue = IfMatchPreconditionExtensions.GetIfMatchHeaderValue(precondition, configuration.Etag); return(_configurationRestClient.CreateOrUpdate(configuration.Id, configuration, ifMatchHeaderValue, cancellationToken)); }
/// <summary> /// Creates a new twin configuration. /// </summary> /// <param name="twinConfiguration">Twin Configuration to create.</param> public async Task <TwinConfiguration> CreateConfigurationAsync(TwinConfiguration twinConfiguration) { SampleLogger.PrintHeader("CREATE TWIN CONFIGURATION"); TwinConfiguration createdConfig; try { // Create a twin configuration #region Snippet:IotHubCreateConfiguration Response <TwinConfiguration> createResponse = await IoTHubServiceClient.Configurations .CreateOrUpdateConfigurationAsync(twinConfiguration) .ConfigureAwait(false); createdConfig = createResponse.Value; Console.WriteLine($"Successfully created a new configuration with Id: '{createdConfig.Id}', ETag: '{createdConfig.Etag}'"); #endregion Snippet:IotHubCreateConfiguration return(createdConfig); } catch (Exception ex) { // Try to cleanup before exiting with fatal error. await DeleteConfigurationAsync(twinConfiguration); SampleLogger.FatalError($"Failed to create twin configuration due to:\n{ex}"); throw; } }
/// <summary> /// Get a twin configuration. /// </summary> /// <param name="twinConfiguration">Twin Configuration</param> public async Task <TwinConfiguration> GetConfigurationAsync(TwinConfiguration twinConfiguration) { SampleLogger.PrintHeader("GET A CONFIGURATION"); try { Console.WriteLine($"Getting twin configuration with Id: '{twinConfiguration.Id}'\n"); #region Snippet:IotHubGetConfiguration Response <TwinConfiguration> getResponse = await IoTHubServiceClient.Configurations .GetConfigurationAsync(twinConfiguration.Id) .ConfigureAwait(false); TwinConfiguration responseConfiguration = getResponse.Value; SampleLogger.PrintSuccess($"Configuration Id: '{responseConfiguration.Id}', ETag: '{responseConfiguration.Etag}'"); #endregion Snippet:IotHubGetConfiguration return(responseConfiguration); } catch (Exception ex) { // Try to cleanup before exiting with fatal error. await DeleteConfigurationAsync(twinConfiguration); SampleLogger.FatalError($"Failed to get a twin configuration due to:\n{ex}"); throw; } }
/// <summary> /// Update a twin configuration. /// </summary> /// <param name="twinConfiguration">Twin Configuration to to be updated.</param> public async Task <TwinConfiguration> UpdateConfigurationAsync(TwinConfiguration twinConfiguration) { SampleLogger.PrintHeader("UPDATE A CONFIGURATION"); try { #region Snippet:IotHubUpdateConfiguration twinConfiguration.Priority = Random.Next(MaxRandomValue); Console.WriteLine($"Updating twin configuration with Id: '{twinConfiguration.Id}''s priority to: '{twinConfiguration.Priority}'"); Response <TwinConfiguration> response = await IoTHubServiceClient.Configurations .CreateOrUpdateConfigurationAsync(twinConfiguration, IfMatchPrecondition.UnconditionalIfMatch) .ConfigureAwait(false); TwinConfiguration updatedConfiguration = response.Value; SampleLogger.PrintSuccess($"Successfully updated twin configuration: Id: '{updatedConfiguration.Id}', Priority: '{updatedConfiguration.Priority}', ETag: '{updatedConfiguration.Etag}'"); #endregion Snippet:IotHubUpdateConfiguration return(updatedConfiguration); } catch (Exception ex) { // Try to cleanup before exiting with fatal error. await DeleteConfigurationAsync(twinConfiguration); SampleLogger.FatalError($"Failed to update a twin configuration due to:\n{ex}"); throw; } }
public async Task <Response <TwinConfiguration> > GetAsync(string id, CancellationToken cancellationToken = default) { if (id == null) { throw new ArgumentNullException(nameof(id)); } using var message = CreateGetRequest(id); await _pipeline.SendAsync(message, cancellationToken).ConfigureAwait(false); switch (message.Response.Status) { case 200: { TwinConfiguration value = default; using var document = await JsonDocument.ParseAsync(message.Response.ContentStream, default, cancellationToken).ConfigureAwait(false); if (document.RootElement.ValueKind == JsonValueKind.Null) { value = null; } else { value = TwinConfiguration.DeserializeTwinConfiguration(document.RootElement); } return(Response.FromValue(value, message.Response)); }
private async Task CleanupAsync(IotHubServiceClient client, TwinConfiguration config) { // cleanup try { if (config != null) { await client.Configurations.DeleteConfigurationAsync(config, IfMatchPrecondition.UnconditionalIfMatch).ConfigureAwait(false); } } catch (Exception ex) { Assert.Fail($"Test clean up failed: {ex.Message}"); } }
public async Task RunSampleAsync() { string testConfigurationId = $"configuration{Random.Next(MaxRandomValue)}"; TwinConfiguration twinConfiguration = CreateSampleConfig(testConfigurationId); // Create a Twin Configuration. await CreateConfigurationAsync(twinConfiguration); // Get the Twin Configuration. await GetConfigurationAsync(twinConfiguration); // Update the Twin Configuration. await UpdateConfigurationAsync(twinConfiguration); // Delete the Twin Configuration. await DeleteConfigurationAsync(twinConfiguration); }
private TwinConfiguration CreateSampleConfig(string testConfigurationId) { var twinConfiguration = new TwinConfiguration { Id = testConfigurationId, Labels = { { "HostPlatform", "SomeValue" }, }, TargetCondition = "*", Priority = Random.Next(MaxRandomValue), }; twinConfiguration.Content = new ConfigurationContent(); twinConfiguration.Content.DeviceContent.Add("properties.desired.deviceContent_key", $"deviceContent_value-{twinConfiguration.Id}"); return(twinConfiguration); }
private TwinConfiguration CreateTestConfig(string testConfigurationId) { var twinConfiguration = new TwinConfiguration { Id = testConfigurationId }; // Labels are optional but adding here due to null check failure in deserialization // Also note that we are not setting Host Platform value from Environment since that'll fail in our build pipeline twinConfiguration.Labels.Add("HostPlatform", "SomeValue"); twinConfiguration.Content = new ConfigurationContent(); twinConfiguration.Content.DeviceContent.Add("properties.desired.deviceContent_key", $"deviceContent_value-{twinConfiguration.Id}"); // Specifying '*' to target all devices twinConfiguration.TargetCondition = "*"; // Assign any integer value for priority twinConfiguration.Priority = int.Parse(GetRandom()); return(twinConfiguration); }
public async Task ConfigurationsClient_GetConfigurations() { const int configurationsCount = 5; var twinConfigurations = new TwinConfiguration[configurationsCount]; var createdConfigurations = new TwinConfiguration[configurationsCount]; IReadOnlyList <TwinConfiguration> listConfigurations; IotHubServiceClient client = GetClient(); try { for (int i = 0; i < configurationsCount; i++) { twinConfigurations[i] = CreateTestConfig($"testconfigurations{i}{GetRandom()}"); // Create Configurations Response <TwinConfiguration> createResponse = await client.Configurations.CreateOrUpdateConfigurationAsync(twinConfigurations[i]).ConfigureAwait(false); createdConfigurations[i] = createResponse.Value; } // List the configurations for the client listConfigurations = (await client.Configurations.GetConfigurationsAsync().ConfigureAwait(false)).Value; IEnumerable <string> twinConfigurationsIds = listConfigurations.ToList().Select(configuration => configuration.Id); // Compare the response ids with created configurations for (int i = 0; i < configurationsCount; i++) { twinConfigurationsIds.Should().Contain(twinConfigurations[i].Id); } } finally { for (int i = 0; i < configurationsCount; i++) { await CleanupAsync(client, twinConfigurations[i]).ConfigureAwait(false); } } }
/// <summary> /// Deletes a twin configuration. /// </summary> /// <param name="twinConfiguration">Twin Configuration to delete.</param> public async Task DeleteConfigurationAsync(TwinConfiguration twinConfiguration) { SampleLogger.PrintHeader("DELETE A CONFIGURATION"); try { Console.WriteLine($"Deleting twin configuration with Id: '{twinConfiguration.Id}'"); #region Snippet:IotHubDeleteConfiguration Response response = await IoTHubServiceClient.Configurations .DeleteConfigurationAsync(twinConfiguration, IfMatchPrecondition.UnconditionalIfMatch) .ConfigureAwait(false); SampleLogger.PrintSuccess($"Successfully deleted twin configuration with Id: '{twinConfiguration.Id}'"); #endregion Snippet:IotHubDeleteConfiguration } catch (Exception ex) { SampleLogger.FatalError($"Failed to delete twin configuration due to:\n{ex}"); } }