Browse Source

Refactor of step/service processing

Preparation for adding steps for application and for ingress.
pull/412/head
Ryan Nowak 6 years ago
parent
commit
7a8dfeddd5
  1. 46
      src/Microsoft.Tye.Core/ApplicationExecutor.cs
  2. 2
      src/Microsoft.Tye.Core/BuildDockerImageStep.cs
  3. 2
      src/Microsoft.Tye.Core/CombineStep.cs
  4. 2
      src/Microsoft.Tye.Core/DeployServiceYamlStep.cs
  5. 2
      src/Microsoft.Tye.Core/GenerateDockerfileStep.cs
  6. 2
      src/Microsoft.Tye.Core/GenerateHelmChartStep.cs
  7. 2
      src/Microsoft.Tye.Core/GenerateKubernetesManifestStep.cs
  8. 2
      src/Microsoft.Tye.Core/GenerateOamComponentStep.cs
  9. 2
      src/Microsoft.Tye.Core/PublishProjectStep.cs
  10. 2
      src/Microsoft.Tye.Core/PushDockerImageStep.cs
  11. 2
      src/Microsoft.Tye.Core/ValidateSecretStep.cs
  12. 2
      src/Microsoft.Tye.Core/WriteServiceYamlStep.cs
  13. 21
      src/tye/BuildHost.cs
  14. 26
      src/tye/GenerateHost.cs
  15. 30
      src/tye/Program.DeployCommand.cs
  16. 25
      src/tye/Program.PushCommand.cs

46
src/Microsoft.Tye.Core/ServiceExecutor.cs → 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<Step> 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<ServiceStep> ServiceSteps { get; } = new List<ServiceStep>();
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; }

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

2
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...";

21
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<ServiceExecutor.Step>()
{
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);
}
}
}

26
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<ServiceExecutor.Step>()
{
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);
}

30
src/tye/Program.DeployCommand.cs

@ -70,26 +70,22 @@ namespace Microsoft.Tye
}
await application.ProcessExtensionsAsync(output, ExtensionContext.OperationKind.Deploy);
var steps = new List<ServiceExecutor.Step>()
{
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);
}

25
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<ServiceExecutor.Step>()
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);
}
}
}

Loading…
Cancel
Save