Browse Source

Make opulence projects disappear (#51)

pull/55/head
Ryan Nowak 7 years ago
committed by GitHub
parent
commit
280fe7f59b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Tye.Core/Application.cs
  2. 2
      src/Tye.Core/ApplicationGlobals.cs
  3. 2
      src/Tye.Core/ApplicationYamlWriter.cs
  4. 2
      src/Tye.Core/BuildDockerImageStep.cs
  5. 2
      src/Tye.Core/CombineStep.cs
  6. 2
      src/Tye.Core/CommandException.cs
  7. 2
      src/Tye.Core/ComputedBindings.cs
  8. 0
      src/Tye.Core/ConsoleExtensions.cs
  9. 2
      src/Tye.Core/ContainerInfo.cs
  10. 2
      src/Tye.Core/ContainerRegistry.cs
  11. 2
      src/Tye.Core/CustomizationPipeline.cs
  12. 4
      src/Tye.Core/DeployServiceYamlStep.cs
  13. 2
      src/Tye.Core/DeploymentKind.cs
  14. 2
      src/Tye.Core/DirectoryCopy.cs
  15. 2
      src/Tye.Core/DirectorySearch.cs
  16. 2
      src/Tye.Core/DockerContainerBuilder.cs
  17. 2
      src/Tye.Core/DockerImage.cs
  18. 2
      src/Tye.Core/DockerPush.cs
  19. 4
      src/Tye.Core/DockerfileGenerator.cs
  20. 2
      src/Tye.Core/EnvironmentAttribute.cs
  21. 2
      src/Tye.Core/Environments.cs
  22. 2
      src/Tye.Core/Framework.cs
  23. 2
      src/Tye.Core/FrameworkCollection.cs
  24. 2
      src/Tye.Core/GenerateDockerfileStep.cs
  25. 2
      src/Tye.Core/GenerateHelmChartStep.cs
  26. 2
      src/Tye.Core/GenerateKubernetesManifestStep.cs
  27. 2
      src/Tye.Core/GenerateOamComponentStep.cs
  28. 2
      src/Tye.Core/GeneratedAssets.cs
  29. 2
      src/Tye.Core/HelmChartBuilder.cs
  30. 4
      src/Tye.Core/HelmChartGenerator.cs
  31. 2
      src/Tye.Core/HelmChartStep.cs
  32. 2
      src/Tye.Core/HelmPush.cs
  33. 2
      src/Tye.Core/IYamlManifestOutput.cs
  34. 2
      src/Tye.Core/KubernetesDeploymentOutput.cs
  35. 18
      src/Tye.Core/KubernetesManifestGenerator.cs
  36. 2
      src/Tye.Core/KubernetesServiceOutput.cs
  37. 2
      src/Tye.Core/Names.cs
  38. 2
      src/Tye.Core/OamApplicationGenerator.cs
  39. 2
      src/Tye.Core/OamComponentGenerator.cs
  40. 2
      src/Tye.Core/OamComponentOutput.cs
  41. 2
      src/Tye.Core/OutputContext.cs
  42. 2
      src/Tye.Core/Pipeline.cs
  43. 2
      src/Tye.Core/PipelineHolder.cs
  44. 2
      src/Tye.Core/Program.cs
  45. 2
      src/Tye.Core/Project.cs
  46. 8
      src/Tye.Core/ProjectReader.cs
  47. 2
      src/Tye.Core/PushDockerImageStep.cs
  48. 4
      src/Tye.Core/Resources/Imports.targets
  49. 2
      src/Tye.Core/Secret.cs
  50. 2
      src/Tye.Core/Service.cs
  51. 2
      src/Tye.Core/ServiceBinding.cs
  52. 2
      src/Tye.Core/ServiceExecutor.cs
  53. 2
      src/Tye.Core/Source.cs
  54. 4
      src/Tye.Core/StandardOptions.cs
  55. 2
      src/Tye.Core/Step.cs
  56. 2
      src/Tye.Core/StepView.cs
  57. 6
      src/Tye.Core/TargetInstaller.cs
  58. 2
      src/Tye.Core/Templates.cs
  59. 0
      src/Tye.Core/Templates/Helm/templates/_helpers.tpl
  60. 0
      src/Tye.Core/Templates/Helm/templates/deployment.yaml
  61. 0
      src/Tye.Core/Templates/Helm/templates/service.yaml
  62. 34
      src/Tye.Core/Tye.Core.csproj
  63. 2
      src/Tye.Core/Verbosity.cs
  64. 4
      src/Tye.Core/WriteServiceYamlStep.cs
  65. 12
      src/Tye.Core/build/Tye.targets
  66. 6
      src/Tye.Core/buildMultiTargeting/Tye.targets
  67. 13
      src/opulence/Opulence/Opulence.csproj
  68. 142
      src/opulence/dotnet-opulence/ApplicationFactory.cs
  69. 59
      src/opulence/dotnet-opulence/GenerateCommand.cs
  70. 119
      src/opulence/dotnet-opulence/PackageCommand.cs
  71. 8
      src/opulence/dotnet-opulence/Properties/launchSettings.json
  72. 55
      src/opulence/dotnet-opulence/PushCommand.cs
  73. 166
      src/opulence/dotnet-opulence/ScriptRunner.cs
  74. 44
      src/opulence/dotnet-opulence/dotnet-opulence.csproj
  75. 12
      src/tye/ConfigModel/ConfigApplication.cs
  76. 5
      src/tye/OpulenceApplicationAdapter.cs
  77. 29
      src/tye/Program.DeployCommand.cs
  78. 11
      src/tye/Program.GenerateCommand.cs
  79. 1
      src/tye/Program.InitCommand.cs
  80. 2
      src/tye/tye.csproj
  81. 48
      tye.sln

2
src/opulence/dotnet-opulence/Application.cs → src/Tye.Core/Application.cs

@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
namespace Opulence
namespace Tye
{
public abstract class Application
{

2
src/opulence/Opulence/ApplicationGlobals.cs → src/Tye.Core/ApplicationGlobals.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public sealed class ApplicationGlobals
{

2
src/opulence/dotnet-opulence/ApplicationYamlWriter.cs → src/Tye.Core/ApplicationYamlWriter.cs

@ -4,7 +4,7 @@ using System.Text;
using System.Threading.Tasks;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
public sealed class ApplicationYamlWriter
{

2
src/opulence/dotnet-opulence/BuildDockerImageStep.cs → src/Tye.Core/BuildDockerImageStep.cs

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public sealed class BuildDockerImageStep : ServiceExecutor.Step
{

2
src/opulence/dotnet-opulence/CombineStep.cs → src/Tye.Core/CombineStep.cs

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public sealed class CombineStep : ServiceExecutor.Step
{

2
src/opulence/dotnet-opulence/CommandException.cs → src/Tye.Core/CommandException.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
internal class CommandException : Exception
{

2
src/opulence/dotnet-opulence/ComputedBindings.cs → src/Tye.Core/ComputedBindings.cs

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Opulence
namespace Tye
{
public class ComputedBindings : ServiceOutput
{

0
src/opulence/dotnet-opulence/ConsoleExtensions.cs → src/Tye.Core/ConsoleExtensions.cs

2
src/opulence/Opulence/ContainerInfo.cs → src/Tye.Core/ContainerInfo.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public sealed class ContainerInfo
{

2
src/opulence/Opulence/ContainerRegistry.cs → src/Tye.Core/ContainerRegistry.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public sealed class ContainerRegistry
{

2
src/opulence/dotnet-opulence/CustomizationPipeline.cs → src/Tye.Core/CustomizationPipeline.cs

@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks;
using Microsoft.Build.Construction;
namespace Opulence
namespace Tye
{
internal class CustomizationPipeline : Pipeline
{

4
src/opulence/dotnet-opulence/DeployServiceYamlStep.cs → src/Tye.Core/DeployServiceYamlStep.cs

@ -6,7 +6,7 @@ using System.Threading.Tasks;
using Tye;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
public sealed class DeployServiceYamlStep : ServiceExecutor.Step
{
@ -28,7 +28,7 @@ namespace Opulence
{
using var stream = File.OpenWrite(tempFile.FilePath);
using var writer = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true);
using var writer = new StreamWriter(stream, Encoding.UTF8, bufferSize: -1, leaveOpen: true);
var yamlStream = new YamlStream(yaml.Select(y => y.Yaml));
yamlStream.Save(writer, assignAnchors: false);
}

2
src/opulence/Opulence/DeploymentKind.cs → src/Tye.Core/DeploymentKind.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public enum DeploymentKind
{

2
src/opulence/dotnet-opulence/DirectoryCopy.cs → src/Tye.Core/DirectoryCopy.cs

@ -1,6 +1,6 @@
using System.IO;
namespace Opulence
namespace Tye
{
public static class DirectoryCopy
{

2
src/opulence/dotnet-opulence/DirectorySearch.cs → src/Tye.Core/DirectorySearch.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Opulence
namespace Tye
{
internal static class DirectorySearch
{

2
src/opulence/dotnet-opulence/DockerContainerBuilder.cs → src/Tye.Core/DockerContainerBuilder.cs

@ -4,7 +4,7 @@ using System.IO;
using System.Threading.Tasks;
using Tye;
namespace Opulence
namespace Tye
{
internal static class DockerContainerBuilder
{

2
src/opulence/Opulence/DockerImage.cs → src/Tye.Core/DockerImage.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public sealed class DockerImage : Source
{

2
src/opulence/dotnet-opulence/DockerPush.cs → src/Tye.Core/DockerPush.cs

@ -2,7 +2,7 @@
using System.CommandLine.Invocation;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal static class DockerPush
{

4
src/opulence/dotnet-opulence/DockerfileGenerator.cs → src/Tye.Core/DockerfileGenerator.cs

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public static class DockerfileGenerator
{
@ -41,7 +41,7 @@ namespace Opulence
}
using var stream = File.OpenWrite(filePath);
using var writer = new StreamWriter(stream, encoding: Encoding.UTF8, leaveOpen: true);
using var writer = new StreamWriter(stream, encoding: Encoding.UTF8, bufferSize: -1, leaveOpen: true);
var entryPoint = Path.GetFileNameWithoutExtension(project.RelativeFilePath);
output.WriteDebugLine($"Writing dockerfile to '{filePath}'.");

2
src/opulence/Opulence/EnvironmentAttribute.cs → src/Tye.Core/EnvironmentAttribute.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public class EnvironmentAttribute : Attribute
{

2
src/opulence/Opulence/Environments.cs → src/Tye.Core/Environments.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public static class Environments
{

2
src/opulence/Opulence/Framework.cs → src/Tye.Core/Framework.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public sealed class Framework
{

2
src/opulence/Opulence/FrameworkCollection.cs → src/Tye.Core/FrameworkCollection.cs

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Opulence
namespace Tye
{
public sealed class FrameworkCollection : Collection<Framework>
{

2
src/opulence/dotnet-opulence/GenerateDockerfileStep.cs → src/Tye.Core/GenerateDockerfileStep.cs

@ -1,7 +1,7 @@
using System.IO;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal sealed class GenerateDockerfileStep : ServiceExecutor.Step
{

2
src/opulence/dotnet-opulence/GenerateHelmChartStep.cs → src/Tye.Core/GenerateHelmChartStep.cs

@ -1,7 +1,7 @@
using System.IO;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal sealed class GenerateHelmChartStep : ServiceExecutor.Step
{

2
src/opulence/dotnet-opulence/GenerateKubernetesManifestStep.cs → src/Tye.Core/GenerateKubernetesManifestStep.cs

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public sealed class GenerateKubernetesManifestStep : ServiceExecutor.Step
{

2
src/opulence/dotnet-opulence/GenerateOamComponentStep.cs → src/Tye.Core/GenerateOamComponentStep.cs

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal sealed class GenerateOamComponentStep : ServiceExecutor.Step
{

2
src/opulence/Opulence/GeneratedAssets.cs → src/Tye.Core/GeneratedAssets.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public sealed class GeneratedAssets
{

2
src/opulence/dotnet-opulence/HelmChartBuilder.cs → src/Tye.Core/HelmChartBuilder.cs

@ -4,7 +4,7 @@ using System.IO;
using System.Threading.Tasks;
using Tye;
namespace Opulence
namespace Tye
{
internal static class HelmChartBuilder
{

4
src/opulence/dotnet-opulence/HelmChartGenerator.cs → src/Tye.Core/HelmChartGenerator.cs

@ -2,7 +2,7 @@
using System.IO;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal static class HelmChartGenerator
{
@ -67,7 +67,7 @@ namespace Opulence
$"apiVersion: v1",
$"name: {chart.ChartName}",
$"# helm requires the version and appVersion to specified in Chart.yaml",
$"# opulence will override these values when packaging the chart",
$"# tye will override these values when packaging the chart",
$"version: {project.Version.Replace('+', '-')}",
$"appVersion: {project.Version.Replace('+', '-')}"
});

2
src/opulence/Opulence/HelmChartStep.cs → src/Tye.Core/HelmChartStep.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public sealed class HelmChartStep : Step
{

2
src/opulence/dotnet-opulence/HelmPush.cs → src/Tye.Core/HelmPush.cs

@ -2,7 +2,7 @@
using System.CommandLine.Invocation;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
internal static class HelmPush
{

2
src/opulence/dotnet-opulence/IYamlManifestOutput.cs → src/Tye.Core/IYamlManifestOutput.cs

@ -1,6 +1,6 @@
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal interface IYamlManifestOutput
{

2
src/opulence/dotnet-opulence/KubernetesDeploymentOutput.cs → src/Tye.Core/KubernetesDeploymentOutput.cs

@ -1,7 +1,7 @@
using System;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal sealed class KubernetesDeploymentOutput : ServiceOutput, IYamlManifestOutput
{

18
src/opulence/dotnet-opulence/KubernetesManifestGenerator.cs → src/Tye.Core/KubernetesManifestGenerator.cs

@ -3,7 +3,7 @@ using System.Linq;
using YamlDotNet.Core;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal static class KubernetesManifestGenerator
{
@ -36,7 +36,11 @@ namespace Opulence
var labels = new YamlMappingNode();
metadata.Add("labels", labels);
labels.Add("app.kubernetes.io/name", service.Service.Name);
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
if (application.Globals.Name is object)
{
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
}
var spec = new YamlMappingNode();
root.Add("spec", spec);
@ -96,7 +100,10 @@ namespace Opulence
var labels = new YamlMappingNode();
metadata.Add("labels", labels);
labels.Add("app.kubernetes.io/name", service.Service.Name);
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
if (application.Globals.Name is object)
{
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
}
var spec = new YamlMappingNode();
root.Add("spec", spec);
@ -117,7 +124,10 @@ namespace Opulence
labels = new YamlMappingNode();
metadata.Add("labels", labels);
labels.Add("app.kubernetes.io/name", service.Service.Name);
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
if (application.Globals.Name is object)
{
labels.Add("app.kubernetes.io/part-of", application.Globals.Name);
}
spec = new YamlMappingNode();
template.Add("spec", spec);

2
src/opulence/dotnet-opulence/KubernetesServiceOutput.cs → src/Tye.Core/KubernetesServiceOutput.cs

@ -1,7 +1,7 @@
using System;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal sealed class KubernetesServiceOutput : ServiceOutput, IYamlManifestOutput
{

2
src/opulence/dotnet-opulence/Names.cs → src/Tye.Core/Names.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
internal static class Names
{

2
src/opulence/dotnet-opulence/OamApplicationGenerator.cs → src/Tye.Core/OamApplicationGenerator.cs

@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal static class OamApplicationGenerator
{

2
src/opulence/dotnet-opulence/OamComponentGenerator.cs → src/Tye.Core/OamComponentGenerator.cs

@ -2,7 +2,7 @@
using System.Linq;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal static class OamComponentGenerator
{

2
src/opulence/dotnet-opulence/OamComponentOutput.cs → src/Tye.Core/OamComponentOutput.cs

@ -1,7 +1,7 @@
using System;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal sealed class OamComponentOutput : ServiceOutput, IYamlManifestOutput
{

2
src/opulence/dotnet-opulence/OutputContext.cs → src/Tye.Core/OutputContext.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.IO;
namespace Opulence
namespace Tye
{
public sealed class OutputContext
{

2
src/opulence/Opulence/Pipeline.cs → src/Tye.Core/Pipeline.cs

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public abstract class Pipeline
{

2
src/opulence/Opulence/PipelineHolder.cs → src/Tye.Core/PipelineHolder.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public sealed class PipelineHolder
{

2
src/opulence/dotnet-opulence/Program.cs → src/Tye.Core/Program.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
static class Program
{

2
src/opulence/Opulence/Project.cs → src/Tye.Core/Project.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public sealed class Project : Source
{

8
src/opulence/dotnet-opulence/ProjectReader.cs → src/Tye.Core/ProjectReader.cs

@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks;
using Semver;
namespace Opulence
namespace Tye
{
public static class ProjectReader
{
@ -59,7 +59,7 @@ namespace Opulence
try
{
var capture = output.Capture();
var opulenceRoot = Path.GetDirectoryName(typeof(Program).Assembly.Location);
var programRoot = Path.GetDirectoryName(typeof(Program).Assembly.Location);
var restore = string.Empty;
if (!File.Exists(Path.Combine(projectFile.DirectoryName, "obj", "project.assets.json")))
@ -68,10 +68,10 @@ namespace Opulence
}
output.WriteDebugLine("Running 'dotnet msbuild'.");
output.WriteCommandLine("dotnet", $"msbuild {restore} /t:EvaluateOpulenceProjectInfo \"/p:OpulenceTargetLocation={opulenceRoot}\" \"/p:OpulenceOutputFilePath={outputFilePath}\"");
output.WriteCommandLine("dotnet", $"msbuild {restore} /t:EvaluateTyeProjectInfo \"/p:TyeTargetLocation={programRoot}\" \"/p:TyeOutputFilePath={outputFilePath}\"");
var exitCode = await Process.ExecuteAsync(
$"dotnet",
$"msbuild {restore} /t:EvaluateOpulenceProjectInfo \"/p:OpulenceTargetLocation={opulenceRoot}\" \"/p:OpulenceOutputFilePath={outputFilePath}\"",
$"msbuild {restore} /t:EvaluateTyeProjectInfo \"/p:TyeTargetLocation={programRoot}\" \"/p:TyeOutputFilePath={outputFilePath}\"",
workingDir: projectFile.DirectoryName,
stdOut: capture.StdOut,
stdErr: capture.StdErr);

2
src/opulence/dotnet-opulence/PushDockerImageStep.cs → src/Tye.Core/PushDockerImageStep.cs

@ -1,7 +1,7 @@
using System.Linq;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public sealed class PushDockerImageStep : ServiceExecutor.Step
{

4
src/opulence/dotnet-opulence/Resources/Imports.targets → src/Tye.Core/Resources/Imports.targets

@ -1,8 +1,8 @@
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(TargetFramework)' == '' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(OpulenceTargetLocation)\buildMultiTargeting\Opulence.targets" Condition="'$(OpulenceTargetLocation)'!=''" />
<Import Project="$(TyeTargetLocation)\buildMultiTargeting\Tye.targets" Condition="'$(TyeTargetLocation)'!=''" />
</ImportGroup>
<ImportGroup Condition=" '$(TargetFramework)' != '' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(OpulenceTargetLocation)\build\Opulence.targets" Condition="'$(OpulenceTargetLocation)'!=''" />
<Import Project="$(TyeTargetLocation)\build\Tye.targets" Condition="'$(TyeTargetLocation)'!=''" />
</ImportGroup>
</Project>

2
src/opulence/Opulence/Secret.cs → src/Tye.Core/Secret.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public class Secret
{

2
src/opulence/Opulence/Service.cs → src/Tye.Core/Service.cs

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Opulence
namespace Tye
{
public sealed class Service
{

2
src/opulence/Opulence/ServiceBinding.cs → src/Tye.Core/ServiceBinding.cs

@ -1,6 +1,6 @@
using System;
namespace Opulence
namespace Tye
{
public class ServiceBinding
{

2
src/opulence/dotnet-opulence/ServiceExecutor.cs → src/Tye.Core/ServiceExecutor.cs

@ -5,7 +5,7 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace Opulence
namespace Tye
{
public sealed class ServiceExecutor
{

2
src/opulence/Opulence/Source.cs → src/Tye.Core/Source.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public abstract class Source
{

4
src/opulence/dotnet-opulence/StandardOptions.cs → src/Tye.Core/StandardOptions.cs

@ -5,7 +5,7 @@ using System.CommandLine.Parsing;
using System.IO;
using System.Linq;
namespace Opulence
namespace Tye
{
public static class StandardOptions
{
@ -183,7 +183,7 @@ namespace Opulence
{
return new Option(new[] { "-v", "--verbosity" }, "Output verbostiy")
{
Argument = new Argument<Verbosity>("one of: quiet|info|debug", () => Opulence.Verbosity.Info)
Argument = new Argument<Verbosity>("one of: quiet|info|debug", () => Tye.Verbosity.Info)
{
Arity = ArgumentArity.ExactlyOne,
},

2
src/opulence/Opulence/Step.cs → src/Tye.Core/Step.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public abstract class Step
{

2
src/opulence/dotnet-opulence/StepView.cs → src/Tye.Core/StepView.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
internal class StepView
{

6
src/opulence/dotnet-opulence/TargetInstaller.cs → src/Tye.Core/TargetInstaller.cs

@ -5,7 +5,7 @@ using System;
using System.IO;
using System.Reflection;
namespace Opulence
namespace Tye
{
public static class TargetInstaller
{
@ -21,7 +21,7 @@ namespace Opulence
Directory.CreateDirectory(intermediateDirectory);
var fileName = $"{Path.GetFileName(projectFilePath)}.opulence.targets";
var fileName = $"{Path.GetFileName(projectFilePath)}.Tye.targets";
var targetFilePath = Path.Combine(intermediateDirectory, fileName);
if (File.Exists(targetFilePath))
@ -31,7 +31,7 @@ namespace Opulence
var toolType = typeof(TargetInstaller);
var toolAssembly = toolType.GetTypeInfo().Assembly;
var toolImportTargetsResourceName = $"Opulence.Resources.Imports.targets";
var toolImportTargetsResourceName = $"Tye.Resources.Imports.targets";
using var stream = toolAssembly.GetManifestResourceStream(toolImportTargetsResourceName);
if (stream == null)

2
src/opulence/dotnet-opulence/Templates.cs → src/Tye.Core/Templates.cs

@ -1,6 +1,6 @@
using System.IO;
namespace Opulence
namespace Tye
{
internal static class Templates
{

0
src/opulence/dotnet-opulence/Templates/Helm/templates/_helpers.tpl → src/Tye.Core/Templates/Helm/templates/_helpers.tpl

0
src/opulence/dotnet-opulence/Templates/Helm/templates/deployment.yaml → src/Tye.Core/Templates/Helm/templates/deployment.yaml

0
src/opulence/dotnet-opulence/Templates/Helm/templates/service.yaml → src/Tye.Core/Templates/Helm/templates/service.yaml

34
src/Tye.Core/Tye.Core.csproj

@ -0,0 +1,34 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<RootNamespace>Tye</RootNamespace>
<LangVersion>8.0</LangVersion>
<Nullable>Enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="KubernetesClient" Version="1.6.11" />
<PackageReference Include="semver" Version="2.0.6" />
<PackageReference Include="Sln" Version="0.3.0" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta1.20071.2" />
<PackageReference Include="System.Commandline.Rendering" Version="0.3.0-alpha.20070.2" />
<PackageReference Include="YamlDotNet" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<Content Include="build\**" CopyToOutputDirectory="PreserveNewest" />
<Content Include="buildMultiTargeting\**" CopyToOutputDirectory="PreserveNewest" />
<Content Include="Templates\**" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\tye\TempDirectory.cs" Link="TempDirectory.cs" />
<Compile Include="..\tye\TempFile.cs" Link="TempFile.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Imports.targets" />
</ItemGroup>
</Project>

2
src/opulence/dotnet-opulence/Verbosity.cs → src/Tye.Core/Verbosity.cs

@ -1,4 +1,4 @@
namespace Opulence
namespace Tye
{
public enum Verbosity
{

4
src/opulence/dotnet-opulence/WriteServiceYamlStep.cs → src/Tye.Core/WriteServiceYamlStep.cs

@ -4,7 +4,7 @@ using System.Text;
using System.Threading.Tasks;
using YamlDotNet.RepresentationModel;
namespace Opulence
namespace Tye
{
internal sealed class WriteServiceYamlStep : ServiceExecutor.Step
{
@ -33,7 +33,7 @@ namespace Opulence
File.Delete(outputFilePath);
using var stream = File.OpenWrite(outputFilePath);
using var writer = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true);
using var writer = new StreamWriter(stream, Encoding.UTF8, bufferSize: -1, leaveOpen: true);
var yamlStream = new YamlStream(yaml.Select(y => y.Yaml));
yamlStream.Save(writer, assignAnchors: false);

12
src/opulence/dotnet-opulence/build/Opulence.targets → src/Tye.Core/build/Tye.targets

@ -1,17 +1,17 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<EvaluateOpulenceProjectInfoDependsOn>
$(EvaluateOpulenceProjectInfoDependsOn);
<EvaluateTyeProjectInfoDependsOn>
$(EvaluateTyeProjectInfoDependsOn);
ResolveReferences;
ResolvePackageDependenciesDesignTime;
PrepareResources;
GetAssemblyAttributes;
</EvaluateOpulenceProjectInfoDependsOn>
</EvaluateTyeProjectInfoDependsOn>
</PropertyGroup>
<Target Name="EvaluateOpulenceProjectInfo" DependsOnTargets="$(EvaluateOpulenceProjectInfoDependsOn)">
<Error Message="OpulenceOutputFilePath was not specified." Condition="'$(OpulenceOutputFilePath)'==''" />
<Target Name="EvaluateTyeProjectInfo" DependsOnTargets="$(EvaluateTyeProjectInfoDependsOn)">
<Error Message="TyeOutputFilePath was not specified." Condition="'$(TyeOutputFilePath)'==''" />
<PropertyGroup>
<_Frameworks>@(FrameworkReference, ',')</_Frameworks>
@ -22,7 +22,7 @@
<_Lines Include="frameworks=$(_Frameworks)" />
</ItemGroup>
<WriteLinesToFile File="$(OpulenceOutputFilePath)" Lines="@(_Lines)" Overwrite="true" />
<WriteLinesToFile File="$(TyeOutputFilePath)" Lines="@(_Lines)" Overwrite="true" />
</Target>
</Project>

6
src/opulence/dotnet-opulence/buildMultiTargeting/Opulence.targets → src/Tye.Core/buildMultiTargeting/Tye.targets

@ -1,7 +1,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="GetNearestTargetFramework" AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" />
<Target Name="EvaluateOpulenceProjectInfo" DependsOnTargets="$(EvaluateOpulenceProjectInfoDependsOn)">
<Target Name="EvaluateTyeProjectInfo" DependsOnTargets="$(EvaluateTyeProjectInfoDependsOn)">
<GetNearestTargetFramework
ReferringTargetFramework="netcoreapp3.0"
PossibleTargetFrameworks="$(TargetFrameworks)"
@ -10,11 +10,11 @@
<Output PropertyName="NearestTargetFramework" TaskParameter="NearestTargetFramework" />
</GetNearestTargetFramework>
<Error Text="Opulence requires targeting netcoreapp3.0 and newer." Condition=" '$(NearestTargetFramework)' == '' " />
<Error Text="Tye requires targeting netcoreapp3.0 and newer." Condition=" '$(NearestTargetFramework)' == '' " />
<MSBuild
Projects="$(MSBuildProjectFile)"
Targets="EvaluateOpulenceProjectInfo"
Targets="EvaluateTyeProjectInfo"
Properties="TargetFramework=$(NearestTargetFramework);OutputFile=$(OutputFile)" />
</Target>
</Project>

13
src/opulence/Opulence/Opulence.csproj

@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>8.0</LangVersion>
<Nullable>Enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="4.7.0" />
</ItemGroup>
</Project>

142
src/opulence/dotnet-opulence/ApplicationFactory.cs

@ -1,142 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Build.Construction;
namespace Opulence
{
public static class ApplicationFactory
{
public static async Task<Application> CreateApplicationAsync(OutputContext output, FileInfo projectFile)
{
if (output is null)
{
throw new ArgumentNullException(nameof(output));
}
if (projectFile is null)
{
throw new ArgumentNullException(nameof(projectFile));
}
if (string.Equals(projectFile.Extension, ".sln", StringComparison.Ordinal))
{
output.WriteDebugLine($"Solution '{projectFile.FullName}' was provided as input.");
return await CreateApplicationForSolutionAsync(output, projectFile);
}
else
{
output.WriteDebugLine($"Project '{projectFile.FullName}' was provided as input.");
return await CreateApplicationForProjectAsync(output, projectFile);
}
}
private static async Task<Application> CreateApplicationForProjectAsync(OutputContext output, FileInfo projectFile)
{
// Project workflow:
//
// 1. Determine if there's an 'Opulence.csx' - use that to initialize the set of services.
// 2. If there's not an 'Opulence.csx' then move on with just the project.
var application = await ScriptRunner.RunCustomizationScriptAsync(output, projectFile);
if (application != null)
{
return application;
}
return await InferApplicationForProject(output, projectFile);
}
private static async Task<Application> InferApplicationForProject(OutputContext output, FileInfo projectFile)
{
var globals = new ApplicationGlobals();
globals.Name = Names.NormalizeToDns(Path.GetFileNameWithoutExtension(projectFile.Name));
var services = new List<ServiceEntry>();
var name = Path.GetFileNameWithoutExtension(projectFile.Name);
var project = new Project(projectFile.FullName);
var service = new ServiceEntry(new Service(name), name);
service.Service.Source = project;
services.Add(service);
await ProjectReader.ReadProjectDetailsAsync(output, projectFile, project);
var container = new ContainerInfo();
service.Service.GeneratedAssets.Container = container;
var application = new GroveledApplication(globals, projectFile.DirectoryName, services);
DockerfileGenerator.ApplyContainerDefaults(application, service, project, container);
return application;
}
private static async Task<Application> CreateApplicationForSolutionAsync(OutputContext output, FileInfo solutionFile)
{
// Solution workflow:
//
// 1. If there's an 'Opulence.csx' - use that that to initialize the set of services.
// 2. If there's not an 'Opulence.csx' then grovel all of the projects in the solution looking
// for executable projects.
SolutionFile solution;
try
{
solution = SolutionFile.Parse(solutionFile.FullName);
}
catch (Exception ex)
{
throw new CommandException($"Parsing solution file '{solutionFile.FullName}' failed.", ex);
}
var application = await ScriptRunner.RunCustomizationScriptAsync(output, solutionFile, solution);
if (application != null)
{
return application;
}
return await InferApplicationForSolution(output, solutionFile, solution);
}
private static async Task<Application> InferApplicationForSolution(OutputContext output, FileInfo solutionFile, SolutionFile solution)
{
var globals = new ApplicationGlobals();
globals.Name = Names.NormalizeToDns(Path.GetFileNameWithoutExtension(solutionFile.Name));
var services = new List<ServiceEntry>();
for (var i = 0; i < solution.ProjectsInOrder.Count; i++)
{
// The library we're using doesn't translate Windows style paths automatically.
var solutionProject = solution.ProjectsInOrder[i];
if (solutionProject.AbsolutePath.EndsWith(".csproj", StringComparison.Ordinal))
{
var projectFilePath = solutionProject.RelativePath.Replace('\\', Path.DirectorySeparatorChar);
var projectFile = new FileInfo(projectFilePath);
var name = Path.GetFileNameWithoutExtension(projectFile.Name);
var project = new Project(projectFile.FullName);
var service = new ServiceEntry(new Service(name), name);
service.Service.Source = project;
services.Add(service);
await ProjectReader.ReadProjectDetailsAsync(output, projectFile, project);
var container = new ContainerInfo();
service.Service.GeneratedAssets.Container = container;
}
}
var application = new GroveledApplication(globals, solutionFile.DirectoryName, services);
foreach (var service in application.Services)
{
DockerfileGenerator.ApplyContainerDefaults(application, service, (Project)service.Service.Source!, service.Service.GeneratedAssets.Container!);
}
return application;
}
}
}

59
src/opulence/dotnet-opulence/GenerateCommand.cs

@ -1,59 +0,0 @@
using System;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.IO;
using System.Threading.Tasks;
namespace Opulence
{
internal static class GenerateCommand
{
public static Command Create()
{
var command = new Command("generate", "Generate assets")
{
StandardOptions.Project,
StandardOptions.Verbosity,
StandardOptions.Outputs,
StandardOptions.Force,
};
command.Handler = CommandHandler.Create<IConsole, FileInfo, Verbosity, List<string>, bool>((console, project, verbosity, outputs, force) =>
{
var output = new OutputContext(console, verbosity);
return ExecuteAsync(output, project, outputs, force);
});
return command;
}
private static async Task ExecuteAsync(OutputContext output, FileInfo projectFile, List<string> outputs, bool force)
{
output.WriteBanner();
var application = await ApplicationFactory.CreateApplicationAsync(output, projectFile);
var steps = new List<ServiceExecutor.Step>();
if (outputs.Count == 0 || outputs.Contains("container"))
{
steps.Add(new GenerateDockerfileStep() { Force = force, });
}
if (outputs.Count == 0 || outputs.Contains("chart"))
{
steps.Add(new GenerateHelmChartStep());
}
var executor = new ServiceExecutor(output, application, steps);
foreach (var service in application.Services)
{
if (service.IsMatchForProject(application, projectFile))
{
await executor.ExecuteAsync(service);
}
}
}
}
}

119
src/opulence/dotnet-opulence/PackageCommand.cs

@ -1,119 +0,0 @@
using System;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace Opulence
{
public class PackageCommand
{
public static Command Create()
{
var command = new Command("package", "Package the project")
{
StandardOptions.Project,
StandardOptions.Verbosity,
StandardOptions.Force,
StandardOptions.Environment,
new Option(new []{ "-o", "--output" }, "Output directory")
{
Argument = new Argument<DirectoryInfo>("output", () => new DirectoryInfo(Environment.CurrentDirectory))
{
Arity = ArgumentArity.ExactlyOne,
},
Required = false,
},
};
command.Handler = CommandHandler.Create<IConsole, FileInfo, DirectoryInfo, string, bool, Verbosity>((console, project, output, environment, force, verbosity) =>
{
return ExecuteAsync(new OutputContext(console, verbosity), project, output, environment, force);
});
return command;
}
private static async Task ExecuteAsync(OutputContext output, FileInfo projectFile, DirectoryInfo outputDirectory, string environment, bool force)
{
output.WriteBanner();
var application = await ApplicationFactory.CreateApplicationAsync(output, projectFile);
var steps = new List<ServiceExecutor.Step>
{
new CombineStep() { Environment = environment, },
new BuildDockerImageStep() { Environment = environment, },
};
if (application.Globals.DeploymentKind == DeploymentKind.None)
{
// No extra steps
}
else if (application.Globals.DeploymentKind == DeploymentKind.Kubernetes)
{
steps.Add(new GenerateKubernetesManifestStep() { Environment = environment, });
}
else if (application.Globals.DeploymentKind == DeploymentKind.Oam)
{
steps.Add(new GenerateOamComponentStep() { Environment = environment, });
}
else
{
throw new InvalidOperationException($"Unknown DeploymentKind: " + application.Globals.DeploymentKind);
}
// If this is command is for a project, then write out the component manifest
// for just the project. We won't run the "application package" part.
if (!string.Equals(".sln", projectFile.Extension, StringComparison.Ordinal))
{
steps.Add(new WriteServiceYamlStep() { OutputDirectory = outputDirectory, Force = force, });
}
var executor = new ServiceExecutor(output, application, steps);
foreach (var service in application.Services)
{
if (service.IsMatchForProject(application, projectFile))
{
await executor.ExecuteAsync(service);
}
}
if (string.Equals(".sln", projectFile.Extension, StringComparison.Ordinal))
{
await PackageApplicationAsync(output, application, outputDirectory, Path.GetFileNameWithoutExtension(projectFile.Name), environment);
}
}
private static async Task PackageApplicationAsync(OutputContext output, Application application, DirectoryInfo outputDirectory, string applicationName, string environment)
{
using var step = output.BeginStep("Writing Application Manifests...");
var outputFile = Path.Combine(outputDirectory.FullName, $"{applicationName}-{environment}.yaml");
output.WriteInfoLine($"Writing output to '{outputFile}'.");
File.Delete(outputFile);
using var stream = File.OpenWrite(outputFile);
using var writer = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true);
if (application.Globals.DeploymentKind == DeploymentKind.None)
{
// No extra steps
}
else if (application.Globals.DeploymentKind == DeploymentKind.Kubernetes)
{
await ApplicationYamlWriter.WriteAsync(output, writer, application);
}
else if (application.Globals.DeploymentKind == DeploymentKind.Oam)
{
await OamApplicationGenerator.WriteOamApplicationAsync(writer, output, application, applicationName, environment);
}
else
{
throw new InvalidOperationException($"Unknown DeploymentKind: " + application.Globals.DeploymentKind);
}
step.MarkComplete();
}
}
}

8
src/opulence/dotnet-opulence/Properties/launchSettings.json

@ -1,8 +0,0 @@
{
"profiles": {
"dotnet-opulence": {
"commandName": "Project",
"commandLineArgs": ""
}
}
}

55
src/opulence/dotnet-opulence/PushCommand.cs

@ -1,55 +0,0 @@
using System;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.IO;
using System.Threading.Tasks;
namespace Opulence
{
public class PushCommand
{
public static Command Create()
{
var command = new Command("push", "Push the application to registry")
{
StandardOptions.Project,
StandardOptions.Verbosity,
StandardOptions.Environment,
};
command.Handler = CommandHandler.Create<IConsole, FileInfo, string, Verbosity>((console, project, environment, verbosity) =>
{
return ExecuteAsync(new OutputContext(console, verbosity), project, environment);
});
return command;
}
private static async Task ExecuteAsync(OutputContext output, FileInfo projectFile, string environment)
{
output.WriteBanner();
var application = await ApplicationFactory.CreateApplicationAsync(output, projectFile);
if (application.Globals.Registry?.Hostname == null)
{
throw new CommandException("A registry is required for push operations. run 'dotnet-opulence init'.");
}
var steps = new ServiceExecutor.Step[]
{
new CombineStep() { Environment = environment, },
new BuildDockerImageStep() { Environment = environment, },
new PushDockerImageStep() { Environment = environment, },
};
var executor = new ServiceExecutor(output, application, steps);
foreach (var service in application.Services)
{
if (service.IsMatchForProject(application, projectFile))
{
await executor.ExecuteAsync(service);
}
}
}
}
}

166
src/opulence/dotnet-opulence/ScriptRunner.cs

@ -1,166 +0,0 @@
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Build.Construction;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
namespace Opulence
{
internal static class ScriptRunner
{
public static async Task<ApplicationWrapper?> RunCustomizationScriptAsync(OutputContext output, FileInfo projectFile)
{
if (output is null)
{
throw new ArgumentNullException(nameof(output));
}
using (var step = output.BeginStep("Applying Application Customizations..."))
{
var scriptFilePath = DirectorySearch.AscendingSearch(projectFile.DirectoryName, "Opulence.csx");
output.WriteDebugLine($"Looking for customization script above '{projectFile}'.");
if (!File.Exists(scriptFilePath))
{
output.WriteDebugLine($"No customization script found.");
step.MarkComplete("Skipping...");
return null;
}
output.WriteInfoLine($"Configuring application using '{Path.GetFileName(scriptFilePath)}'.");
var code = File.ReadAllText(scriptFilePath);
var script = CSharpScript.Create<object>(
code,
options: ScriptOptions.Default.WithImports(new[] { "System", "System.Collections.Generic", }),
globalsType: typeof(PipelineHolder),
assemblyLoader: null);
script = script.ContinueWith<object>(@"return await Pipeline.ExecuteAsync(__Pipeline);", options: ScriptOptions.Default);
output.WriteDebugLine($"Compiling {Path.GetFileName(scriptFilePath)}'.");
script.Compile();
var diagnostics = script.Compile();
if (diagnostics.Length > 0)
{
var builder = new StringBuilder();
output.WriteDebugLine($"Script '{scriptFilePath}' had compilation errors.");
builder.AppendLine($"Script '{scriptFilePath}' had compilation errors.");
foreach (var diagnostic in diagnostics)
{
output.WriteDebugLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic));
builder.AppendLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic));
}
throw new CommandException(builder.ToString());
}
output.WriteDebugLine($"Done compiling {Path.GetFileName(scriptFilePath)}'.");
var pipeline = new CustomizationPipeline(
output,
rootDirectory: Path.GetDirectoryName(scriptFilePath)!,
name: Names.NormalizeToDns(Path.GetFileNameWithoutExtension(projectFile.Name)),
solution: null,
projectFile);
var holder = new PipelineHolder(pipeline);
output.WriteDebugLine($"Running {Path.GetFileName(scriptFilePath)}'.");
object obj;
try
{
var result = await script.RunAsync(holder);
obj = result.ReturnValue;
}
catch (Exception ex)
{
throw new CommandException($"Failed executing {Path.GetFileName(scriptFilePath)}'.", ex);
}
step.MarkComplete();
return new ApplicationWrapper(obj, Path.GetDirectoryName(scriptFilePath)!);
}
}
public static async Task<ApplicationWrapper?> RunCustomizationScriptAsync(OutputContext output, FileInfo solutionFile, SolutionFile solution)
{
if (output is null)
{
throw new ArgumentNullException(nameof(output));
}
if (solutionFile is null)
{
throw new ArgumentNullException(nameof(solutionFile));
}
if (solution is null)
{
throw new ArgumentNullException(nameof(solution));
}
using (var step = output.BeginStep("Applying Application Customizations..."))
{
var scriptFilePath = Path.Combine(solutionFile.DirectoryName, "Opulence.csx");
output.WriteDebugLine($"Looking for customization script at '{scriptFilePath}'.");
if (!File.Exists(scriptFilePath))
{
output.WriteDebugLine($"No customization script found.");
step.MarkComplete("Skipping...");
return null;
}
output.WriteInfoLine($"Configuring application using '{Path.GetFileName(scriptFilePath)}'.");
var code = File.ReadAllText(scriptFilePath);
var script = CSharpScript.Create<object>(
code,
options: ScriptOptions.Default.WithImports(new[] { "System", "System.Collections.Generic", }),
globalsType: typeof(PipelineHolder),
assemblyLoader: null);
script = script.ContinueWith<object>(@"return await Pipeline.ExecuteAsync(__Pipeline);", options: ScriptOptions.Default);
output.WriteDebugLine($"Compiling {Path.GetFileName(scriptFilePath)}'.");
script.Compile();
var diagnostics = script.Compile();
if (diagnostics.Length > 0)
{
var builder = new StringBuilder();
output.WriteDebugLine($"Script '{scriptFilePath}' had compilation errors.");
builder.AppendLine($"Script '{scriptFilePath}' had compilation errors.");
foreach (var diagnostic in diagnostics)
{
output.WriteDebugLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic));
builder.AppendLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic));
}
throw new CommandException(builder.ToString());
}
output.WriteDebugLine($"Done compiling {Path.GetFileName(scriptFilePath)}'.");
var pipeline = new CustomizationPipeline(
output,
rootDirectory: Path.GetDirectoryName(scriptFilePath)!,
name: Names.NormalizeToDns(Path.GetFileNameWithoutExtension(solutionFile.Name)),
solution,
projectFile: null);
var holder = new PipelineHolder(pipeline);
output.WriteDebugLine($"Running {Path.GetFileName(scriptFilePath)}'.");
object obj;
try
{
var result = await script.RunAsync(holder);
obj = result.ReturnValue;
}
catch (Exception ex)
{
throw new CommandException($"Failed executing {Path.GetFileName(scriptFilePath)}'.", ex);
}
step.MarkComplete();
return new ApplicationWrapper(obj, Path.GetDirectoryName(scriptFilePath)!);
}
}
}
}

44
src/opulence/dotnet-opulence/dotnet-opulence.csproj

@ -1,44 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>Opulence</RootNamespace>
<PackAsTool>true</PackAsTool>
<PackageId>Opulence.dotnet-opulence</PackageId>
<ToolCommandName>opulence</ToolCommandName>
<Nullable>Enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="KubernetesClient" Version="1.6.11" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.4.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="3.4.0" />
<PackageReference Include="semver" Version="2.0.6" />
<PackageReference Include="Sln" Version="0.3.0" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta1.20071.2" />
<PackageReference Include="System.Commandline.Rendering" Version="0.3.0-alpha.20070.2" />
<PackageReference Include="System.Reflection.Metadata" Version="1.8.0" />
<PackageReference Include="YamlDotNet.Signed" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Opulence\Opulence.csproj" />
</ItemGroup>
<ItemGroup>
<Content Include="build\**" CopyToOutputDirectory="PreserveNewest" />
<Content Include="buildMultiTargeting\**" CopyToOutputDirectory="PreserveNewest" />
<Content Include="Templates\**" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\tye\TempDirectory.cs" Link="TempDirectory.cs" />
<Compile Include="..\..\tye\TempFile.cs" Link="TempFile.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Imports.targets" />
</ItemGroup>
</Project>

12
src/tye/ConfigModel/ConfigApplication.cs

@ -18,9 +18,9 @@ namespace Tye.ConfigModel
public List<ConfigService> Services { get; set; } = new List<ConfigService>();
public Application ToHostingApplication()
public Micronetes.Hosting.Model.Application ToHostingApplication()
{
var services = new Dictionary<string, Service>();
var services = new Dictionary<string, Micronetes.Hosting.Model.Service>();
foreach (var service in Services)
{
RunInfo? runInfo;
@ -45,14 +45,14 @@ namespace Tye.ConfigModel
throw new InvalidOperationException($"Cannot figure out how to run service '{service.Name}'.");
}
var description = new ServiceDescription(service.Name, runInfo)
var description = new Micronetes.Hosting.Model.ServiceDescription(service.Name, runInfo)
{
Replicas = service.Replicas ?? 1,
};
foreach (var binding in service.Bindings)
{
description.Bindings.Add(new ServiceBinding()
description.Bindings.Add(new Micronetes.Hosting.Model.ServiceBinding()
{
ConnectionString = binding.ConnectionString,
Host = binding.Host,
@ -68,10 +68,10 @@ namespace Tye.ConfigModel
description.Configuration.Add(new ConfigurationSource(entry.Name, entry.Value));
}
services.Add(service.Name, new Service(description));
services.Add(service.Name, new Micronetes.Hosting.Model.Service(description));
}
return new Application(Source, services);
return new Micronetes.Hosting.Model.Application(Source, services);
}
}
}

5
src/tye/OpulenceApplicationAdapter.cs

@ -1,14 +1,13 @@
using System.Collections.Generic;
using Opulence;
using Tye.ConfigModel;
namespace Tye
{
internal class OpulenceApplicationAdapter : Opulence.Application
internal class TemporaryApplicationAdapter : Tye.Application
{
private readonly ConfigApplication application;
public OpulenceApplicationAdapter(
public TemporaryApplicationAdapter(
ConfigApplication application,
ApplicationGlobals globals,
IReadOnlyList<ServiceEntry> services)

29
src/tye/Program.DeployCommand.cs

@ -5,7 +5,6 @@ using System.CommandLine.Invocation;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Opulence;
using Tye.ConfigModel;
namespace Tye
@ -38,7 +37,7 @@ namespace Tye
private static async Task ExecuteDeployAsync(OutputContext output, ConfigApplication application, string environment, bool interactive)
{
var opulenceApplication = await CreateOpulenceApplicationAsync(output, application, interactive);
var temporaryApplication = await CreateApplicationAdapterAsync(output, application, interactive);
var steps = new List<ServiceExecutor.Step>()
{
new CombineStep() { Environment = environment, },
@ -49,16 +48,16 @@ namespace Tye
steps.Add(new GenerateKubernetesManifestStep() { Environment = environment, });
steps.Add(new DeployServiceYamlStep() { Environment = environment, });
var executor = new ServiceExecutor(output, opulenceApplication, steps);
foreach (var service in opulenceApplication.Services)
var executor = new ServiceExecutor(output, temporaryApplication, steps);
foreach (var service in temporaryApplication.Services)
{
await executor.ExecuteAsync(service);
}
await DeployApplicationManifestAsync(output, opulenceApplication, application.Source.Directory.Name, environment);
await DeployApplicationManifestAsync(output, temporaryApplication, application.Source.Directory.Name, environment);
}
private static async Task<OpulenceApplicationAdapter> CreateOpulenceApplicationAsync(OutputContext output, ConfigApplication application, bool interactive)
private static async Task<TemporaryApplicationAdapter> CreateApplicationAdapterAsync(OutputContext output, ConfigApplication application, bool interactive)
{
var globals = new ApplicationGlobals()
{
@ -66,7 +65,7 @@ namespace Tye
Registry = application.Registry is null ? null : new ContainerRegistry(application.Registry),
};
var services = new List<Opulence.ServiceEntry>();
var services = new List<Tye.ServiceEntry>();
foreach (var configService in application.Services)
{
if (configService.Project is string projectFile)
@ -120,29 +119,29 @@ namespace Tye
}
}
var opulenceApplication = new OpulenceApplicationAdapter(application, globals, services);
if (opulenceApplication.Globals.Registry?.Hostname == null && interactive)
var temporaryApplication = new TemporaryApplicationAdapter(application, globals, services);
if (temporaryApplication.Globals.Registry?.Hostname == null && interactive)
{
var registry = output.Prompt("Enter the Container Registry (ex: 'example.azurecr.io' for Azure or 'example' for dockerhub)");
opulenceApplication.Globals.Registry = new ContainerRegistry(registry);
temporaryApplication.Globals.Registry = new ContainerRegistry(registry);
}
else if (opulenceApplication.Globals.Registry?.Hostname == null)
else if (temporaryApplication.Globals.Registry?.Hostname == null)
{
throw new CommandException("A registry is required for deploy operations. Add the registry to 'tye.yaml' or use '-i' for interactive mode.");
}
foreach (var service in opulenceApplication.Services)
foreach (var service in temporaryApplication.Services)
{
if (service.Service.Source is Project project && service.Service.GeneratedAssets.Container is ContainerInfo container)
{
DockerfileGenerator.ApplyContainerDefaults(opulenceApplication, service, project, container);
DockerfileGenerator.ApplyContainerDefaults(temporaryApplication, service, project, container);
}
}
return opulenceApplication;
return temporaryApplication;
}
private static async Task DeployApplicationManifestAsync(OutputContext output, Opulence.Application application, string applicationName, string environment)
private static async Task DeployApplicationManifestAsync(OutputContext output, Tye.Application application, string applicationName, string environment)
{
using var step = output.BeginStep("Deploying Application Manifests...");

11
src/tye/Program.GenerateCommand.cs

@ -5,7 +5,6 @@ using System.CommandLine.Invocation;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Opulence;
using Tye.ConfigModel;
namespace Tye
@ -42,7 +41,7 @@ namespace Tye
private static async Task ExecuteGenerateAsync(OutputContext output, ConfigApplication application, string environment, bool interactive)
{
var opulenceApplication = await CreateOpulenceApplicationAsync(output, application, interactive);
var temporaryApplication = await CreateApplicationAdapterAsync(output, application, interactive);
var steps = new List<ServiceExecutor.Step>()
{
new CombineStep() { Environment = environment, },
@ -51,16 +50,16 @@ namespace Tye
steps.Add(new GenerateKubernetesManifestStep() { Environment = environment, });
var executor = new ServiceExecutor(output, opulenceApplication, steps);
foreach (var service in opulenceApplication.Services)
var executor = new ServiceExecutor(output, temporaryApplication, steps);
foreach (var service in temporaryApplication.Services)
{
await executor.ExecuteAsync(service);
}
await GenerateApplicationManifestAsync(output, opulenceApplication, application.Source.Directory.Name, environment);
await GenerateApplicationManifestAsync(output, temporaryApplication, application.Source.Directory.Name, environment);
}
private static async Task GenerateApplicationManifestAsync(OutputContext output, Opulence.Application application, string applicationName, string environment)
private static async Task GenerateApplicationManifestAsync(OutputContext output, Tye.Application application, string applicationName, string environment)
{
using var step = output.BeginStep("Generating Application Manifests...");

1
src/tye/Program.InitCommand.cs

@ -3,7 +3,6 @@ using System.CommandLine;
using System.CommandLine.Invocation;
using System.CommandLine.IO;
using System.IO;
using Opulence;
using Tye.ConfigModel;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

2
src/tye/tye.csproj

@ -11,7 +11,7 @@
<ItemGroup>
<ProjectReference Include="..\micronetes\Micronetes.Hosting\Micronetes.Hosting.csproj" />
<ProjectReference Include="..\opulence\dotnet-opulence\dotnet-opulence.csproj" />
<ProjectReference Include="..\Tye.Core\Tye.Core.csproj" />
</ItemGroup>
<ItemGroup>

48
tye.sln

@ -11,12 +11,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F19B02EB-A
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "E2ETest", "test\E2ETest\E2ETest.csproj", "{D15E5FF6-C1E7-4110-A2BE-06ADA7ACA82B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opulence", "opulence", "{E8219571-549D-4EFE-8E62-54082D707B9A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Opulence", "src\opulence\Opulence\Opulence.csproj", "{0A8A0C69-49CB-462E-A7D4-605F78786EEF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-opulence", "src\opulence\dotnet-opulence\dotnet-opulence.csproj", "{BA03A616-4649-414D-A116-727D72F4BF50}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "micronetes", "micronetes", "{B2C364E4-969E-4770-BF5F-BE65D292F70A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Micronetes.Hosting", "src\micronetes\Micronetes.Hosting\Micronetes.Hosting.csproj", "{0F4F5A86-DD27-4AF9-BF97-221EAD5040E7}"
@ -25,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Micronetes.Hosting.Diagnost
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Micronetes.Hosting.Runtime", "src\micronetes\Micronetes.Hosting.Runtime\Micronetes.Hosting.Runtime.csproj", "{34719884-1338-4965-BA2A-F98DB03733C2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tye.Core", "src\Tye.Core\Tye.Core.csproj", "{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -62,30 +58,6 @@ Global
{D15E5FF6-C1E7-4110-A2BE-06ADA7ACA82B}.Release|x64.Build.0 = Release|Any CPU
{D15E5FF6-C1E7-4110-A2BE-06ADA7ACA82B}.Release|x86.ActiveCfg = Release|Any CPU
{D15E5FF6-C1E7-4110-A2BE-06ADA7ACA82B}.Release|x86.Build.0 = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|x64.ActiveCfg = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|x64.Build.0 = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|x86.ActiveCfg = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Debug|x86.Build.0 = Debug|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|Any CPU.Build.0 = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|x64.ActiveCfg = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|x64.Build.0 = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|x86.ActiveCfg = Release|Any CPU
{0A8A0C69-49CB-462E-A7D4-605F78786EEF}.Release|x86.Build.0 = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|x64.ActiveCfg = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|x64.Build.0 = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|x86.ActiveCfg = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Debug|x86.Build.0 = Debug|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|Any CPU.Build.0 = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|x64.ActiveCfg = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|x64.Build.0 = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|x86.ActiveCfg = Release|Any CPU
{BA03A616-4649-414D-A116-727D72F4BF50}.Release|x86.Build.0 = Release|Any CPU
{0F4F5A86-DD27-4AF9-BF97-221EAD5040E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0F4F5A86-DD27-4AF9-BF97-221EAD5040E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0F4F5A86-DD27-4AF9-BF97-221EAD5040E7}.Debug|x64.ActiveCfg = Debug|Any CPU
@ -122,16 +94,26 @@ Global
{34719884-1338-4965-BA2A-F98DB03733C2}.Release|x64.Build.0 = Release|Any CPU
{34719884-1338-4965-BA2A-F98DB03733C2}.Release|x86.ActiveCfg = Release|Any CPU
{34719884-1338-4965-BA2A-F98DB03733C2}.Release|x86.Build.0 = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|x64.ActiveCfg = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|x64.Build.0 = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|x86.ActiveCfg = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Debug|x86.Build.0 = Debug|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|Any CPU.Build.0 = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|x64.ActiveCfg = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|x64.Build.0 = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|x86.ActiveCfg = Release|Any CPU
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9BFE4070-D6D8-41F8-B92E-F85C3DCD7AB8} = {8C662D59-A3CB-466F-8E85-A8E6BA5E7601}
{D15E5FF6-C1E7-4110-A2BE-06ADA7ACA82B} = {F19B02EB-A372-417A-B2C2-EA0D5A3C76D5}
{E8219571-549D-4EFE-8E62-54082D707B9A} = {8C662D59-A3CB-466F-8E85-A8E6BA5E7601}
{0A8A0C69-49CB-462E-A7D4-605F78786EEF} = {E8219571-549D-4EFE-8E62-54082D707B9A}
{BA03A616-4649-414D-A116-727D72F4BF50} = {E8219571-549D-4EFE-8E62-54082D707B9A}
{B2C364E4-969E-4770-BF5F-BE65D292F70A} = {8C662D59-A3CB-466F-8E85-A8E6BA5E7601}
{0F4F5A86-DD27-4AF9-BF97-221EAD5040E7} = {B2C364E4-969E-4770-BF5F-BE65D292F70A}
{CEBFC149-8162-4A0A-9AD4-40498B9172CD} = {B2C364E4-969E-4770-BF5F-BE65D292F70A}
{34719884-1338-4965-BA2A-F98DB03733C2} = {B2C364E4-969E-4770-BF5F-BE65D292F70A}
{D0359C69-6EA9-4B03-9455-90E8E04F1CB0} = {8C662D59-A3CB-466F-8E85-A8E6BA5E7601}
EndGlobalSection
EndGlobal

Loading…
Cancel
Save