public void BalancerOptionsIsNotValidWithoutUris()
        {
            var options = new BalancerOptions();

            Action test = () => options.CheckValidity();

            test.Should().Throw<InvalidConstraintException>();
        }
Ejemplo n.º 2
0
 public LoadBalancerService(IEndpointWatcher watcher,
                            IOptions <BalancerOptions> options,
                            ILogger <LoadBalancerService> logger,
                            ILoadManager loadManager)
 {
     _watcher     = watcher;
     _options     = options.Value;
     _logger      = logger;
     _loadManager = loadManager;
 }
 public KubernetesEndpointWatcher(IWebHostEnvironment env,
                                  IOptions <BalancerOptions> options,
                                  ILogger <KubernetesEndpointWatcher> logger)
 {
     _options         = options.Value;
     _logger          = logger;
     _endpointEntries = Array.Empty <EndpointEntry>();
     try
     {
         _k8sClient = new Kubernetes(KubernetesClientConfiguration.InClusterConfig());
         InitializeWatcherAsync().Wait();
         _logger.LogDebug("Connected to K8s, watcher initialized");
     }
     catch (KubeConfigException x) when(PredefinedConfiguration.HasPredefinedConfiguration(x, env))
     {
         _k8sClient       = null;
         _endpointEntries = PredefinedConfiguration.GetEndpointEntries(env);
         _logger.LogDebug($"Can not connect to K8s, using predefined configuration");
     }
 }
Ejemplo n.º 4
0
        /// <summary>
        /// Request count implementation
        /// </summary>
        /// <param name="balancerData"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        private Node RequestCount(BalancerData balancerData, BalancerOptions options)
        {
            var key = balancerData.Scores.OrderByDescending(x => x.Value).FirstOrDefault().Key;

            return(options.Nodes[key]);

            if (balancerData.Scores[key] + 1 < long.MaxValue)
            {
                balancerData.Scores[key]++;
            }
            else
            {
                //If i'm going outside long range I need a reset.
                //i'm the lower value, so if I'm not able to increments all other have my same value (if not, they had ben triggered this previously)
                for (int i = 0; i < balancerData.Scores.Count; i++)
                {
                    balancerData.Scores[i] = 0;
                }
            }
        }
Ejemplo n.º 5
0
        public async override Task InvokeImpl(HttpContext context, string host, VHostOptions vhost, IConfigurationSection settings)
        {
            BalancerOptions options = new BalancerOptions();

            settings.Bind("Settings:Balancer", options);

            BalancerData balancerData = null;

            if (!data.ContainsKey(host))
            {
                balancerData = data[host] = new BalancerData();
                for (int i = 0; i < options.Nodes.Length; i++)
                {
                    balancerData.Scores[i] = 0;
                }
            }
            else
            {
                balancerData = data[host];
            }

            //Different logic basing on algoritm
            //TODO: make it generic using interface\implementation for algoritm
            if (options.Policy == "RoundRobin")
            {
                context.Items["bal-destination"] = RoundRobin(balancerData, options);
            }
            else if (options.Policy == "RequestCount")
            {
                context.Items["bal-destination"] = RequestCount(balancerData, options);
            }



            //Alter request
            context.Request.Headers["X-Forwarded-For"]   = context.Connection.RemoteIpAddress.ToString();
            context.Request.Headers["X-Forwarded-Proto"] = context.Request.Protocol.ToString();
            int port = context.Request.Host.Port ?? (context.Request.IsHttps ? 443 : 80);

            context.Request.Headers["X-Forwarded-Port"] = port.ToString();
        }
Ejemplo n.º 6
0
 public Balancer(IOptions <BalancerOptions> settings)
 {
     options = settings.Value;
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Roud robin implementation
 /// </summary>
 /// <param name="balancerData"></param>
 /// <param name="options"></param>
 /// <returns></returns>
 private object RoundRobin(BalancerData balancerData, BalancerOptions options)
 {
     balancerData.LastServed = (balancerData.LastServed + 1) % options.Nodes.Length;
     return(options.Nodes[balancerData.LastServed]);
 }