Esempio n. 1
0
        // This method updates local state and should be called only after acquiring edgeHubConfigLock
        async Task <Option <EdgeHubConfig> > GetConfigInternal()
        {
            Option <EdgeHubConfig> edgeHubConfig;

            try
            {
                Core.IMessage message = await this.twinManager.GetTwinAsync(this.id);

                Twin twin = this.twinMessageConverter.FromMessage(message);
                this.lastDesiredProperties = Option.Some(twin.Properties.Desired);
                try
                {
                    var desiredProperties = JsonConvert.DeserializeObject <EdgeHubDesiredProperties>(twin.Properties.Desired.ToJson());
                    edgeHubConfig = Option.Some(EdgeHubConfigParser.GetEdgeHubConfig(desiredProperties, this.routeFactory));
                    await this.UpdateReportedProperties(twin.Properties.Desired.Version, new LastDesiredStatus(200, string.Empty));

                    Events.GetConfigSuccess();
                }
                catch (Exception ex)
                {
                    await this.UpdateReportedProperties(twin.Properties.Desired.Version, new LastDesiredStatus(400, $"Error while parsing desired properties - {ex.Message}"));

                    throw;
                }
            }
            catch (Exception ex)
            {
                edgeHubConfig = Option.None <EdgeHubConfig>();
                Events.ErrorGettingEdgeHubConfig(ex);
            }

            return(edgeHubConfig);
        }
        public async Task <Option <EdgeHubConfig> > GetConfig()
        {
            try
            {
                Option <IMessage> twinMessage = await this.twinManager.GetCachedTwinAsync(this.id);

                var config = twinMessage.FlatMap((message) =>
                {
                    Shared.Twin twin = this.twinMessageConverter.FromMessage(message);

                    if (twin.Properties.Desired.Count > 0)
                    {
                        var desiredProperties = JsonConvert.DeserializeObject <EdgeHubDesiredProperties>(twin.Properties.Desired.ToJson());
                        return(Option.Some(EdgeHubConfigParser.GetEdgeHubConfig(desiredProperties, this.routeFactory)));
                    }
                    else
                    {
                        return(Option.None <EdgeHubConfig>());
                    }
                });

                return(config);
            }
            catch (Exception e)
            {
                Log.LogWarning(HubCoreEventIds.LocalEdgeHubConfig, e, "Failed to get local config");
                return(Option.None <EdgeHubConfig>());
            }
        }
Esempio n. 3
0
        // This method updates local state and should be called only after acquiring edgeHubConfigLock
        async Task <Option <EdgeHubConfig> > PatchDesiredProperties(TwinCollection baseline, TwinCollection patch)
        {
            LastDesiredStatus      lastDesiredStatus;
            Option <EdgeHubConfig> edgeHubConfig;

            try
            {
                string desiredPropertiesJson = JsonEx.Merge(baseline, patch, true);
                this.lastDesiredProperties = Option.Some(new TwinCollection(desiredPropertiesJson));
                var desiredPropertiesPatch = JsonConvert.DeserializeObject <EdgeHubDesiredProperties>(desiredPropertiesJson);
                edgeHubConfig     = Option.Some(EdgeHubConfigParser.GetEdgeHubConfig(desiredPropertiesPatch, this.routeFactory));
                lastDesiredStatus = new LastDesiredStatus(200, string.Empty);
                Events.PatchConfigSuccess();
            }
            catch (Exception ex)
            {
                lastDesiredStatus = new LastDesiredStatus(400, $"Error while parsing desired properties - {ex.Message}");
                edgeHubConfig     = Option.None <EdgeHubConfig>();
                Events.ErrorPatchingDesiredProperties(ex);
            }

            await this.UpdateReportedProperties(patch.Version, lastDesiredStatus);

            return(edgeHubConfig);
        }
Esempio n. 4
0
        public TwinConfigSource(
            EdgeHubConnection edgeHubConnection,
            string id,
            VersionInfo versionInfo,
            ITwinManager twinManager,
            Core.IMessageConverter <Twin> messageConverter,
            Core.IMessageConverter <TwinCollection> twinCollectionMessageConverter,
            EdgeHubConfigParser configParser)
        {
            this.edgeHubConnection = Preconditions.CheckNotNull(edgeHubConnection, nameof(edgeHubConnection));
            this.id                             = Preconditions.CheckNotNull(id, nameof(id));
            this.twinManager                    = Preconditions.CheckNotNull(twinManager, nameof(twinManager));
            this.twinMessageConverter           = Preconditions.CheckNotNull(messageConverter, nameof(messageConverter));
            this.twinCollectionMessageConverter = twinCollectionMessageConverter;
            this.configParser                   = Preconditions.CheckNotNull(configParser, nameof(configParser));
            this.versionInfo                    = versionInfo ?? VersionInfo.Empty;

            this.edgeHubConnection.SetDesiredPropertiesUpdateCallback((message) => this.HandleDesiredPropertiesUpdate(message));
        }