Skip to content
Snippets Groups Projects
Select Git revision
  • 53c0ccb1028eba7ca64fde66c02fc833ab9954ea
  • master default protected
  • gitkeep
  • dev protected
  • Issue/2309-docs
  • Issue/2373-fixPagination
  • Heinrichs-master-patch-93799
  • devops-aczepiel
  • Hotfix/2097-fixTimeFormat
  • Hotfix/2087-efNet6
  • Issue/1910-MigrationtoNET6.0
  • Issue/1964-tokenExpiryUIv2
  • Sprint/2022-01
  • Sprint/2021-11
  • Sprint/2021-08
  • Hotfix/1262-fixStatuscode
  • Sprint/2021-05
  • Product/1100-fdsS3
  • Topic/1292-FdsS3
  • Product/1188-LoggingExtended
  • Topic/1221-LogginExtendedNew
  • v2.2.3
  • v2.2.2
  • v2.2.1
  • v2.2.0
  • v2.1.3
  • v2.1.2
  • v2.1.1
  • v2.1.0
  • v2.0.2
  • v2.0.1
  • v2.0.0
  • v1.12.0
  • v1.11.0
  • v1.10.0
  • v1.9.1
  • v1.9.0
  • v1.8.0
  • v1.7.3
  • v1.7.2
  • v1.7.1
41 results

Configurator.cs

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Configurator.cs 3.34 KiB
    using Coscine.Configuration;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.NetworkInformation;
    
    namespace Coscine.ApiCommons
    {
        public class Configurator
        {
            public ApplicationInformation ApplicationInformation { get; set; } = new ApplicationInformation();
            public IConfiguration Configuration { get; set; }
    
            public Configurator(ApplicationInformation applicationInformation, IConfiguration configuration)
            {
                ApplicationInformation = applicationInformation;
                Configuration = configuration;
            }
            public Configurator(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public void Register()
            {
                Register(ApplicationInformation);
            }
    
            public void Register(ApplicationInformation applicationInformation)
            {
                // Default app values
                var keys = Configuration.Keys(applicationInformation.AppBasePath);
    
                if (keys == null)
                {
                    // No port overwrite
                    if (applicationInformation.Port == 0)
                    {
                        applicationInformation.Port = CalculatePort($"coscine/{applicationInformation.AppType}");
                    }
    
                    foreach (var kv in applicationInformation.AppValues.ToArray())
                    {
                        Configuration.Put(kv.Key, kv.Value);
                    }
                }
                else
                {
                    // No port overwrite
                    if (applicationInformation.Port == 0)
                    {
                        int.TryParse(Configuration.GetString($"{applicationInformation.AppBasePath}/port"), out int port);
                        applicationInformation.Port = port;
                    }
                }
    
                applicationInformation.ApiUrl = Configuration.GetString("coscine/local/api/additional/url");
    
                // Traefik Configuration
                foreach (var kv in applicationInformation.TraefikValues.ToArray())
                {
                    Configuration.Put(kv.Key, kv.Value);
                }
            }
    
            private List<int> GetUsedConsulPorts(string appsPrefix)
            {
                var ports = new List<int>();
                var keys = Configuration.Keys(appsPrefix);
    
                if (keys != null)
                {
                    foreach (var key in keys)
                    {
                        // maybe find a better solution
                        if (key.EndsWith("/port") && Configuration.Get(key) != null)
                        {
                            if (int.TryParse(Configuration.GetString(key), out int p))
                            {
                                ports.Add(p);
                            }
                        }
                    }
                }
                return ports;
            }
    
            private List<int> GetUsedSystemPorts()
            {
                return IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections().Select(x => x.LocalEndPoint.Port).ToList();
            }
    
            private int CalculatePort(string appsPrefix)
            {
                var usedPorts = GetUsedConsulPorts(appsPrefix).Union(GetUsedSystemPorts())
                    .OrderBy(x => x);
                return Enumerable.Range(ApplicationInformation.PortRange.Item1, ApplicationInformation.PortRange.Item2 - ApplicationInformation.PortRange.Item1).Except(usedPorts).First();
            }
        }
    }