From 7a8dfeddd5ae44ccaa1d4936bf1736b45328924c Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Sat, 25 Apr 2020 11:52:00 -0700 Subject: [PATCH] Refactor of step/service processing Preparation for adding steps for application and for ingress. --- ...viceExecutor.cs => ApplicationExecutor.cs} | 46 ++++++------------- .../BuildDockerImageStep.cs | 2 +- src/Microsoft.Tye.Core/CombineStep.cs | 2 +- .../DeployServiceYamlStep.cs | 2 +- .../GenerateDockerfileStep.cs | 2 +- .../GenerateHelmChartStep.cs | 2 +- .../GenerateKubernetesManifestStep.cs | 2 +- .../GenerateOamComponentStep.cs | 2 +- src/Microsoft.Tye.Core/PublishProjectStep.cs | 2 +- src/Microsoft.Tye.Core/PushDockerImageStep.cs | 2 +- src/Microsoft.Tye.Core/ValidateSecretStep.cs | 2 +- .../WriteServiceYamlStep.cs | 2 +- src/tye/BuildHost.cs | 21 ++++----- src/tye/GenerateHost.cs | 26 +++++------ src/tye/Program.DeployCommand.cs | 30 ++++++------ src/tye/Program.PushCommand.cs | 25 ++++------ 16 files changed, 69 insertions(+), 101 deletions(-) rename src/Microsoft.Tye.Core/{ServiceExecutor.cs => ApplicationExecutor.cs} (71%) diff --git a/src/Microsoft.Tye.Core/ServiceExecutor.cs b/src/Microsoft.Tye.Core/ApplicationExecutor.cs similarity index 71% rename from src/Microsoft.Tye.Core/ServiceExecutor.cs rename to src/Microsoft.Tye.Core/ApplicationExecutor.cs index 0d3f4159..71380338 100644 --- a/src/Microsoft.Tye.Core/ServiceExecutor.cs +++ b/src/Microsoft.Tye.Core/ApplicationExecutor.cs @@ -10,49 +10,33 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - public sealed class ServiceExecutor + public sealed class ApplicationExecutor { private readonly OutputContext output; - private readonly ApplicationBuilder application; - private readonly Step[] steps; - public ServiceExecutor(OutputContext output, ApplicationBuilder application, IEnumerable steps) + public ApplicationExecutor(OutputContext output) { - if (output is null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (application is null) - { - throw new ArgumentNullException(nameof(application)); - } - - if (steps is null) - { - throw new ArgumentNullException(nameof(steps)); - } - this.output = output; - this.application = application; - this.steps = steps.ToArray(); } - public async Task ExecuteAsync(ServiceBuilder service) + public List ServiceSteps { get; } = new List(); + + public async Task ExecuteAsync(ApplicationBuilder application) { - using var tracker = output.BeginStep($"Processing Service '{service.Name}'..."); - for (var i = 0; i < steps.Length; i++) + foreach (var service in application.Services) { - var step = steps[i]; - - using var stepTracker = output.BeginStep(step.DisplayText); - await step.ExecuteAsync(output, application, service); - stepTracker.MarkComplete(); + using var tracker = output.BeginStep($"Processing Service '{service.Name}'..."); + foreach (var step in ServiceSteps) + { + using var stepTracker = output.BeginStep(step.DisplayText); + await step.ExecuteAsync(output, application, service); + stepTracker.MarkComplete(); + } + tracker.MarkComplete(); } - tracker.MarkComplete(); } - public abstract class Step + public abstract class ServiceStep { public abstract string DisplayText { get; } diff --git a/src/Microsoft.Tye.Core/BuildDockerImageStep.cs b/src/Microsoft.Tye.Core/BuildDockerImageStep.cs index de208a99..f94b9e82 100644 --- a/src/Microsoft.Tye.Core/BuildDockerImageStep.cs +++ b/src/Microsoft.Tye.Core/BuildDockerImageStep.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - public sealed class BuildDockerImageStep : ServiceExecutor.Step + public sealed class BuildDockerImageStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Building Docker Image..."; diff --git a/src/Microsoft.Tye.Core/CombineStep.cs b/src/Microsoft.Tye.Core/CombineStep.cs index 2f45863a..479f517d 100644 --- a/src/Microsoft.Tye.Core/CombineStep.cs +++ b/src/Microsoft.Tye.Core/CombineStep.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - public sealed class CombineStep : ServiceExecutor.Step + public sealed class CombineStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Compiling Services..."; diff --git a/src/Microsoft.Tye.Core/DeployServiceYamlStep.cs b/src/Microsoft.Tye.Core/DeployServiceYamlStep.cs index 38d23917..60fbaf95 100644 --- a/src/Microsoft.Tye.Core/DeployServiceYamlStep.cs +++ b/src/Microsoft.Tye.Core/DeployServiceYamlStep.cs @@ -11,7 +11,7 @@ using YamlDotNet.RepresentationModel; namespace Microsoft.Tye { - public sealed class DeployServiceYamlStep : ServiceExecutor.Step + public sealed class DeployServiceYamlStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Deploying Manifests..."; diff --git a/src/Microsoft.Tye.Core/GenerateDockerfileStep.cs b/src/Microsoft.Tye.Core/GenerateDockerfileStep.cs index f871820a..bbb307b6 100644 --- a/src/Microsoft.Tye.Core/GenerateDockerfileStep.cs +++ b/src/Microsoft.Tye.Core/GenerateDockerfileStep.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - internal sealed class GenerateDockerfileStep : ServiceExecutor.Step + internal sealed class GenerateDockerfileStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Generating Dockerfile..."; diff --git a/src/Microsoft.Tye.Core/GenerateHelmChartStep.cs b/src/Microsoft.Tye.Core/GenerateHelmChartStep.cs index f7d1a35d..f2236c26 100644 --- a/src/Microsoft.Tye.Core/GenerateHelmChartStep.cs +++ b/src/Microsoft.Tye.Core/GenerateHelmChartStep.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - internal sealed class GenerateHelmChartStep : ServiceExecutor.Step + internal sealed class GenerateHelmChartStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Generating Helm Chart..."; diff --git a/src/Microsoft.Tye.Core/GenerateKubernetesManifestStep.cs b/src/Microsoft.Tye.Core/GenerateKubernetesManifestStep.cs index 36a39811..b49c307d 100644 --- a/src/Microsoft.Tye.Core/GenerateKubernetesManifestStep.cs +++ b/src/Microsoft.Tye.Core/GenerateKubernetesManifestStep.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - public sealed class GenerateKubernetesManifestStep : ServiceExecutor.Step + public sealed class GenerateKubernetesManifestStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Generating Manifests..."; diff --git a/src/Microsoft.Tye.Core/GenerateOamComponentStep.cs b/src/Microsoft.Tye.Core/GenerateOamComponentStep.cs index 4bed6499..e5bb0bed 100644 --- a/src/Microsoft.Tye.Core/GenerateOamComponentStep.cs +++ b/src/Microsoft.Tye.Core/GenerateOamComponentStep.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - internal sealed class GenerateOamComponentStep : ServiceExecutor.Step + internal sealed class GenerateOamComponentStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Generating Manifests..."; diff --git a/src/Microsoft.Tye.Core/PublishProjectStep.cs b/src/Microsoft.Tye.Core/PublishProjectStep.cs index 6aed7e4e..9c4aee92 100644 --- a/src/Microsoft.Tye.Core/PublishProjectStep.cs +++ b/src/Microsoft.Tye.Core/PublishProjectStep.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { // Used to publish a project when using a single-phase Dockerfile - public class PublishProjectStep : ServiceExecutor.Step + public class PublishProjectStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Publishing Project..."; diff --git a/src/Microsoft.Tye.Core/PushDockerImageStep.cs b/src/Microsoft.Tye.Core/PushDockerImageStep.cs index 300f6187..a093a9fd 100644 --- a/src/Microsoft.Tye.Core/PushDockerImageStep.cs +++ b/src/Microsoft.Tye.Core/PushDockerImageStep.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Microsoft.Tye { - public sealed class PushDockerImageStep : ServiceExecutor.Step + public sealed class PushDockerImageStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Pushing Docker Image..."; diff --git a/src/Microsoft.Tye.Core/ValidateSecretStep.cs b/src/Microsoft.Tye.Core/ValidateSecretStep.cs index c16c162e..db6d1fcc 100644 --- a/src/Microsoft.Tye.Core/ValidateSecretStep.cs +++ b/src/Microsoft.Tye.Core/ValidateSecretStep.cs @@ -18,7 +18,7 @@ using YamlDotNet.RepresentationModel; namespace Microsoft.Tye { - public sealed class ValidateSecretStep : ServiceExecutor.Step + public sealed class ValidateSecretStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Validating Secrets..."; diff --git a/src/Microsoft.Tye.Core/WriteServiceYamlStep.cs b/src/Microsoft.Tye.Core/WriteServiceYamlStep.cs index c5b8d603..1cfef65e 100644 --- a/src/Microsoft.Tye.Core/WriteServiceYamlStep.cs +++ b/src/Microsoft.Tye.Core/WriteServiceYamlStep.cs @@ -10,7 +10,7 @@ using YamlDotNet.RepresentationModel; namespace Microsoft.Tye { - internal sealed class WriteServiceYamlStep : ServiceExecutor.Step + internal sealed class WriteServiceYamlStep : ApplicationExecutor.ServiceStep { public override string DisplayText => "Writing Manifests..."; diff --git a/src/tye/BuildHost.cs b/src/tye/BuildHost.cs index 03a81b01..33ab4679 100644 --- a/src/tye/BuildHost.cs +++ b/src/tye/BuildHost.cs @@ -26,21 +26,18 @@ namespace Microsoft.Tye public static async Task ExecuteBuildAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive) { await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); - - var steps = new List() - { - new CombineStep() { Environment = environment, }, - new PublishProjectStep(), - new BuildDockerImageStep() { Environment = environment, }, - }; - Program.ApplyRegistryAndDefaults(output, application, interactive, requireRegistry: false); - var executor = new ServiceExecutor(output, application, steps); - foreach (var service in application.Services) + var executor = new ApplicationExecutor(output) { - await executor.ExecuteAsync(service); - } + ServiceSteps = + { + new CombineStep() { Environment = environment, }, + new PublishProjectStep(), + new BuildDockerImageStep() { Environment = environment, }, + }, + }; + await executor.ExecuteAsync(application); } } } diff --git a/src/tye/GenerateHost.cs b/src/tye/GenerateHost.cs index 91a74a24..32726c62 100644 --- a/src/tye/GenerateHost.cs +++ b/src/tye/GenerateHost.cs @@ -33,24 +33,20 @@ namespace Microsoft.Tye public static async Task ExecuteGenerateAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive) { await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); - - var steps = new List() - { - new CombineStep() { Environment = environment, }, - new PublishProjectStep(), - new BuildDockerImageStep() { Environment = environment, }, // Make an image but don't push it - }; - - steps.Add(new GenerateKubernetesManifestStep() { Environment = environment, }); - Program.ApplyRegistryAndDefaults(output, application, interactive, requireRegistry: false); - var executor = new ServiceExecutor(output, application, steps); - foreach (var service in application.Services) + var executor = new ApplicationExecutor(output) { - await executor.ExecuteAsync(service); - } - + ServiceSteps = + { + new CombineStep() { Environment = environment, }, + new PublishProjectStep(), + new BuildDockerImageStep() { Environment = environment, }, // Make an image but don't push it + new GenerateKubernetesManifestStep() { Environment = environment, }, + }, + }; + await executor.ExecuteAsync(application); + await GenerateApplicationManifestAsync(output, application, environment); } diff --git a/src/tye/Program.DeployCommand.cs b/src/tye/Program.DeployCommand.cs index 4c914cda..c49f45ff 100644 --- a/src/tye/Program.DeployCommand.cs +++ b/src/tye/Program.DeployCommand.cs @@ -70,26 +70,22 @@ namespace Microsoft.Tye } await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); - - var steps = new List() - { - new CombineStep() { Environment = environment, }, - new PublishProjectStep(), - new BuildDockerImageStep() { Environment = environment, }, - new PushDockerImageStep() { Environment = environment, }, - new ValidateSecretStep() { Environment = environment, Interactive = interactive, Force = force, }, - }; - - steps.Add(new GenerateKubernetesManifestStep() { Environment = environment, Namespace = application.Namespace }); - steps.Add(new DeployServiceYamlStep() { Environment = environment, }); - ApplyRegistryAndDefaults(output, application, interactive, requireRegistry: true); - var executor = new ServiceExecutor(output, application, steps); - foreach (var service in application.Services) + var executor = new ApplicationExecutor(output) { - await executor.ExecuteAsync(service); - } + ServiceSteps = + { + new CombineStep() { Environment = environment, }, + new PublishProjectStep(), + new BuildDockerImageStep() { Environment = environment, }, + new PushDockerImageStep() { Environment = environment, }, + new ValidateSecretStep() { Environment = environment, Interactive = interactive, Force = force, }, + new GenerateKubernetesManifestStep() { Environment = environment, Namespace = application.Namespace }, + new DeployServiceYamlStep() { Environment = environment, }, + } + }; + await executor.ExecuteAsync(application); await DeployApplicationManifestAsync(output, application, application.Source.Directory.Name); } diff --git a/src/tye/Program.PushCommand.cs b/src/tye/Program.PushCommand.cs index 91e34848..d296d7f0 100644 --- a/src/tye/Program.PushCommand.cs +++ b/src/tye/Program.PushCommand.cs @@ -2,13 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.CommandLine; using System.CommandLine.Invocation; using System.IO; -using System.Text; using System.Threading.Tasks; -using Microsoft.Tye.ConfigModel; namespace Microsoft.Tye { @@ -55,22 +52,20 @@ namespace Microsoft.Tye private static async Task ExecutePushAsync(OutputContext output, ApplicationBuilder application, string environment, bool interactive, bool force) { await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy); + ApplyRegistryAndDefaults(output, application, interactive, requireRegistry: true); - var steps = new List() + var executor = new ApplicationExecutor(output) { - new CombineStep() { Environment = environment, }, - new PublishProjectStep(), - new BuildDockerImageStep() { Environment = environment, }, - new PushDockerImageStep() { Environment = environment, }, + ServiceSteps = + { + new CombineStep() { Environment = environment, }, + new PublishProjectStep(), + new BuildDockerImageStep() { Environment = environment, }, + new PushDockerImageStep() { Environment = environment, }, + }, }; - ApplyRegistryAndDefaults(output, application, interactive, requireRegistry: true); - - var executor = new ServiceExecutor(output, application, steps); - foreach (var service in application.Services) - { - await executor.ExecuteAsync(service); - } + await executor.ExecuteAsync(application); } } }