Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 217 additions & 0 deletions src/SIM.ContainerInstaller/DockerfileGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
using JetBrains.Annotations;
using SIM.ContainerInstaller.Modules;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace SIM.ContainerInstaller
{
[UsedImplicitly]
public class DockerfileGenerator
{
private const string DockerfileFileName = "Dockerfile";
private const string CmDockerfileFilePath = @"docker\build\cm";
private const string CdDockerfileFilePath = @"docker\build\cd";
private const string MsSqlDockerfileFilePath = @"docker\build\mssql";
private const string MsSqlInitDockerfileFilePath = @"docker\build\mssql-init";
private const string SolrDockerfileFilePath = @"docker\build\solr";
private const string SolrInitDockerfileFilePath = @"docker\build\solr-init";

public void Generate(string path, List<IDockerfileGeneratorHelper> helpers, int shortVersion, Topology topology)
{

if (ShouldMsSqlDockerfileBeGenerated(shortVersion))
{
GenerateMsSqlDockerfile(path, helpers);
}
if (ShouldMsSqlInitDockerfileBeGenerated(shortVersion))
{
GenerateMsSqlInitDockerfile(path, helpers);
}
if (ShouldSolrDockerfileBeGenerated(shortVersion))
{
GenerateSolrDockerfile(path, helpers);
}
if (ShouldSolrInitDockerfileBeGenerated(shortVersion))
{
GenerateSolrInitDockerfile(path, helpers);
}
if (ShouldCdDockerfileBeGenerated(shortVersion, topology))
{
GenerateCdDockerfile(path, helpers);
}
if (ShouldCmDockerfileBeGenerated(shortVersion))
{
GenerateCmDockerfile(path, helpers);
}
}

private bool ShouldMsSqlDockerfileBeGenerated(int shortVersion)
{
if (shortVersion >= 100 && shortVersion < 102)
{
return true;
}
return false;
}

private bool ShouldMsSqlInitDockerfileBeGenerated(int shortVersion)
{
if (shortVersion >= 102)
{
return true;
}
return false;
}

private bool ShouldSolrDockerfileBeGenerated(int shortVersion)
{
if (shortVersion == 100)
{
return true;
}
return false;
}

private bool ShouldSolrInitDockerfileBeGenerated(int shortVersion)
{
if (shortVersion >= 101)
{
return true;
}
return false;
}

private bool ShouldCdDockerfileBeGenerated(int shortVersion, Topology topology)
{
if (shortVersion >= 100 && (topology == Topology.Xm1 || topology == Topology.Xp1))
{
return true;
}
return false;
}

private bool ShouldCmDockerfileBeGenerated(int shortVersion)
{
if (shortVersion >= 100)
{
return true;
}
return false;
}

private StringBuilder GenerateDockerfile(StringBuilder args, StringBuilder froms, StringBuilder commands)
{
return new StringBuilder().Append(@"# escape=`").AppendLine().AppendLine()
.Append(@"ARG BASE_IMAGE").AppendLine()
.Append(args).AppendLine()
.Append(froms)
.Append(@"FROM ${BASE_IMAGE}").AppendLine().AppendLine()
.Append("SHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]").AppendLine().AppendLine()
.Append(commands);
}

public void GenerateSpecificDockerfile(string rootFolderPath, string dockerfileFilePath, StringBuilder dockerfileText)
{
string path = Path.Combine(rootFolderPath, dockerfileFilePath);
CreateFolder(path);

using (StreamWriter writer = new StreamWriter(Path.Combine(path, DockerfileFileName)))
{
writer.WriteLine(dockerfileText);
}
}

private void GenerateMsSqlDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateMsSqlArgs());
froms.Append(helper.GenerateMsSqlFroms());
commands.Append(helper.GenerateMsSqlCommands());
}
GenerateSpecificDockerfile(rootFolderPath, MsSqlDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void GenerateMsSqlInitDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateMsSqlInitArgs());
froms.Append(helper.GenerateMsSqlInitFroms());
commands.Append(helper.GenerateMsSqlInitCommands());
}
GenerateSpecificDockerfile(rootFolderPath, MsSqlInitDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void GenerateSolrDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateSolrArgs());
froms.Append(helper.GenerateSolrFroms());
commands.Append(helper.GenerateSolrCommands());
}
GenerateSpecificDockerfile(rootFolderPath, SolrDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void GenerateSolrInitDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateSolrInitArgs());
froms.Append(helper.GenerateSolrInitFroms());
commands.Append(helper.GenerateSolrInitCommands());
}
GenerateSpecificDockerfile(rootFolderPath, SolrInitDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void GenerateCdDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateCdArgs());
froms.Append(helper.GenerateCdFroms());
commands.Append(helper.GenerateCdCommands());
}
GenerateSpecificDockerfile(rootFolderPath, CdDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void GenerateCmDockerfile(string rootFolderPath, List<IDockerfileGeneratorHelper> helpers)
{
StringBuilder args = new StringBuilder();
StringBuilder froms = new StringBuilder();
StringBuilder commands = new StringBuilder();
foreach (IDockerfileGeneratorHelper helper in helpers)
{
args.Append(helper.GenerateCmArgs());
froms.Append(helper.GenerateCmFroms());
commands.Append(helper.GenerateCmCommands());
}
GenerateSpecificDockerfile(rootFolderPath, CmDockerfileFilePath, GenerateDockerfile(args, froms, commands));
}

private void CreateFolder(string path)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
}
}
79 changes: 79 additions & 0 deletions src/SIM.ContainerInstaller/EnvModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,76 @@ public string IdHost
this["ID_HOST"] = value;
}
}

