// Check whether the simulation is running with the conn string in the configuration
        private bool IsPreprovisionedIoTHubInUse(IServicesConfig servicesConfig, IIotHubConnectionStringManager connectionStringManager)
        {
            var csInUse  = connectionStringManager.GetIotHubConnectionString().ToLowerInvariant().Trim();
            var csInConf = servicesConfig?.IoTHubConnString?.ToLowerInvariant().Trim();

            return(csInUse == csInConf);
        }
Exemple #2
0
        public async Task ValidateInputRequestAsync(ILogger log, IIotHubConnectionStringManager connectionStringManager)
        {
            const string NO_DEVICE_MODEL            = "The simulation doesn't contain any device model";
            const string ZERO_DEVICES               = "The simulation has zero devices";
            const string END_TIME_BEFORE_START_TIME = "The simulation End Time must be after the Start Time";
            const string INVALID_DATE               = "Invalid date format";
            const string CANNOT_RUN_IN_THE_PAST     = "The simulation end date is in the past";
            const string NO_IOTHUB_CONNSTRING       = "The simulation doesn't contain any IoTHub connection string";

            // A simulation must contain at least one device model
            if (this.DeviceModels.Count < 1)
            {
                log.Error(NO_DEVICE_MODEL, () => new { simulation = this });
                throw new BadRequestException(NO_DEVICE_MODEL);
            }

            // A simulation must use at least one device
            if (this.DeviceModels.Sum(x => x.Count) < 1)
            {
                log.Error(ZERO_DEVICES, () => new { simulation = this });
                throw new BadRequestException(ZERO_DEVICES);
            }

            try
            {
                var now       = DateTimeOffset.UtcNow;
                var startTime = DateHelper.ParseDateExpression(this.StartTime, now);
                var endTime   = DateHelper.ParseDateExpression(this.EndTime, now);
                // The start time must be before the end time
                if (startTime.HasValue && endTime.HasValue && startTime.Value.Ticks >= endTime.Value.Ticks)
                {
                    log.Error(END_TIME_BEFORE_START_TIME, () => new { simulation = this });
                    throw new BadRequestException(END_TIME_BEFORE_START_TIME);
                }

                // The end time cannot be in the past
                if (endTime.HasValue && endTime.Value.Ticks <= now.Ticks)
                {
                    log.Error(CANNOT_RUN_IN_THE_PAST, () => new { simulation = this });
                    throw new BadRequestException(CANNOT_RUN_IN_THE_PAST);
                }
            }
            catch (InvalidDateFormatException e)
            {
                log.Error(INVALID_DATE, () => new { simulation = this });
                throw new BadRequestException(INVALID_DATE, e);
            }

            // A simulation contains at least one iothub connect string
            if (this.IotHubs.Count == 0)
            {
                throw new BadRequestException(NO_IOTHUB_CONNSTRING);
            }

            foreach (var iotHub in this.IotHubs)
            {
                await connectionStringManager.ValidateConnectionStringAsync(iotHub.ConnectionString);
            }
        }
Exemple #3
0
 public SimulationsController(
     ISimulations simulationsService,
     IIotHubConnectionStringManager connectionStringManager,
     ILogger logger)
 {
     this.simulationsService      = simulationsService;
     this.connectionStringManager = connectionStringManager;
     this.log = logger;
 }
 public Devices(
     IServicesConfig config,
     IIotHubConnectionStringManager connStringManager,
     IRegistryManager registryManager,
     ILogger logger)
 {
     this.connectionStringManager = connStringManager;
     this.registry = registryManager;
     this.log      = logger;
     this.twinReadsWritesEnabled = config.TwinReadWriteEnabled;
     this.registryCount          = -1;
     this.setupDone = false;
 }
 public Simulations(
     IDeviceModels deviceModels,
     IStorageAdapterClient storage,
     IIotHubConnectionStringManager connectionStringManager,
     IDevices devices,
     ILogger logger)
 {
     this.deviceModels            = deviceModels;
     this.storage                 = storage;
     this.connectionStringManager = connectionStringManager;
     this.devices                 = devices;
     this.log = logger;
 }
 public SimulationsController(
     ISimulations simulationsService,
     IIotHubConnectionStringManager connectionStringManager,
     IIothubMetrics iothubMetrics,
     IPreprovisionedIotHub preprovisionedIotHub,
     ISimulationAgent simulationAgent,
     ILogger logger)
 {
     this.simulationsService      = simulationsService;
     this.connectionStringManager = connectionStringManager;
     this.iothubMetrics           = iothubMetrics;
     this.simulationAgent         = simulationAgent;
     this.log = logger;
 }
