Exemplo n.º 1
0
        static async Task <int> Main(string[] args)
        {
            var connectionString = Environment.GetEnvironmentVariable(IotHubConnectionStringEnvVar);

            if (string.IsNullOrWhiteSpace(connectionString))
            {
                Console.Error.WriteLine($"Environment variable for '{IotHubConnectionStringEnvVar}' is not defined");
                return(-1);
            }

            var devicePrefix = Environment.GetEnvironmentVariable(DevicePrefixEnvVar);

            if (string.IsNullOrWhiteSpace(devicePrefix))
            {
                devicePrefix = "sim";
            }

            if (!int.TryParse(Environment.GetEnvironmentVariable(DeviceCountEnvVar), out var deviceCount) || deviceCount < 1)
            {
                deviceCount = 1;
            }

            if (!int.TryParse(Environment.GetEnvironmentVariable(DeviceIndexEnvVar), out var deviceIndex) || deviceIndex < 0)
            {
                deviceIndex = 1;
            }

            bool isCreateOperation = true;

            if (string.Equals(Environment.GetEnvironmentVariable(OperationNameEnvVar), DeleteOperationNameEnvVar, StringComparison.OrdinalIgnoreCase))
            {
                var isDeleteConfirmed = string.Equals(Environment.GetEnvironmentVariable(DeleteConfirmationEnvVar), DeleteConfirmationResponseEnvVar, StringComparison.OrdinalIgnoreCase);
                if (!isDeleteConfirmed)
                {
                    Console.WriteLine($"Delete operations must be confirmed with an additional environment variable {DeleteConfirmationEnvVar}={DeleteConfirmationResponseEnvVar}");
                    return(-1);
                }

                isCreateOperation = false;
            }


            RegistryManager registryManager = null;

            try
            {
                registryManager = RegistryManager.CreateFromConnectionString(connectionString);
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("Failed connecting to IoT Hub registry, check the connection string value\n" + ex.ToString());
                return(1);
            }

            try
            {
                await registryManager.OpenAsync();
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("Failed connecting to IoT Hub registry.\n" + ex.ToString());
                return(1);
            }

            var deviceIdCollection = Enumerable.Range(deviceIndex, deviceCount)
                                     .Select(n => $"{devicePrefix}{n.ToString("000000")}");

            var registryManagerTasks = new List <Task>();

            var stats = new DeviceProvisionStats();

            if (isCreateOperation)
            {
                Console.WriteLine($"Starting device provisioning");
            }
            else
            {
                Console.WriteLine($"Starting device deletion");
            }

            var timer = Stopwatch.StartNew();

            foreach (var partition in Partitioner.Create(deviceIdCollection).GetPartitions(ParallelizationLevel))
            {
                if (isCreateOperation)
                {
                    registryManagerTasks.Add(Task.Run(() => CreateDevicesAsync(partition, registryManager, stats)));
                }
                else
                {
                    registryManagerTasks.Add(Task.Run(() => DeleteDevicesAsync(partition, registryManager, stats)));
                }
            }

            try
            {
                await Task.WhenAll(registryManagerTasks);
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
            }

            timer.Stop();
            Console.WriteLine($"Finished device provisioning");
            Console.WriteLine($"Device count = {deviceCount}");
            Console.WriteLine($"Total devices created = {stats.TotalCreated}");
            Console.WriteLine($"Total devices deleted = {stats.TotalDeleted}");
            Console.WriteLine($"Total errors = {stats.TotalErrors}");
            Console.WriteLine($"Time = {timer.ElapsedMilliseconds}ms");

            return(0);
        }
Exemplo n.º 2
0
        private static async Task BulkCreateDevicesAsync(List <Device> devices, RegistryManager registryManager, DeviceProvisionStats stats)
        {
            try
            {
                var bulkResult = await registryManager.AddDevices2Async(devices);

                var totalErrors  = bulkResult?.Errors?.Length ?? 0;
                var totalCreated = devices.Count - totalErrors;
                if (totalCreated > 0)
                {
                    stats.IncrementCreated(totalCreated);
                }

                if (totalErrors > 0)
                {
                    stats.IncrementErrors(totalErrors);
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
            }
        }
Exemplo n.º 3
0
        private static async Task DeleteDevicesAsync(IEnumerator <string> deviceIds, RegistryManager registryManager, DeviceProvisionStats stats)
        {
            while (deviceIds.MoveNext())
            {
                var deviceId = deviceIds.Current;

                try
                {
                    await registryManager.RemoveDeviceAsync(deviceId);

                    stats.IncrementDeleted(1);
                }
                catch
                {
                    stats.IncrementErrors(1);
                }
            }
        }
Exemplo n.º 4
0
        private static async Task CreateDevicesAsync(IEnumerator <string> deviceIds, RegistryManager registryManager, DeviceProvisionStats stats)
        {
            var devices = new List <Device>();

            while (deviceIds.MoveNext())
            {
                var deviceId = deviceIds.Current;

                devices.Add(new Device(deviceId));

                if (devices.Count == CreateOperationBulkSize)
                {
                    await BulkCreateDevicesAsync(devices, registryManager, stats);

                    devices.Clear();
                }
            }

            if (devices.Count > 0)
            {
                await BulkCreateDevicesAsync(devices, registryManager, stats);
            }
        }