public const string SitecoreToolsRegistryName = "SITECORE_TOOLS_REGISTRY";

public string SitecoreToolsRegistry
{
get
{
return this[SitecoreToolsRegistryName];
}
set
{
this[SitecoreToolsRegistryName] = value;
}
}

public const string SitecoreModuleRegistryName = "SITECORE_MODULE_REGISTRY";

public string SitecoreModuleRegistry
{
get
{
return this[SitecoreModuleRegistryName];
}
set
{
this[SitecoreModuleRegistryName] = value;
}
}

public const string ToolsVersionName = "TOOLS_VERSION";

public string ToolsVersion
{
get
{
return this[ToolsVersionName];
}
set
{
this[ToolsVersionName] = value;
}
}

public const string SpeVersionName = "SPE_VERSION";

public string SpeVersion
{
get
{
return this[SpeVersionName];
}
set
{
this[SpeVersionName] = value;
}
}

public const string SxaVersionName = "SXA_VERSION";

public string SxaVersion
{
get
{
return this[SxaVersionName];
}
set
{
this[SxaVersionName] = value;
}
}
#endregion

public string this[string Name]
Expand Down Expand Up @@ -267,5 +337,14 @@ private NameValuePair GetPairOrNull(string name)
{
return this.variables.FirstOrDefault(v => v.Name == name);
}

public void Remove(string name)
{
NameValuePair pair = this.GetPairOrNull(name);
if (pair != null)
{
this.variables.Remove(pair);
}
}
}
}
45 changes: 45 additions & 0 deletions src/SIM.ContainerInstaller/Modules/DockerSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System.ComponentModel;

namespace SIM.ContainerInstaller.Modules
{
public enum Topology
{
Xm1,
Xp0,
Xp1
}

public enum Module
{
[Description("SXA")]
SXA,
[Description("JSS")]
JSS,
[Description("Horizon")]
Horizon,
[Description("Publishing Service")]
PublishingService
}

public static class DockerSettings
{
public const string SitecoreContainerRegistryHost = "scr.sitecore.com";
public const string SitecoreToolsNamespace = "tools";
public const string SitecoreModuleNamespace = "sxp/modules";
public const string SitecoreToolsImage = "sitecore-docker-tools-assets";
public const string SpeImage = "spe-assets";
public const string SitecoreSpeImage = "sitecore-spe-assets";
public const string SxaXm1Image = "sxa-xm1-assets";
public const string SitecoreSxaXm1Image = "sitecore-sxa-xm1-assets";
public const string SxaXpImage = "sxa-xp1-assets";
public const string SitecoreSxaXpImage = "sitecore-sxa-xp1-assets";

public static string SitecoreToolsImagePath = $"{SitecoreToolsNamespace}/{SitecoreToolsImage}";
public static string SpeImagePath = $"{SitecoreModuleNamespace}/{SpeImage}";
public static string SitecoreSpeImagePath = $"{SitecoreModuleNamespace}/{SitecoreSpeImage}";
public static string SxaXm1ImagePath = $"{SitecoreModuleNamespace}/{SxaXm1Image}";
public static string SitecoreSxaXm1ImagePath = $"{SitecoreModuleNamespace}/{SitecoreSxaXm1Image}";
public static string SxaXpImagePath = $"{SitecoreModuleNamespace}/{SxaXpImage}";
public static string SitecoreSxaXpImagePath = $"{SitecoreModuleNamespace}/{SitecoreSxaXpImage}";
}
}
Loading