Exemple #7
0
 /// <summary>Map a service model to the corresponding API model</summary>
 public SimulationListApiModel(
     IEnumerable <Services.Models.Simulation> simulations,
     IServicesConfig servicesConfig,
     IDeploymentConfig deploymentConfig,
     IIotHubConnectionStringManager connectionStringManager,
     ISimulationRunner simulationRunner,
     IRateLimiting rateReporter)
 {
     this.Items = new List <SimulationApiModel.SimulationApiModel>();
     foreach (var x in simulations)
     {
         this.Items.Add(SimulationApiModel.SimulationApiModel.FromServiceModel(
                            x, servicesConfig, deploymentConfig, connectionStringManager, simulationRunner, rateReporter));
     }
 }
 public Devices(
     IServicesConfig config,
     IIotHubConnectionStringManager connStringManager,
     IRegistryManager registryManager,
     IDeviceClientWrapper deviceClient,
     ILogger logger)
 {
     this.config = config;
     this.connectionStringManager = connStringManager;
     this.connString             = null;
     this.registry               = registryManager;
     this.deviceClient           = deviceClient;
     this.log                    = logger;
     this.twinReadsWritesEnabled = config.TwinReadWriteEnabled;
     this.setupDone              = false;
 }
Exemple #9
0
        // Append additional Hub properties and Statistics
        private async Task AppendHubPropertiesAndStatisticsAsync(
            IServicesConfig servicesConfig,
            IDeploymentConfig deploymentConfig,
            IIotHubConnectionStringManager connectionStringManager,
            ISimulationRunner simulationRunner,
            IRateLimiting rateReporter)
        {
            var isRunning = this.Running == true;

            foreach (var iotHub in this.IotHubs)
            {
                // Preprovisioned IoT hub status
                var isHubPreprovisioned = this.IsHubConnectionStringConfigured(servicesConfig);

                if (isHubPreprovisioned && isRunning)
                {
                    iotHub.PreprovisionedIoTHubInUse = await this.IsPreprovisionedIoTHubInUseAsync(servicesConfig, connectionStringManager);

                    iotHub.PreprovisionedIoTHubMetricsUrl = await this.GetIoTHubMetricsUrlAsync(servicesConfig, deploymentConfig, connectionStringManager);
                }
            }

            if (isRunning)
            {
                // Average messages per second frequency in the last minutes
                this.Statistics.AverageMessagesPerSecond = rateReporter.GetThroughputForMessages();

                // Total messages count
                this.Statistics.TotalMessagesSent = simulationRunner.TotalMessagesCount;

                // Active devices count
                this.Statistics.ActiveDevicesCount = simulationRunner.ActiveDevicesCount;

                // Failed telemetry messages count
                this.Statistics.FailedMessagesCount = simulationRunner.FailedMessagesCount;

                // Failed device connections count
                this.Statistics.FailedDeviceConnectionsCount = simulationRunner.FailedDeviceConnectionsCount;

                // Failed device connections count
                this.Statistics.FailedDeviceTwinUpdatesCount = simulationRunner.FailedDeviceTwinUpdatesCount;

                // Simulation errors count
                this.Statistics.SimulationErrorsCount = simulationRunner.SimulationErrorsCount;
            }
        }
 public Simulations(
     IServicesConfig config,
     IDeviceModels deviceModels,
     IFactory factory,
     IStorageAdapterClient storageAdapterClient,
     IIotHubConnectionStringManager connectionStringManager,
     IDevices devices,
     ILogger logger,
     IDiagnosticsLogger diagnosticsLogger)
 {
     this.deviceModels            = deviceModels;
     this.storageAdapterClient    = storageAdapterClient;
     this.simulationsStorage      = factory.Resolve <IStorageRecords>().Init(config.SimulationsStorage);
     this.connectionStringManager = connectionStringManager;
     this.devices           = devices;
     this.log               = logger;
     this.diagnosticsLogger = diagnosticsLogger;
 }
