Skip to content

Commit

Permalink
#54 Allow skipping of final manifest generation (#55)
Browse files Browse the repository at this point in the history
  • Loading branch information
prom3theu5 authored Nov 27, 2023
1 parent d76b671 commit 0cfd66a
Show file tree
Hide file tree
Showing 31 changed files with 130 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ namespace Aspirate.Cli.Actions.Configuration;
public class InitializeConfigurationAction(
IFileSystem fileSystem,
IAspirateConfigurationService configurationService,
IServiceProvider serviceProvider) : BaseActionWithNonInteractiveSupport(serviceProvider)
IServiceProvider serviceProvider) : BaseActionWithNonInteractiveValidation(serviceProvider)
{
public const string ActionKey = "InitializeConfigurationAction";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Aspirate.Cli.Processors.Project;

namespace Aspirate.Cli.Actions.Containers;

public sealed class BuildAndPushContainersAction(
IServiceProvider serviceProvider) : BaseActionWithNonInteractiveSupport(serviceProvider)
IServiceProvider serviceProvider) : BaseAction(serviceProvider)
{
public const string ActionKey = "BuildAndPushContainersAction";

Expand Down Expand Up @@ -42,8 +44,4 @@ private bool NoSelectedProjectComponents()
Logger.MarkupLine("\r\n[bold]No project components selected. Skipping build and publish action.[/]");
return true;
}

