Deployment IOperationSource <Deployment> .CreateResult(Response response, CancellationToken cancellationToken)
        {
            using var document = JsonDocument.Parse(response.ContentStream);
            var data = DeploymentData.DeserializeDeploymentData(document.RootElement);

            return(new Deployment(_armClient, data));
        }
Esempio n. 2
0
        internal static DeploymentCollection DeserializeDeploymentCollection(JsonElement element)
        {
            IReadOnlyList <DeploymentData> value = default;
            Optional <string> nextLink           = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("value"))
                {
                    List <DeploymentData> array = new List <DeploymentData>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(DeploymentData.DeserializeDeploymentData(item));
                    }
                    value = array;
                    continue;
                }
                if (property.NameEquals("nextLink"))
                {
                    nextLink = property.Value.GetString();
                    continue;
                }
            }
            return(new DeploymentCollection(value, nextLink.Value));
        }
Esempio n. 3
0
        private void DeploymentSetup()
        {
            //Creates instance to define settings folder in a location and create it based on name of App and if Dev deployment
            var deployment = new DeploymentData(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)));

            SetLogFilePath("LogFile", deployment.SettingsFolder);
            AppMode = deployment.Mode;
            if (deployment.NetworkDeployed == true)
            {
                try
                {
                    //Start auto update system and subscribe to event
                    var updateManager = new UpdateManager(deployment.UpdateLocation);
                    updateManager.UpdateComplete += UpdateComplete;
                }
                catch (Exception e)
                {
                    log.Fatal(e);
                }
                try
                {
                    //listen for DB updates
                    var WatchDataBase = new DataBaseWatcher(deployment.UpdateLocation);
                    DataBaseWatcher.DataBaseUpdated += (o, e) => { this.ReloadData(o, e.FullPath); DBUpdated = true; };
                }
                catch (Exception e)
                {
                    log.Fatal(e);
                }
            }
        }
        internal static DeploymentListResult DeserializeDeploymentListResult(JsonElement element)
        {
            Optional <IReadOnlyList <DeploymentData> > value = default;
            Optional <string> nextLink = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("value"))
                {
                    if (property.Value.ValueKind == JsonValueKind.Null)
                    {
                        property.ThrowNonNullablePropertyIsNull();
                        continue;
                    }
                    List <DeploymentData> array = new List <DeploymentData>();
                    foreach (var item in property.Value.EnumerateArray())
                    {
                        array.Add(DeploymentData.DeserializeDeploymentData(item));
                    }
                    value = array;
                    continue;
                }
                if (property.NameEquals("nextLink"))
                {
                    nextLink = property.Value.GetString();
                    continue;
                }
            }
            return(new DeploymentListResult(Optional.ToList(value), nextLink.Value));
        }
    public string GenerateCaddyfile(DeploymentData data, CaddyProfile profile)
    {
        var sb = new StringBuilder();

        if (profile.SpecifyEmail)
        {
            sb.AppendLine("{");
            sb.AppendLine($"    email {Constants.Email}");
            sb.AppendLine("}");
        }

        void GenerateSection(string prefix, CaddyProfile caddyProfile, string serviceNamePrefix)
        {
            var domainPrefix  = string.IsNullOrEmpty(prefix) ? string.Empty : $"{prefix}.";
            var servicePrefix = string.IsNullOrEmpty(prefix) ? string.Empty : $"{prefix}-";

            sb.AppendLine();
            sb.AppendLine($"{domainPrefix}{caddyProfile.Domain} {{");
            sb.AppendLine($"    reverse_proxy {servicePrefix}{caddyProfile.WebUiAddress}");
            sb.AppendLine("}");

            sb.AppendLine();
            sb.AppendLine($"{domainPrefix}api.{caddyProfile.Domain} {{");

            foreach (var service in data.Services
                     .Where(s => s.AddToReverseProxyInProduction || !caddyProfile.IsProd)
                     .OrderBy(service => service.ServiceName))
            {
                sb.AppendLine($"    handle_path /{service.ServiceName}/* {{");
                sb.AppendLine($"        reverse_proxy {servicePrefix}{Constants.GetReverseProxyAddressWithPort(service, serviceNamePrefix)}");
                sb.AppendLine("    }");
                sb.AppendLine();
            }

            sb.AppendLine("    respond 404");
            sb.AppendLine("}");
        }

        GenerateSection(string.Empty, profile, profile.Value == "local" ? "local-" : string.Empty);

        if (profile.Value == "host")
        {
            GenerateSection("dev", profile, string.Empty);
            GenerateSection(string.Empty, new CaddyProfile("local"), "local-");
        }

        return(sb.ToString());
    }
            public ServiceData AddDeployment(Action<DeploymentData> setter)
            {
                var data = new DeploymentData();
                setter(data);

                switch (data.Slot)
                {
                    case DeploymentSlot.Production:
                        ProductionDeployment = data;
                        break;
                    case DeploymentSlot.Staging:
                        StagingDeployment = data;
                        break;
                }
                return this;
            }
