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));
        }
Beispiel #4
0
        /// <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;
            }
        }
Beispiel #5
0
        /// <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;
            }
        }
Beispiel #6
0
        /// <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}");
     }
 }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
                }
            }
        }
Beispiel #13
0
        /// <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}");
            }
        }