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"));
         }
     }
 }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        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}'."));
            }
        }
Exemple #4
0
    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);
    }
Exemple #5
0
    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());
    }
Exemple #6
0
        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);
        }
Exemple #7
0
        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());
        }
Exemple #8
0
 public void ValidateCluster(TransformClusterValidationContext context)
 {
 }