Esempio n. 7
0
 private string GetIconClass(DeploymentData data)
 {
     if (data.IsCancelled)
     {
         return("fas fa-trash text-warning");
     }
     if (!data.IsComplete)
     {
         return("fas fa-spinner fa-spin text-info");
     }
     if (data.IsSuccess)
     {
         return("fas fa-check text-success");
     }
     return("fas fa-exclamation-triangle text-danger");
 }
        private bool PrepareDeploymentsList()
        {
            if (Blackboard.LoginTokens == null)
            {
                Owner.SetState(Owner.StartState);
            }

            var deploymentData = Blackboard.LoginTokens
                                 .Select(token => (DeploymentData.TryFromLoginToken(token, out var data), data))
                                 .Where(pair => pair.Item1)
                                 .Select(pair => pair.data)
                                 .ToList();

            ScreenManager.InformOfDeployments(deploymentData);
            return(deploymentData.Any(data => data.IsAvailable));
        }
Esempio n. 9
0
            public ServiceData AddDeployment(Action <DeploymentData> setter)
            {
                var data = new DeploymentData();

                setter(data);

                switch (data.Slot)
                {
                case DeploymentSlot.Production:
                    ProductionDeployment = data;
                    break;

                case DeploymentSlot.Staging:
                    StagingDeployment = data;
                    break;
                }
                return(this);
            }
Esempio n. 10
0
 private HostedServiceGetDetailedResponse.Deployment CreateDeploymentResponse(DeploymentData d)
 {
     if (d != null)
     {
         return(new HostedServiceGetDetailedResponse.Deployment
         {
             DeploymentSlot = d.Slot,
             Name = d.Name,
             Roles =
             {
                 new Role
                 {
                     RoleName = "Role1"
                 }
             }
         });
     }
     return(null);
 }
 private HostedServiceGetDetailedResponse.Deployment CreateDeploymentResponse(DeploymentData d)
 {
     if (d != null)
     {
         return new HostedServiceGetDetailedResponse.Deployment
         {
             DeploymentSlot = d.Slot,
             Name = d.Name,
             Roles =
             {
                 new Role
                 {
                     RoleName = "Role1"
                 }
             }
         };
     }
     return null;
 }