Exemple #11
0
        public Devices(
            IServicesConfig config,
            IIotHubConnectionStringManager connStringManager,
            IRegistryManager registryManager,
            IDeviceClientWrapper deviceClient,
            ILogger logger,
            IDiagnosticsLogger diagnosticsLogger,
            IInstance instance)
        {
            this.config = config;
            this.connectionStringManager = connStringManager;
            this.registry          = registryManager;
            this.deviceClient      = deviceClient;
            this.log               = logger;
            this.diagnosticsLogger = diagnosticsLogger;
            this.instance          = instance;

            this.connString             = null;
            this.twinReadsWritesEnabled = config.TwinReadWriteEnabled;
        }
 public SimulationsController(
     ISimulations simulationsService,
     IServicesConfig servicesConfig,
     IDeploymentConfig deploymentConfig,
     IIotHubConnectionStringManager connectionStringManager,
     IPreprovisionedIotHub preprovisionedIotHub,
     ISimulationAgent simulationAgent,
     ISimulationRunner simulationRunner,
     IRateLimiting rateReporter,
     ILogger logger)
 {
     this.simulationsService      = simulationsService;
     this.servicesConfig          = servicesConfig;
     this.deploymentConfig        = deploymentConfig;
     this.connectionStringManager = connectionStringManager;
     this.simulationAgent         = simulationAgent;
     this.simulationRunner        = simulationRunner;
     this.rateReporter            = rateReporter;
     this.log = logger;
 }
 public StatusController(
     IPreprovisionedIotHub preprovisionedIotHub,
     IStorageAdapterClient storage,
     ISimulations simulations,
     ILogger logger,
     IServicesConfig servicesConfig,
     IDeploymentConfig deploymentConfig,
     IIotHubConnectionStringManager connectionStringManager,
     ISimulationRunner simulationRunner,
     IRateLimiting rateLimiting)
 {
     this.preprovisionedIotHub = preprovisionedIotHub;
     this.storage                 = storage;
     this.simulations             = simulations;
     this.log                     = logger;
     this.servicesConfig          = servicesConfig;
     this.deploymentConfig        = deploymentConfig;
     this.connectionStringManager = connectionStringManager;
     this.simulationRunner        = simulationRunner;
     this.rateReporter            = rateLimiting;
 }
        // If the simulation is running with the conn string in the config then return a URL to the metrics
        private string GetIoTHubMetricsUrl(IServicesConfig servicesConfig, IDeploymentConfig deploymentConfig, IIotHubConnectionStringManager connectionStringManager)
        {
            var csInUse  = connectionStringManager.GetIotHubConnectionString().ToLowerInvariant().Trim();
            var csInConf = servicesConfig?.IoTHubConnString?.ToLowerInvariant().Trim();

            // Return the URL only when the simulation is running with the configured conn string
            if (csInUse != csInConf)
            {
                return(string.Empty);
            }

            return($"https://portal.azure.com/{deploymentConfig.AzureSubscriptionDomain}" +
                   $"#resource/subscriptions/{deploymentConfig.AzureSubscriptionId}" +
                   $"/resourceGroups/{deploymentConfig.AzureResourceGroup}" +
                   $"/providers/Microsoft.Devices/IotHubs/{deploymentConfig.AzureIothubName}/Metrics");
        }
        // Map service model to API model
        public static SimulationApiModel FromServiceModel(
            Simulation value,
            IServicesConfig servicesConfig,
            IDeploymentConfig deploymentConfig,
            IIotHubConnectionStringManager connectionStringManager,
            ISimulationRunner simulationRunner,
            IRateLimiting rateReporter)
        {
            if (value == null)
            {
                return(null);
            }

            var result = new SimulationApiModel
            {
                ETag        = value.ETag,
                Id          = value.Id,
                Name        = value.Name,
                Description = value.Description,
                Enabled     = value.Enabled,
                Running     = value.ShouldBeRunning,
                StartTime   = value.StartTime.ToString(),
                EndTime     = value.EndTime.ToString(),
                StoppedTime = value.StoppedTime.ToString(),
                IotHubs     = new List <SimulationIotHub>()
            };

            foreach (var iotHubConnectionString in value.IotHubConnectionStrings)
            {
                var iotHub = new SimulationIotHub {
                    ConnectionString = iotHubConnectionString
                };
                result.IotHubs.Add(iotHub);
            }

            // Ignore the date if the simulation doesn't have a start time
            if (value.StartTime.HasValue && !value.StartTime.Value.Equals(DateTimeOffset.MinValue))
            {
                result.StartTime = value.StartTime?.ToString(DATE_FORMAT);
            }

            // Ignore the date if the simulation doesn't have an end time
            if (value.EndTime.HasValue && !value.EndTime.Value.Equals(DateTimeOffset.MaxValue))
            {
                result.EndTime = value.EndTime?.ToString(DATE_FORMAT);
            }

            // Ignore the date if the simulation doesn't have an end time
            if (value.StoppedTime.HasValue && !value.StoppedTime.Value.Equals(DateTimeOffset.MaxValue))
            {
                result.StoppedTime = value.StoppedTime?.ToString(DATE_FORMAT);
            }

            result.DeviceModels = SimulationDeviceModelRef.FromServiceModel(value.DeviceModels);
            result.Statistics   = SimulationStatistics.FromServiceModel(value.Statistics);
            result.created      = value.Created;
            result.modified     = value.Modified;

            result.AppendHubPropertiesAndStatistics(servicesConfig, deploymentConfig, connectionStringManager, simulationRunner, rateReporter);

            return(result);
        }
Exemple #16
0
        // Check whether the simulation is running with the conn string in the configuration
        private async Task <bool> IsPreprovisionedIoTHubInUseAsync(IServicesConfig servicesConfig, IIotHubConnectionStringManager connectionStringManager)
        {
            var csInUse  = (await connectionStringManager.GetConnectionStringAsync()).ToLowerInvariant().Trim();
            var csInConf = servicesConfig?.IoTHubConnString?.ToLowerInvariant().Trim();

            return(csInUse == csInConf);
        }