private IDictionary <string, DeploymentStatus> GetDeviceStatuses(Configuration deployment) { string deploymentType = null; if (ConfigurationsHelper.IsEdgeDeployment(deployment)) { deploymentType = PackageType.EdgeManifest.ToString(); } else { deploymentType = PackageType.DeviceConfiguration.ToString(); } deployment.Labels.TryGetValue(ConfigurationsHelper.CONFIG_TYPE_LABEL, out string configType); IDictionary <QueryType, String> Queries = GetQueries(deploymentType, configType); string deploymentId = deployment.Id; var appliedDevices = this.GetDevicesInQuery(Queries[QueryType.APPLIED], deploymentId); var deviceWithStatus = new Dictionary <string, DeploymentStatus>(); if (!(ConfigurationsHelper.IsEdgeDeployment(deployment)) && !(configType.Equals(ConfigType.Firmware.ToString()))) { foreach (var devices in appliedDevices) { deviceWithStatus.Add(devices, DeploymentStatus.Unknown); } return(deviceWithStatus); } var successfulDevices = this.GetDevicesInQuery(Queries[QueryType.SUCCESSFUL], deploymentId); var failedDevices = this.GetDevicesInQuery(Queries[QueryType.FAILED], deploymentId); foreach (var successfulDevice in successfulDevices) { deviceWithStatus.Add(successfulDevice, DeploymentStatus.Succeeded); } foreach (var failedDevice in failedDevices) { deviceWithStatus.Add(failedDevice, DeploymentStatus.Failed); } foreach (var device in appliedDevices) { if (!successfulDevices.Contains(device) && !failedDevices.Contains(device)) { deviceWithStatus.Add(device, DeploymentStatus.Pending); } } return(deviceWithStatus); }
private IDictionary <string, DeploymentStatus> GetDeviceStatuses(Configuration deployment) { string deploymentType = null; if (ConfigurationsHelper.IsEdgeDeployment(deployment)) { deploymentType = PackageType.EdgeManifest.ToString(); } else { deploymentType = PackageType.DeviceConfiguration.ToString(); } deployment.Labels.TryGetValue(ConfigurationsHelper.ConfigTypeLabel, out string configType); var queries = GetQueries(deploymentType, configType); string deploymentId = deployment.Id; var appliedDevices = this.GetDevicesInQuery(queries[QueryType.APPLIED], deploymentId); var deviceWithStatus = new Dictionary <string, DeploymentStatus>(); if (!ConfigurationsHelper.IsEdgeDeployment(deployment) && !configType.Equals(ConfigType.Firmware.ToString())) { foreach (var devices in appliedDevices) { deviceWithStatus.Add(devices, DeploymentStatus.Unknown); } return(deviceWithStatus); } // Get reported status from custom Metrics if available otherwise use default queries var successfulDevices = this.GetDevicesInQuery(deployment.Metrics.Queries.ContainsKey(SuccessQueryName) ? deployment.Metrics.Queries[SuccessQueryName] : queries[QueryType.SUCCESSFUL], deploymentId); var failedDevices = this.GetDevicesInQuery(deployment.Metrics.Queries.ContainsKey(FailedQueryName) ? deployment.Metrics.Queries[FailedQueryName] : queries[QueryType.FAILED], deploymentId); foreach (var successfulDevice in successfulDevices) { deviceWithStatus.Add(successfulDevice, DeploymentStatus.Succeeded); } foreach (var failedDevice in failedDevices) { deviceWithStatus.Add(failedDevice, DeploymentStatus.Failed); } foreach (var device in appliedDevices) { if (!successfulDevices.Contains(device) && !failedDevices.Contains(device)) { deviceWithStatus.Add(device, DeploymentStatus.Pending); } } return(deviceWithStatus); }
public DeploymentServiceModel(Configuration deployment) { if (string.IsNullOrEmpty(deployment.Id)) { throw new ArgumentException($"Invalid deploymentId provided {deployment.Id}"); } this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.DeploymentNameLabel); this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.DeploymentGroupIdLabel); this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.RmCreatedLabel); this.Id = deployment.Id; this.Name = deployment.Labels[ConfigurationsHelper.DeploymentNameLabel]; this.CreatedDateTimeUtc = deployment.CreatedTimeUtc; this.DeviceGroupId = deployment.Labels[ConfigurationsHelper.DeploymentGroupIdLabel]; this.TargetCondition = deployment.TargetCondition; if (deployment.Labels.ContainsKey(ConfigurationsHelper.DeploymentGroupNameLabel)) { this.DeviceGroupName = deployment.Labels[ConfigurationsHelper.DeploymentGroupNameLabel]; } if (deployment.Labels.ContainsKey(ConfigurationsHelper.DeploymentPackageNameLabel)) { this.PackageName = deployment.Labels[ConfigurationsHelper.DeploymentPackageNameLabel]; } this.Priority = deployment.Priority; if (ConfigurationsHelper.IsEdgeDeployment(deployment)) { this.PackageType = PackageType.EdgeManifest; } else { this.PackageType = PackageType.DeviceConfiguration; } if (deployment.Labels.ContainsKey(ConfigurationsHelper.ConfigTypeLabel)) { this.ConfigType = deployment.Labels[ConfigurationsHelper.ConfigTypeLabel]; } else { this.ConfigType = string.Empty; } this.DeploymentMetrics = new DeploymentMetricsServiceModel(deployment.SystemMetrics, deployment.Metrics); }
// IoT SDK's configurations is a deployment for RM. public DeploymentServiceModel(Configuration deployment) { if (string.IsNullOrEmpty(deployment.Id)) { throw new ArgumentException($"Invalid deploymentId provided {deployment.Id}"); } this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.DEPLOYMENT_NAME_LABEL); this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.DEPLOYMENT_GROUP_ID_LABEL); this.VerifyConfigurationLabel(deployment, ConfigurationsHelper.RM_CREATED_LABEL); this.Id = deployment.Id; this.Name = deployment.Labels[ConfigurationsHelper.DEPLOYMENT_NAME_LABEL]; this.CreatedDateTimeUtc = deployment.CreatedTimeUtc; this.DeviceGroupId = deployment.Labels[ConfigurationsHelper.DEPLOYMENT_GROUP_ID_LABEL]; if (deployment.Labels.ContainsKey(ConfigurationsHelper.DEPLOYMENT_GROUP_NAME_LABEL)) { this.DeviceGroupName = deployment.Labels[ConfigurationsHelper.DEPLOYMENT_GROUP_NAME_LABEL]; } if (deployment.Labels.ContainsKey(ConfigurationsHelper.DEPLOYMENT_PACKAGE_NAME_LABEL)) { this.PackageName = deployment.Labels[ConfigurationsHelper.DEPLOYMENT_PACKAGE_NAME_LABEL]; } this.Priority = deployment.Priority; if (ConfigurationsHelper.IsEdgeDeployment(deployment)) { this.PackageType = PackageType.EdgeManifest; } else { this.PackageType = PackageType.DeviceConfiguration; } if (deployment.Labels.ContainsKey(ConfigurationsHelper.CONFIG_TYPE_LABEL)) { this.ConfigType = deployment.Labels[ConfigurationsHelper.CONFIG_TYPE_LABEL]; } else { this.ConfigType = PackageType.EdgeManifest.ToString(); } this.DeploymentMetrics = new DeploymentMetricsServiceModel(deployment.SystemMetrics, deployment.Metrics); }
private async Task <bool> UpdateMetricsOfCurrentDeployment(string deviceGroupId, int priority) { var deploymentsFromHub = await this.ListAsync(); var deploymentsOfDeviceGroup = deploymentsFromHub.Items.Where(i => i.DeviceGroupId == deviceGroupId).OrderByDescending(p => p.Priority).ThenByDescending(q => q.CreatedDateTimeUtc); if (deploymentsOfDeviceGroup != null && deploymentsOfDeviceGroup.Count() > 0) { var deployment = deploymentsOfDeviceGroup.First(); if (priority >= deployment.Priority) { var deploymentDetails = await this.GetDeploymentAsync(deployment.Id); DeploymentServiceModel currentDeployment = await this.GetDeploymentFromStorageAsync(deployment.Id); // Update the Device Statuses for the DeploymentId for future references. currentDeployment.DeploymentMetrics = new DeploymentMetricsServiceModel(deploymentDetails.SystemMetrics, deploymentDetails.Metrics); currentDeployment.DeploymentMetrics.DeviceStatuses = this.GetDeviceStatuses(deploymentDetails); var deviceTwins = await this.GetDeviceProperties(currentDeployment.DeploymentMetrics.DeviceStatuses.Keys); // Since the deployment that will be created have highest priority, remove latest tag on current deployment if (currentDeployment?.Tags != null) { var existingTag = currentDeployment.Tags.FirstOrDefault(t => t.Equals(LatestTag, StringComparison.OrdinalIgnoreCase)); if (existingTag != null) { currentDeployment.Tags.Remove(existingTag); } } var value = JsonConvert.SerializeObject( currentDeployment, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, }); await this.client.UpdateAsync(DeploymentsCollection, currentDeployment.Id, value, currentDeployment.ETag); await this.StoreDevicePropertiesInStorage(deviceTwins, currentDeployment.Id); if (ConfigurationsHelper.IsEdgeDeployment(deploymentDetails)) { var moduleTwins = await this.GetDeviceProperties(currentDeployment.DeploymentMetrics.DeviceStatuses.Keys, PackageType.EdgeManifest); await this.StoreModuleTwinsInStorage(moduleTwins, currentDeployment.Id); } // Since the deployment that will be created have highest priority, mark it as the latest return(true); } else { return(false); } } return(true); }