Esempio n. 12
0
    public string Generate(DeploymentData deploymentData, Environment environment)
    {
        var sb = new StringBuilder();

        sb.AppendLine($"version: '{Constants.DockerComposeVersion}'");
        sb.AppendLine();

        // Declare networks.
        sb.AppendLine("networks:");
        foreach (var network in deploymentData.GetAllNetworks(environment))
        {
            sb.AppendLine($"  {network}:");
        }

        if (environment.Value == Environment.Prod)
        {
            foreach (var network in Constants.ExternalNetworksForHostProdCompose)
            {
                sb.AppendLine($"  {network}:");
                sb.AppendLine("    external: true");
            }
        }

        if (environment.Value != Environment.Local && environment.Value != Environment.Debug)
        {
            foreach (var network in Constants.InfraExternalNetworks)
            {
                sb.AppendLine($"  {network}:");
                sb.AppendLine("    external: true");
            }
        }

        sb.AppendLine();

        // Declare services.
        sb.AppendLine("services:");

        foreach (var service in deploymentData.GetServiceInformations(environment))
        {
            sb.AppendLine($"  {service.ContainerName}:");
            sb.AppendLine($"    image: {service.ImageName}");
            sb.AppendLine($"    container_name: {service.ContainerName}");
            sb.AppendLine($"    networks:");

            foreach (var network in service.Networks)
            {
                sb.AppendLine($"      - {network}");
            }

            if (service.Ports.Any())
            {
                sb.AppendLine($"    ports:");

                foreach (var port in service.Ports)
                {
                    sb.AppendLine($"      - {port}");
                }
            }

            if (service.Volumes.Any())
            {
                sb.AppendLine($"    volumes:");

                foreach (var volume in service.Volumes)
                {
                    sb.AppendLine($"      - {volume}");
                }
            }

            if (service.BuildConfiguration != null)
            {
                sb.AppendLine($"    build:");
                sb.AppendLine($"      context: {service.BuildConfiguration.Context}");
                sb.AppendLine($"      dockerfile: {service.BuildConfiguration.Dockerfile}");
            }

            if (environment.RestartUnlessStopped)
            {
                sb.AppendLine($"    restart: unless-stopped");
            }

            sb.AppendLine($"    mem_limit: {service.MemLimit}");
            sb.AppendLine($"    mem_reservation: {service.MemReservation}");

            sb.AppendLine("    env_file:");
            sb.AppendLine("      - deployment/.env");
            foreach (var envFile in service.EnvFiles)
            {
                sb.AppendLine($"      - {envFile}");
            }

            sb.AppendLine();
        }

        if (environment.Value == "local")
        {
            sb.AppendLine(@"
  local-typingrealm-caddy:
    image: caddy
    container_name: local-typingrealm-caddy
    networks:
      - local-typingrealm-net
    ports:
      - 80:80
      - 443:443
    restart: unless-stopped
    volumes:
      - ./reverse-proxy/Caddyfile.local:/etc/caddy/Caddyfile
      - ./infrastructure-data/local/caddy_data:/data
    mem_limit: 1g
    mem_reservation: 750m
    env_file:
      - deployment/.env.local");
        }
        else if (environment.Value == "strict-prod")
        {
            sb.AppendLine(@"
  typingrealm-caddy:
    image: caddy
    container_name: typingrealm-caddy
    networks:
      - typingrealm-net
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./reverse-proxy/Caddyfile.prod:/etc/caddy/Caddyfile
      - ./infrastructure-data/prod/caddy_data:/data
    restart: unless-stopped
    mem_limit: 1g
    mem_reservation: 750m
    env_file:
      - deployment/.env.prod");
        }
        else if (environment.Value == "prod")
        {
            sb.AppendLine(@"
  typingrealm-caddy:
    image: caddy
    container_name: typingrealm-caddy
    networks:
      - typingrealm-net
      - local-tyr_local-typingrealm-net
      - dev-tyr_dev-typingrealm-net
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./reverse-proxy/Caddyfile.host:/etc/caddy/Caddyfile
      - ./infrastructure-data/prod/caddy_data:/data
    restart: unless-stopped
    mem_limit: 1g
    mem_reservation: 750m
    env_file:
      - deployment/.env.prod");
        }

        return(sb.ToString());
    }
Esempio n. 13
0
 public DeploymentLogic()
 {
     _data = new DeploymentData();
 }
Esempio n. 14
0
    public IEnumerable <EnvFile> GenerateEnvFiles(DeploymentData deploymentData, Environment environment)
    {
        if (!environment.GenerateEnvFiles)
        {
            yield break;
        }

        var envVars        = new List <EnvVariable>();
        var serviceEnvVars = deploymentData.Services
                             .Where(s => s.ServiceName != Constants.WebUiServiceName)
                             .Select(x => new { Service = x, EnvVars = new List <EnvVariable>() })
                             .ToDictionary(x => x.Service.ServiceName);

        if (environment.IsDevelopmentEnv && !environment.IsDebug && !environment.IsLocal)
        {
            envVars.Add(new EnvVariable("ASPNETCORE_ENVIRONMENT", "Development"));
        }
        else if (environment.IsDebug)
        {
            envVars.Add(new EnvVariable("ASPNETCORE_ENVIRONMENT", "Debug"));
        }
        else if (environment.IsLocal)
        {
            envVars.Add(new EnvVariable("ASPNETCORE_ENVIRONMENT", "Local"));
        }

        foreach (var service in deploymentData.Services)
        {
            if (service.RawServiceName == Constants.WebUiServiceName)
            {
                continue;
            }

            if (service.RawServiceName == Constants.AuthorityServiceName)
            {
                if (environment.IsDebug)
                {
                    envVars.Add(new EnvVariable("SERVICE_AUTHORITY", $"http://host.docker.internal:{service.Port}/"));
                }
                else
                {
                    envVars.Add(new EnvVariable("SERVICE_AUTHORITY", $"http://{environment.EnvironmentPrefix}{DeploymentData.ProjectName}-{service.ServiceName}/"));
                }
                continue;
            }

            var serviceAddress = environment.IsDebug
                ? $"http://host.docker.internal:{service.Port}"
                : $"http://{environment.EnvironmentPrefix}{DeploymentData.ProjectName}-{service.ServiceName}";

            envVars.Add(new EnvVariable($"{service.ServiceName.ToUpperInvariant()}_URL", serviceAddress));

            if (service.CacheType == CacheType.Redis)
            {
                if (environment.IsDebug)
                {
                    var devRedisPort = DeploymentData.GetInfrastructurePort(6379, Environment.DevEnvironment, service).Split(":")[0];
                    serviceEnvVars[service.ServiceName].EnvVars.Add(new EnvVariable(Constants.CacheConfigurationKey, $"host.docker.internal:{devRedisPort}"));
                }
                else
                {
                    serviceEnvVars[service.ServiceName].EnvVars.Add(new EnvVariable(Constants.CacheConfigurationKey, $"{environment.EnvironmentPrefix}{DeploymentData.ProjectName}-{service.ServiceName}-redis:6379"));
                }
            }

            if (service.DatabaseType == DatabaseType.Postgres)
            {
                serviceEnvVars[service.ServiceName].EnvVars.Add(new EnvVariable("POSTGRES_PASSWORD", Constants.PostgresPassword));
                if (environment.IsDebug)
                {
                    var server           = $"host.docker.internal";
                    var devPostgresPort  = DeploymentData.GetInfrastructurePort(5432, Environment.DevEnvironment, service).Split(":")[0];
                    var connectionString = $"Server={server}; Port={devPostgresPort}; User Id={Constants.PostgresUserId}; Password={Constants.PostgresPassword}; Database={Constants.PostgresDatabase}";
                    serviceEnvVars[service.ServiceName].EnvVars.Add(new EnvVariable(Constants.DatabaseConfigurationKey, connectionString));
                }
                else
                {
                    var connectionString = $"Server={environment.EnvironmentPrefix}{DeploymentData.ProjectName}-{service.ServiceName}-postgres; Port=5432; User Id={Constants.PostgresUserId}; Password={Constants.PostgresPassword}; Database={Constants.PostgresDatabase}";
                    serviceEnvVars[service.ServiceName].EnvVars.Add(new EnvVariable(Constants.DatabaseConfigurationKey, connectionString));
                }
            }
        }

        // Logging.
        if (environment.IsDebug)
        {
            envVars.Add(new(Constants.LoggingConfigurationKey, "http://host.docker.internal:9200;admin_password"));
        }
        else if (!environment.IsLocal)
        {
            envVars.Add(new(Constants.LoggingConfigurationKey, $"http://{Constants.ProjectName}-infra-elasticsearch:9200;admin_password"));
        }

        var sb = new StringBuilder();

        foreach (var v in envVars.OrderBy(x => x.Name))
        {
            sb.AppendLine($"{v.Name}={v.Value}");
        }

        yield return(new EnvFile($".env.{environment.Value}", sb.ToString()));

        foreach (var serviceVars in serviceEnvVars.Values)
        {
            sb = new StringBuilder();
            foreach (var v in serviceVars.EnvVars.OrderBy(x => x.Name))
            {
                sb.AppendLine($"{v.Name}={v.Value}");
            }

            yield return(new EnvFile($".env.{environment.Value}.{serviceVars.Service.ServiceName}", sb.ToString()));
        }
    }