in src/Azure.IIoT.OpcUa.Publisher/src/Runtime/PublisherConfig.cs [152:449]
public override void PostConfigure(string? name, PublisherOptions options)
{
options.DisableResourceMonitoring ??= GetBoolOrNull(DisableResourceMonitoringKey);
options.PublisherId ??= GetStringOrDefault(PublisherIdKey,
_identity?.Identity ?? Dns.GetHostName());
options.SiteId ??= GetStringOrDefault(SiteIdKey);
options.PublishedNodesFile ??= GetStringOrDefault(PublishedNodesFileKey);
options.UseFileChangePolling ??= GetBoolOrNull(UseFileChangePollingKey);
if (options.DefaultTransport == null && Enum.TryParse<WriterGroupTransport>(
GetStringOrDefault(DefaultTransportKey), out var transport))
{
options.DefaultTransport = transport;
}
options.UseStandardsCompliantEncoding ??= GetBoolOrDefault(
UseStandardsCompliantEncodingKey, UseStandardsCompliantEncodingDefault);
if (options.MessagingProfile == null)
{
if (!Enum.TryParse<MessagingMode>(GetStringOrDefault(MessagingModeKey),
out var messagingMode))
{
messagingMode = options.UseStandardsCompliantEncoding == true ?
MessagingMode.PubSub : MessagingMode.Samples;
}
if (GetBoolOrDefault(FullFeaturedMessageKey, false))
{
if (messagingMode == MessagingMode.PubSub)
{
messagingMode = MessagingMode.FullNetworkMessages;
}
if (messagingMode == MessagingMode.Samples)
{
messagingMode = MessagingMode.FullSamples;
}
}
if (!Enum.TryParse<MessageEncoding>(GetStringOrDefault(MessageEncodingKey),
out var messageEncoding))
{
messageEncoding = MessageEncodingDefault;
}
if (!MessagingProfile.IsSupported(messagingMode, messageEncoding))
{
var supported = MessagingProfile.Supported
.Select(p => $"\n(--mm {p.MessagingMode} and --me {p.MessageEncoding})")
.Aggregate((a, b) => $"{a}, {b}");
throw new ConfigurationErrorsException(
"The specified combination of --mm, and --me is not (yet) supported." +
$" Currently supported combinations are: {supported}");
}
options.MessagingProfile = MessagingProfile.Get(messagingMode, messageEncoding);
}
options.CreatePublishFileIfNotExist ??= GetBoolOrNull(
CreatePublishFileIfNotExistKey);
options.RenewTlsCertificateOnStartup ??= GetBoolOrNull(
RenewTlsCertificateOnStartupKey);
if (options.MaxNodesPerDataSet == 0)
{
options.MaxNodesPerDataSet = GetIntOrDefault(MaxNodesPerDataSetKey,
MaxNodesPerDataSetDefault);
}
//
// Default to batch size of 50 if not using strict encoding and a
// transport was not specified to support backcompat with 2.8
//
options.BatchSize ??= GetIntOrDefault(BatchSizeKey,
options.UseStandardsCompliantEncoding == true ||
options.DefaultTransport != null ? 0 : BatchSizeLegacyDefault);
if (options.BatchTriggerInterval == null)
{
//
// Default to batch interval of 10 seconds if not using strict encoding
// and a transport was not specified to support backcompat with 2.8
//
options.BatchTriggerInterval = GetDurationOrNull(BatchTriggerIntervalKey) ??
TimeSpan.FromMilliseconds(GetIntOrDefault(BatchTriggerIntervalKey,
options.UseStandardsCompliantEncoding == true ||
options.DefaultTransport != null ? 0 : BatchTriggerIntervalLLegacyDefaultMillis));
}
options.WriteValueWhenDataSetHasSingleEntry
??= GetBoolOrNull(WriteValueWhenDataSetHasSingleEntryKey);
options.RemoveDuplicatesFromBatch ??= GetBoolOrNull(RemoveDuplicatesFromBatchKey);
options.MaxNetworkMessageSendQueueSize ??= GetIntOrDefault(MaxNetworkMessageSendQueueSizeKey,
MaxNetworkMessageSendQueueSizeDefault);
options.DefaultWriterGroupPartitions ??= GetIntOrNull(DefaultWriterGroupPartitionCountKey);
options.IgnoreConfiguredPublishingIntervals ??= GetBoolOrDefault(IgnoreConfiguredPublishingIntervalsKey,
IgnoreConfiguredPublishingIntervalsDefault);
if (options.TopicTemplates.Root == null)
{
options.TopicTemplates.Root = GetStringOrDefault(
RootTopicTemplateKey, RootTopicTemplateDefault);
}
if (options.TopicTemplates.Method == null)
{
options.TopicTemplates.Method = GetStringOrDefault(
MethodTopicTemplateKey, MethodTopicTemplateDefault);
}
if (options.TopicTemplates.Events == null)
{
options.TopicTemplates.Events = GetStringOrDefault(
EventsTopicTemplateKey, EventsTopicTemplateDefault);
}
if (options.TopicTemplates.Diagnostics == null)
{
options.TopicTemplates.Diagnostics = GetStringOrDefault(
DiagnosticsTopicTemplateKey, DiagnosticsTopicTemplateDefault);
}
if (options.TopicTemplates.Telemetry == null)
{
options.TopicTemplates.Telemetry = GetStringOrDefault(
TelemetryTopicTemplateKey,
TelemetryTopicTemplateDefault);
}
if (options.TopicTemplates.DataSetMetaData == null)
{
options.TopicTemplates.DataSetMetaData = GetStringOrDefault(
DataSetMetaDataTopicTemplateKey);
}
if (options.TopicTemplates.Schema == null)
{
options.TopicTemplates.Schema = GetStringOrDefault(
SchemaTopicTemplateKey, SchemaTopicTemplateDefault);
}
options.DisableOpenApiEndpoint ??= GetBoolOrNull(DisableOpenApiEndpointKey);
options.EnableRuntimeStateReporting ??= GetBoolOrDefault(
EnableRuntimeStateReportingKey, EnableRuntimeStateReportingDefault);
options.RuntimeStateRoutingInfo ??= GetStringOrDefault(
RuntimeStateRoutingInfoKey, RuntimeStateRoutingInfoDefault);
options.ScaleTestCount ??= GetIntOrDefault(ScaleTestCountKey,
ScaleTestCountDefault);
if (options.DebugLogNotificationsFilter == null)
{
options.DebugLogNotificationsFilter =
GetStringOrDefault(DebugLogNotificationsFilterKey);
options.DebugLogNotifications ??=
(options.DebugLogNotificationsFilter != null ? true : null);
}
if (options.DebugLogNotificationsWithHeartbeat == null)
{
options.DebugLogNotificationsWithHeartbeat =
GetBoolOrDefault(DebugLogNotificationsWithHeartbeatKey);
options.DebugLogNotifications ??= options.DebugLogNotifications;
}
options.DebugLogNotifications ??= GetBoolOrDefault(DebugLogNotificationsKey);
options.DebugLogEncodedNotifications ??= GetBoolOrDefault(DebugLogEncodedNotificationsKey);
if (options.DiagnosticsInterval == null)
{
options.DiagnosticsInterval = GetDurationOrNull(DiagnosticsIntervalKey) ??
TimeSpan.FromMilliseconds(GetIntOrDefault(DiagnosticsIntervalKey,
DiagnosticsIntervalDefaultMillis));
}
if (options.DiagnosticsTarget == null)
{
if (!Enum.TryParse<PublisherDiagnosticTargetType>(
GetStringOrDefault(DiagnosticsTargetKey), out var target))
{
target = PublisherDiagnosticTargetType.Logger;
}
options.DiagnosticsTarget = target;
}
options.EnableDataSetRoutingInfo ??= GetBoolOrDefault(
EnableDataSetRoutingInfoKey, EnableDataSetRoutingInfoDefault);
options.ForceCredentialEncryption ??= GetBoolOrDefault(
ForceCredentialEncryptionKey);
options.MaxNetworkMessageSize ??= GetIntOrNull(IoTHubMaxMessageSizeKey);
options.DefaultMaxDataSetMessagesPerPublish ??= (uint?)GetIntOrNull(
DefaultMaxMessagesPerPublishKey);
if (options.DefaultQualityOfService == null)
{
if (!Enum.TryParse<QoS>(GetStringOrDefault(DefaultQualityOfServiceKey),
out var qos))
{
qos = QoS.AtLeastOnce;
}
options.DefaultQualityOfService = qos;
}
if (options.DefaultMessageTimeToLive == null)
{
var ttl = GetIntOrNull(DefaultMessageTimeToLiveKey);
options.DefaultMessageTimeToLive = ttl.HasValue ?
TimeSpan.FromMilliseconds(ttl.Value) : GetDurationOrNull(
DefaultMessageTimeToLiveKey);
}
options.DefaultMessageRetention = GetBoolOrNull(DefaultMessageRetentionKey);
if (options.MessageTimestamp == null)
{
if (!Enum.TryParse<MessageTimestamp>(GetStringOrDefault(MessageTimestampKey),
out var messageTimestamp))
{
messageTimestamp = MessageTimestamp.CurrentTimeUtc;
}
options.MessageTimestamp = messageTimestamp;
}
if (options.DefaultNamespaceFormat == null)
{
if (!Enum.TryParse<NamespaceFormat>(GetStringOrDefault(DefaultNamespaceFormatKey),
out var namespaceFormat))
{
namespaceFormat = options.UseStandardsCompliantEncoding == true ?
NamespaceFormat.Expanded : NamespaceFormat.Uri;
}
options.DefaultNamespaceFormat = namespaceFormat;
}
options.UnsecureHttpServerPort ??= GetIntOrNull(
UnsecureHttpServerPortKey, UnsecureHttpServerPortDefault);
options.HttpServerPort ??= GetIntOrNull(
HttpServerPortKey, HttpServerPortDefault);
options.ApiKeyOverride ??= GetStringOrDefault(ApiKeyOverrideKey);
if (options.DefaultDataSetRouting == null &&
Enum.TryParse<DataSetRoutingMode>(GetStringOrDefault(DefaultDataSetRoutingKey),
out var routingMode))
{
options.DefaultDataSetRouting = routingMode;
}
var schemaNamespace = GetStringOrDefault(SchemaNamespaceKey);
var avroPreferred = GetBoolOrNull(PreferAvroOverJsonSchemaKey);
if (schemaNamespace != null || avroPreferred != null ||
GetBoolOrDefault(PublishMessageSchemaKey))
{
options.SchemaOptions ??= new SchemaOptions();
}
if (options.SchemaOptions != null)
{
options.SchemaOptions.Namespace ??= schemaNamespace;
options.SchemaOptions.PreferAvroOverJsonSchema ??= avroPreferred;
}
options.DisableComplexTypeSystem ??= GetBoolOrNull(DisableComplexTypeSystemKey);
options.DisableDataSetMetaData = options.DisableComplexTypeSystem;
// Set a default from the strict setting
options.DisableDataSetMetaData ??= GetBoolOrDefault(DisableDataSetMetaDataKey,
!(options.UseStandardsCompliantEncoding ?? false));
if (options.SchemaOptions != null)
{
// Always turn on metadata for schema publishing
options.DisableComplexTypeSystem = false;
options.DisableDataSetMetaData = false;
}
if (options.DefaultMetaDataUpdateTime == null && options.DisableDataSetMetaData != true)
{
options.DefaultMetaDataUpdateTime = GetDurationOrNull(DefaultMetaDataUpdateTimeKey);
}
if (options.AsyncMetaDataLoadTimeout == null && options.DisableDataSetMetaData != true)
{
options.AsyncMetaDataLoadTimeout = GetDurationOrDefault(AsyncMetaDataLoadTimeoutKey,
TimeSpan.FromMilliseconds(AsyncMetaDataLoadTimeoutDefaultMillis));
}
options.EnableDataSetKeepAlives ??= GetBoolOrDefault(EnableDataSetKeepAlivesKey);
options.DefaultKeyFrameCount ??= (uint?)GetIntOrNull(DefaultKeyFrameCountKey);
options.DisableSessionPerWriterGroup ??= GetBoolOrDefault(DisableSessionPerWriterGroupKey,
DisableSessionPerWriterGroupDefault);
options.DefaultUseReverseConnect ??= GetBoolOrNull(DefaultUseReverseConnectKey);
options.DisableSubscriptionTransfer ??= GetBoolOrNull(DisableSubscriptionTransferKey);
}