/// <summary> /// Validates the instance. /// </summary> /// <param name="context">The validation context.</param> public void Validate(TrafficValidationContext context) { Timeouts = Timeouts ?? new TrafficTimeouts(); Resolvers = Resolvers ?? new List <TrafficResolver>(); BridgeTargetAddresses = BridgeTargetAddresses ?? new List <IPAddress>(); if (!Resolvers.Exists(r => r.Name == "docker")) { Resolvers.Add( new TrafficResolver() { Name = "docker", NameServers = new List <TrafficNameserver>() { new TrafficNameserver() { Name = "docker0", Endpoint = HiveConst.DockerDnsEndpoint } } }); } if (!NetHelper.IsValidPort(ProxyPorts.PortRange.FirstPort) || !NetHelper.IsValidPort(ProxyPorts.PortRange.LastPort) || ProxyPorts.PortRange.LastPort <= ProxyPorts.PortRange.FirstPort + 1) { context.Error($"Load balancer port block [{ProxyPorts.PortRange.FirstPort}-{ProxyPorts.PortRange.LastPort}] range is not valid."); } if (MaxConnections <= 0) { context.Error($"Load balancer settings [{nameof(MaxConnections)}={MaxConnections}] is not positive."); } Timeouts.Validate(context); if (!Resolvers.Exists(r => r.Name == "docker")) { context.Error($"Load balancer settings [{nameof(Resolvers)}] must include a [docker] definition."); } foreach (var resolver in Resolvers) { resolver.Validate(context); } if (BridgeTargetCount < 0) { context.Error($"Load balancer settings [{nameof(BridgeTargetCount)}={BridgeTargetCount}] cannot be negative."); } if (BridgeTargetCount == 0 && BridgeTargetAddresses.Count == 0) { context.Error($"Load balancer settings no bridge targets are specified."); } }
/// <summary> /// Validates the instance. /// </summary> /// <param name="context">The validation context.</param> public virtual void Validate(TrafficValidationContext context) { Timeouts = Timeouts ?? new TrafficTimeouts(); if (string.IsNullOrEmpty(Name)) { context.Error($"Load balancer rule name is required."); } if (!HiveDefinition.NameRegex.IsMatch(Name)) { context.Error($"Load balancer rule name [{nameof(Name)}={Name}] is not valid."); } if (context.ValidateResolvers) { if (!string.IsNullOrWhiteSpace(Resolver) && context.Settings != null && context.Settings.Resolvers.Count(r => string.Equals(Resolver, r.Name, StringComparison.OrdinalIgnoreCase)) == 0) { context.Error($"Load balancer resolver [{nameof(Resolver)}={Resolver}] does not exist."); } } Resolver = Resolver ?? defaultResolverName; CheckHeaders = CheckHeaders ?? new List <TrafficCheckHeader>(); foreach (var checkHeader in CheckHeaders) { checkHeader.Validate(context, this); } if (UseHttpCheckMode) { if (string.IsNullOrEmpty(CheckUri) || !Uri.TryCreate(CheckUri, UriKind.RelativeOrAbsolute, out var uri)) { context.Error($"Rule [{nameof(Name)}] has invalid [{nameof(CheckUri)}={CheckUri}]."); } } if (CheckSeconds < 0.0) { CheckSeconds = 5.0; } Timeouts.Validate(context); }