public void ValidateCluster(TransformClusterValidationContext context) { // Check all clusters for a custom property and validate the associated transform data. if (context.Cluster.Metadata?.TryGetValue("CustomMetadata", out var value) ?? false) { if (string.IsNullOrEmpty(value)) { context.Errors.Add(new ArgumentException("A non-empty CustomMetadata value is required")); } } }
/// <inheritdoc/> public IReadOnlyList <Exception> ValidateCluster(Cluster cluster) { var context = new TransformClusterValidationContext() { Services = _services, Cluster = cluster, }; // Let the app add any more validation it wants. foreach (var transformProvider in _providers) { transformProvider.ValidateCluster(context); } // We promise not to modify the list after we return it. return((IReadOnlyList <Exception>)context.Errors); }
public void ValidateCluster(TransformClusterValidationContext context) { // Other affinity validation logic is covered by ConfigValidator.ValidateSessionAffinity. if (!(context.Cluster.SessionAffinity?.Enabled ?? false)) { return; } var affinityMode = context.Cluster.SessionAffinity.Mode; if (string.IsNullOrEmpty(affinityMode)) { // The default. affinityMode = SessionAffinityConstants.Modes.Cookie; } if (!_sessionAffinityProviders.ContainsKey(affinityMode)) { context.Errors.Add(new ArgumentException($"No matching {nameof(ISessionAffinityProvider)} found for the session affinity mode '{affinityMode}' set on the cluster '{context.Cluster.Id}'.")); } }
public void EnableSession_InvalidMode_Fails() { var affinityPolicy = new Mock <ISessionAffinityPolicy>(MockBehavior.Strict); affinityPolicy.SetupGet(p => p.Name).Returns("Policy"); var transformProvider = new AffinitizeTransformProvider(new[] { affinityPolicy.Object }); var cluster = new ClusterConfig { ClusterId = "cluster1", SessionAffinity = new SessionAffinityConfig { Enabled = true, Policy = "Invalid", AffinityKeyName = "Key1" } }; var validationContext = new TransformClusterValidationContext() { Cluster = cluster, }; transformProvider.ValidateCluster(validationContext); var ex = Assert.Single(validationContext.Errors); Assert.Equal("No matching ISessionAffinityPolicy found for the session affinity policy 'Invalid' set on the cluster 'cluster1'.", ex.Message); var builderContext = new TransformBuilderContext() { Cluster = cluster, }; ex = Assert.Throws <ArgumentException>(() => transformProvider.Apply(builderContext)); Assert.Equal($"No {typeof(ISessionAffinityPolicy).FullName} was found for the id 'Invalid'. (Parameter 'id')", ex.Message); }
public void EnableSessionAffinity_AddsTransform() { var affinityPolicy = new Mock <ISessionAffinityPolicy>(MockBehavior.Strict); affinityPolicy.SetupGet(p => p.Name).Returns("Policy"); var transformProvider = new AffinitizeTransformProvider(new[] { affinityPolicy.Object }); var cluster = new ClusterConfig { ClusterId = "cluster1", SessionAffinity = new SessionAffinityConfig { Enabled = true, Policy = "Policy", AffinityKeyName = "Key1" } }; var validationContext = new TransformClusterValidationContext() { Cluster = cluster, }; transformProvider.ValidateCluster(validationContext); Assert.Empty(validationContext.Errors); var builderContext = new TransformBuilderContext() { Cluster = cluster, }; transformProvider.Apply(builderContext); Assert.IsType <AffinitizeTransform>(builderContext.ResponseTransforms.Single()); }
public void EnableSession_InvalidMode_Fails() { var affinityProvider = new Mock <ISessionAffinityProvider>(MockBehavior.Strict); affinityProvider.SetupGet(p => p.Mode).Returns("Mode"); var transformProvider = new AffinitizeTransformProvider(new[] { affinityProvider.Object }); var cluster = new Cluster { Id = "cluster1", SessionAffinity = new SessionAffinityOptions() { Enabled = true, Mode = "Invalid", } }; var validationContext = new TransformClusterValidationContext() { Cluster = cluster, }; transformProvider.ValidateCluster(validationContext); var ex = Assert.Single(validationContext.Errors); Assert.Equal("No matching ISessionAffinityProvider found for the session affinity mode 'Invalid' set on the cluster 'cluster1'.", ex.Message); var builderContext = new TransformBuilderContext() { Cluster = cluster, }; ex = Assert.Throws <ArgumentException>(() => transformProvider.Apply(builderContext)); Assert.Equal("No Yarp.ReverseProxy.Service.SessionAffinity.ISessionAffinityProvider was found for the id 'Invalid'. (Parameter 'id')", ex.Message); }
public void EnableSessionAffinity_AddsTransform() { var affinityProvider = new Mock <ISessionAffinityProvider>(MockBehavior.Strict); affinityProvider.SetupGet(p => p.Mode).Returns("Mode"); var transformProvider = new AffinitizeTransformProvider(new[] { affinityProvider.Object }); var cluster = new Cluster { Id = "cluster1", SessionAffinity = new SessionAffinityOptions() { Enabled = true, Mode = "Mode", } }; var validationContext = new TransformClusterValidationContext() { Cluster = cluster, }; transformProvider.ValidateCluster(validationContext); Assert.Empty(validationContext.Errors); var builderContext = new TransformBuilderContext() { Cluster = cluster, }; transformProvider.Apply(builderContext); Assert.IsType <AffinitizeTransform>(builderContext.ResponseTransforms.Single()); }
public void ValidateCluster(TransformClusterValidationContext context) { }