public override void ValidateNonInteractiveState()
{
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Aspirate.Cli.Processors.Project;

namespace Aspirate.Cli.Actions.Containers;

public sealed class PopulateContainerDetailsAction(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Aspirate.Cli.Actions.Manifests;

public sealed class ApplyManifestsToClusterAction(IKubeCtlService kubeCtlService, IServiceProvider serviceProvider) : BaseActionWithNonInteractiveSupport(serviceProvider)
public sealed class ApplyManifestsToClusterAction(IKubeCtlService kubeCtlService, IServiceProvider serviceProvider) : BaseActionWithNonInteractiveValidation(serviceProvider)
{
public const string ActionKey = "ApplyManifestsToClusterAction";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
namespace Aspirate.Cli.Actions.Manifests;

public sealed class GenerateFinalKustomizeManifestAction(
IAspireManifestCompositionService manifestCompositionService,
IServiceProvider serviceProvider) : BaseAction(serviceProvider)
{
public const string ActionKey = "GenerateFinalKustomizeManifestAction";

public override Task<bool> ExecuteAsync()
{
if (CurrentState.SkipFinalKustomizeGeneration)
{
return Task.FromResult(true);
}

if (NoSupportedComponentsExitAction())
{
return Task.FromResult(true);
}

if (!CurrentState.NonInteractive)
{
Logger.WriteLine();
var shouldGenerateFinalKustomizeManifest = Logger.Confirm(
"[bold]Would you like to generate the top level kustomize manifest to run against your kubernetes cluster?[/]");

if (!shouldGenerateFinalKustomizeManifest)
{
Logger.MarkupLine("[yellow](!)[/] Skipping final manifest");
return Task.FromResult(true);
}
}

var finalHandler = Services.GetRequiredKeyedService<IProcessor>(AspireLiterals.Final) as FinalProcessor;
finalHandler.CreateFinalManifest(CurrentState.FinalResources, CurrentState.OutputPath, CurrentState.TemplatePath);

return Task.FromResult(true);
}

private bool NoSupportedComponentsExitAction()
{
if (CurrentState.HasSelectedSupportedComponents)
{
return false;
}

Logger.MarkupLine("\r\n[bold]No supported components selected. Final manifest does not need to be generated as it would be empty.[/]");
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
namespace Aspirate.Cli.Actions.Manifests;

public sealed class GenerateKustomizeManifestAction(
public sealed class GenerateKustomizeManifestsAction(
IAspireManifestCompositionService manifestCompositionService,
IServiceProvider serviceProvider) : BaseAction(serviceProvider)
{
public const string ActionKey = "GenerateKustomizeManifestAction";

private static bool IsDatabase(Resource resource) =>
resource is PostgresDatabase;
public const string ActionKey = "GenerateKustomizeManifestsAction";

public override async Task<bool> ExecuteAsync()
{
Expand All @@ -23,22 +20,18 @@ public override async Task<bool> ExecuteAsync()
await ProcessIndividualResourceManifests(resource);
}

var finalHandler = Services.GetRequiredKeyedService<IProcessor>(AspireLiterals.Final) as FinalProcessor;
finalHandler.CreateFinalManifest(CurrentState.FinalResources, CurrentState.OutputPath, CurrentState.TemplatePath);

return true;
}

private bool NoSupportedComponentsExitAction()
{
if (CurrentState.AllSelectedSupportedComponents.Count != 0)
if (CurrentState.HasSelectedSupportedComponents)
{
return false;
}

Logger.MarkupLine("\r\n[bold]No supported components selected. Skipping generation of kustomize manifests.[/]");
return true;

}

private async Task ProcessIndividualResourceManifests(KeyValuePair<string, Resource> resource)
Expand All @@ -59,7 +52,7 @@ private async Task ProcessIndividualResourceManifests(KeyValuePair<string, Resou

var success = await handler.CreateManifests(resource, CurrentState.OutputPath, CurrentState.TemplatePath);

if (success && !IsDatabase(resource.Value))
if (success && !CurrentState.IsDatabase(resource.Value))
{
CurrentState.AppendToFinalResources(resource.Key, resource.Value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Aspirate.Cli.Actions.Manifests;

public class LoadAspireManifestAction(
IManifestFileParserService manifestFileParserService,
IServiceProvider serviceProvider) : BaseActionWithNonInteractiveSupport(serviceProvider)
IServiceProvider serviceProvider) : BaseActionWithNonInteractiveValidation(serviceProvider)
{
public const string ActionKey = "LoadAspireManifestAction";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace Aspirate.Cli.Actions.Manifests;

public sealed class RemoveManifestsFromClusterAction(IKubeCtlService kubeCtlService, IServiceProvider serviceProvider) :
BaseActionWithNonInteractiveSupport(serviceProvider)
BaseActionWithNonInteractiveValidation(serviceProvider)
{
public const string ActionKey = "RemoveManifestsFromClusterAction";

Expand Down
1 change: 1 addition & 0 deletions src/Aspirate.Cli/Commands/Generate/GenerateCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ public GenerateCommand() : base("generate", "Builds, pushes containers, generate
AddOption(SharedOptions.OutputPath);
AddOption(SharedOptions.NonInteractive);
AddOption(SharedOptions.SkipBuild);
AddOption(SharedOptions.SkipFinalKustomizeGeneration);
}
}
3 changes: 2 additions & 1 deletion src/Aspirate.Cli/Commands/Generate/GenerateCommandHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public override Task<int> HandleAsync(GenerateOptions options) =>
.QueueAction(LoadAspireManifestAction.ActionKey)
.QueueAction(PopulateContainerDetailsAction.ActionKey)
.QueueAction(BuildAndPushContainersAction.ActionKey)
.QueueAction(GenerateKustomizeManifestAction.ActionKey)
.QueueAction(GenerateKustomizeManifestsAction.ActionKey)
.QueueAction(GenerateFinalKustomizeManifestAction.ActionKey)
.ExecuteCommandsAsync();
}
1 change: 1 addition & 0 deletions src/Aspirate.Cli/Commands/Generate/GenerateOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ public sealed class GenerateOptions : ICommandOptions

public bool SkipBuild { get; set; } = false;
public bool NonInteractive { get; set; } = false;
public bool SkipFinalKustomizeGeneration { get; set; } = false;
}
25 changes: 3 additions & 22 deletions src/Aspirate.Cli/Commands/Init/InitCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,9 @@ public sealed class InitCommand : BaseCommand<InitOptions, InitCommandHandler>
public InitCommand() : base("init", "Initializes aspirate settings within your AppHost directory.")
{
AddOption(SharedOptions.AspireProjectPath);

AddOption(new Option<string>(new[] {"-cr", "--container-registry" })
{
Description = "The Container Registry to use as the fall-back value for all containers.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
});

AddOption(new Option<string>(new[] {"-ct", "--container-image-tag" })
{
Description = "The Container Image Tag to use as the fall-back value for all containers.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
});

AddOption(new Option<string>(new[] {"-tp", "--template-path" })
{
Description = "The Custom Template path to use.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
});

AddOption(SharedOptions.ContainerRegistry);
AddOption(SharedOptions.ContainerImageTag);
AddOption(SharedOptions.TemplatePath);
AddOption(SharedOptions.NonInteractive);
}
}
29 changes: 29 additions & 0 deletions src/Aspirate.Cli/Commands/SharedOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,28 @@ public static class SharedOptions
IsRequired = false,
};


public static Option<string> TemplatePath => new(new[] {"-tp", "--template-path" })
{
Description = "The Custom Template path to use.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
};

public static Option<string> ContainerRegistry => new(new[] {"-cr", "--container-registry" })
{
Description = "The Container Registry to use as the fall-back value for all containers.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
};

public static Option<string> ContainerImageTag => new(new[] {"-ct", "--container-image-tag" })
{
Description = "The Container Image Tag to use as the fall-back value for all containers.",
Arity = ArgumentArity.ExactlyOne,
IsRequired = false,
};

public static Option<string> KubernetesContext => new(new[] { "-k", "--kube-context" })
{
Description = "The name of the kubernetes context to use",
Expand All @@ -44,6 +66,13 @@ public static class SharedOptions
IsRequired = false,
};

public static Option<bool> SkipFinalKustomizeGeneration => new(new[] { "-sf", "--skip-final", "--skip-final-kustomize-generation" })
{
Description = "Skips The final generation of the kustomize manifest, which is the parent top level file",
Arity = ArgumentArity.ZeroOrOne,
IsRequired = false,
};

public static Option<bool> NonInteractive => new(new[] { "--non-interactive" })
{
Description = "Disables interactive mode for the command",
Expand Down
8 changes: 7 additions & 1 deletion src/Aspirate.Cli/Extensions/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
using Aspirate.Cli.Processors.Postgresql;
using Aspirate.Cli.Processors.Project;
using Aspirate.Cli.Processors.RabbitMQ;
using Aspirate.Cli.Processors.Redis;

namespace Aspirate.Cli.Extensions;

internal static class ServiceCollectionExtensions
Expand Down Expand Up @@ -46,7 +51,8 @@ private static IServiceCollection AddActions(this IServiceCollection services) =
.AddKeyedSingleton<IAction, BuildAndPushContainersAction>(BuildAndPushContainersAction.ActionKey)
.AddKeyedSingleton<IAction, PopulateContainerDetailsAction>(PopulateContainerDetailsAction.ActionKey)
.AddKeyedSingleton<IAction, GenerateAspireManifestAction>(GenerateAspireManifestAction.ActionKey)
.AddKeyedSingleton<IAction, GenerateKustomizeManifestAction>(GenerateKustomizeManifestAction.ActionKey)
.AddKeyedSingleton<IAction, GenerateKustomizeManifestsAction>(GenerateKustomizeManifestsAction.ActionKey)
.AddKeyedSingleton<IAction, GenerateFinalKustomizeManifestAction>(GenerateFinalKustomizeManifestAction.ActionKey)
.AddKeyedSingleton<IAction, LoadAspireManifestAction>(LoadAspireManifestAction.ActionKey)
.AddKeyedSingleton<IAction, ApplyManifestsToClusterAction>(ApplyManifestsToClusterAction.ActionKey)
.AddKeyedSingleton<IAction, RemoveManifestsFromClusterAction>(RemoveManifestsFromClusterAction.ActionKey);
Expand Down
6 changes: 1 addition & 5 deletions src/Aspirate.Cli/GlobalUsings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,7 @@
global using Aspirate.Cli.Commands.Init;
global using Aspirate.Cli.Extensions;
global using Aspirate.Cli.Middleware;
global using Aspirate.Cli.Processors.Components.Final;
global using Aspirate.Cli.Processors.Components.Postgresql;
global using Aspirate.Cli.Processors.Components.Project;
global using Aspirate.Cli.Processors.Components.RabbitMQ;
global using Aspirate.Cli.Processors.Components.Redis;
global using Aspirate.Cli.Processors.Final;
global using Aspirate.Cli.Services;
global using Aspirate.Shared.Actions;
global using Aspirate.Shared.Commands;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Final;
namespace Aspirate.Cli.Processors.Final;

/// <summary>
/// A project component for version 0 of Aspire.
Expand All @@ -20,5 +20,7 @@ public void CreateFinalManifest(Dictionary<string, Resource> resources, string o
var templateData = new FinalTemplateData(manifests);

CreateComponentKustomizeManifest(outputPath, templateData, templatePath);

_console.MarkupLine($"\r\n\t[green]({EmojiLiterals.CheckMark}) Done: [/] Generating [blue]{outputPath}/kustomization.yml[/]");
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
namespace Aspirate.Cli.Processors.Components.Final;
namespace Aspirate.Cli.Processors.Final;

public class FinalTemplateData(IReadOnlyCollection<string> manifests) : BaseTemplateData(null, null, manifests, false);
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Postgresql;
namespace Aspirate.Cli.Processors.Postgresql;

/// <summary>
/// Handles producing the Postgres component as Kustomize manifest.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Postgresql;
namespace Aspirate.Cli.Processors.Postgresql;

public sealed class PostgresDatabaseTemplateData(
string name,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Postgresql;
namespace Aspirate.Cli.Processors.Postgresql;

/// <summary>
/// Handles producing the Postgres component as Kustomize manifest.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Postgresql;
namespace Aspirate.Cli.Processors.Postgresql;

public sealed class PostgresServerTemplateData(IReadOnlyCollection<string> manifests)
: BaseTemplateData(null, null, manifests, false);
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using AspireProject = Aspirate.Shared.Models.AspireManifests.Components.V0.Project;

namespace Aspirate.Cli.Processors.Components.Project;
namespace Aspirate.Cli.Processors.Project;

/// <summary>
/// A project component for version 0 of Aspire.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Project;
namespace Aspirate.Cli.Processors.Project;

public class ProjectTemplateData(
string name,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using AspireRabbit = Aspirate.Shared.Models.AspireManifests.Components.V0.RabbitMq;

namespace Aspirate.Cli.Processors.Components.RabbitMQ;
namespace Aspirate.Cli.Processors.RabbitMQ;

/// <summary>
/// Handles producing the RabbitMq component as Kustomize manifest.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.RabbitMQ;
namespace Aspirate.Cli.Processors.RabbitMQ;

public sealed class RabbitMqTemplateData(IReadOnlyCollection<string> manifests)
: BaseTemplateData(null, null, manifests, false);
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using AspireRedis = Aspirate.Shared.Models.AspireManifests.Components.V0.Redis;

namespace Aspirate.Cli.Processors.Components.Redis;
namespace Aspirate.Cli.Processors.Redis;

/// <summary>
/// Handles producing the Redis component as Kustomize manifest.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Aspirate.Cli.Processors.Components.Redis;
namespace Aspirate.Cli.Processors.Redis;

public sealed class RedisTemplateData(IReadOnlyCollection<string> manifests)
: BaseTemplateData(null, null, manifests, false);
2 changes: 1 addition & 1 deletion src/Aspirate.Shared/Actions/ActionExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public async Task<int> ExecuteCommandsAsync()

try
{
if (state.NonInteractive && action is BaseActionWithNonInteractiveSupport nonInteractiveAction)
if (state.NonInteractive && action is BaseActionWithNonInteractiveValidation nonInteractiveAction)
{
nonInteractiveAction.ValidateNonInteractiveState();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Aspirate.Shared.Actions;

public abstract class BaseActionWithNonInteractiveSupport(IServiceProvider serviceProvider) : BaseAction(serviceProvider)
public abstract class BaseActionWithNonInteractiveValidation(IServiceProvider serviceProvider) : BaseAction(serviceProvider)
{
public abstract void ValidateNonInteractiveState();

Expand Down
Loading

0 comments on commit 0cfd66a

Please sign in to comment.