Skip to content

Commit

Permalink
Merge 811249a into 78db754
Browse files Browse the repository at this point in the history
  • Loading branch information
RickRen7575 committed Sep 23, 2019
2 parents 78db754 + 811249a commit 8aeceeb
Show file tree
Hide file tree
Showing 22 changed files with 282 additions and 90 deletions.
15 changes: 13 additions & 2 deletions src/OctoConfig.Core/Arguments/ArgsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,18 @@ public class ProjectArgsBase : ArgsBase, IProjectArgsBase
public string ProjectName { get; set; }
}

public class FileArgsBase : ArgsBase
public interface IVaultArgs
{
string VaultUri { get; set; }

string VaultRoleId { get; set; }

string VaultSecretId { get; set; }

string MountPoint { get; set; }
}

public class FileArgsBase : ArgsBase, IVaultArgs
{
[Option('f', "file", Required = true, HelpText = "The json file to parse into variables")]
public string File { get; set; }
Expand All @@ -52,7 +63,7 @@ public class FileArgsBase : ArgsBase
[Option(longName: "variableType", HelpText = "The type of Octopus variables to convert the json file into", Required = true)]
public VariableType VariableType { get; set; }

[Option('p', "prefix", Required = false, HelpText = "A Prefix to prepend to variables", Default = "")]
[Option(longName: "prefix", Required = false, HelpText = "A Prefix to prepend to variables", Default = "")]
public string Prefix { get; set; }
}
}
1 change: 0 additions & 1 deletion src/OctoConfig.Core/Arguments/TenantTargetArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace OctoConfig.Core.Arguments
{
[Verb("upload-project", HelpText = "Convert json file to environment variables and upload them to Octopus")]
public class TenantTargetArgs : ProjectTargetArgs
{
[Option('t', "tenant", Required = true, HelpText = "The Octopus tenant to attach variables to")]
Expand Down
18 changes: 18 additions & 0 deletions src/OctoConfig.Core/Arguments/UploadArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using CommandLine;

namespace OctoConfig.Core.Arguments
{
[Verb("upload-project", HelpText = "Upload them to an Octopus project as templates")]
public sealed class UploadProjectArgs : ProjectTargetArgs
{
[Option('c', "clear", Required = false, Default = false, HelpText = "Clears any project variables in the project before uploading new template")]
public bool ClearProject { get; set; }
}

[Verb("upload-tenant", HelpText = "Convert json file to environment variables and upload them to Octopus tenant")]
public sealed class UploadTenantArgs : TenantTargetArgs
{
[Option(longName: "skip-upload-project", Required = false, Default = false, HelpText = "Does not update project template when uploading tenant variables")]
public bool SkipUploadProject { get; set; }
}
}
11 changes: 0 additions & 11 deletions src/OctoConfig.Core/Arguments/UploadProjectArgs.cs

This file was deleted.

2 changes: 1 addition & 1 deletion src/OctoConfig.Core/Cake/CakeAliases.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public static void UploadLibrarySet(this ICakeContext context, LibraryTargetArgs
}

[CakeMethodAlias]
public static void UploadTenant(this ICakeContext context, TenantTargetArgs args)
public static void UploadTenant(this ICakeContext context, UploadTenantArgs args)
{
DependencyConfig.Setup(args, context).GetAwaiter().GetResult();
var cmd = DependencyConfig.Container.GetService<UploadTenantCommand>();
Expand Down
10 changes: 6 additions & 4 deletions src/OctoConfig.Core/Commands/UploadLibraryCommand.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using System.Threading.Tasks;
using OctoConfig.Core.Arguments;
Expand All @@ -16,22 +17,23 @@ public class UploadLibraryCommand
private readonly ISecretsMananger _secretsMananger;
private readonly ILibraryManager _libraryManager;
private readonly VariableConverter _varConverter;
private readonly IFileSystem _fileSystem;
private readonly ILogger _logger;

public UploadLibraryCommand(LibraryTargetArgs args, ISecretsMananger secretsMananger, ILibraryManager libraryMananger, VariableConverter variableConverter, ILogger logger)
public UploadLibraryCommand(LibraryTargetArgs args, ISecretsMananger secretsMananger, ILibraryManager libraryMananger, VariableConverter variableConverter, ILogger logger, IFileSystem fileSystem)
{
_args = args ?? throw new ArgumentNullException(nameof(args));
_secretsMananger = secretsMananger ?? throw new ArgumentNullException(nameof(secretsMananger));
_libraryManager = libraryMananger ?? throw new ArgumentNullException(nameof(libraryMananger));
_varConverter = variableConverter ?? throw new ArgumentNullException(nameof(variableConverter));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
}

public async Task Execute()
{
var vars = _varConverter.Convert(File.ReadAllText(_args.File));

await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
var vars = _varConverter.Convert(_fileSystem.File.ReadAllText(_args.File));
await _secretsMananger.ReplaceSecrets(vars, _args).ConfigureAwait(false);
await _libraryManager.UpdateVars(vars, _args.Library, _args.Environments, _args.OctoRoles, apply: true).ConfigureAwait(false);

var secretCount = vars.Count(s => s.IsSecret);
Expand Down
2 changes: 1 addition & 1 deletion src/OctoConfig.Core/Commands/UploadProjectCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public async Task Execute()
{
await _projectClearer.ClearProjectVariables();
}
await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
await _secretsMananger.ReplaceSecrets(vars, _args).ConfigureAwait(false);
await _projectManager.CreateProjectVariables(vars, true);

var secretCount = vars.Count(s => s.IsSecret);
Expand Down
12 changes: 7 additions & 5 deletions src/OctoConfig.Core/Commands/UploadTenantCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ namespace OctoConfig.Core.Commands
{
public class UploadTenantCommand
{
private readonly TenantTargetArgs _args;
private readonly UploadTenantArgs _args;
private readonly ISecretsMananger _secretsMananger;
private readonly VariableConverter _varConverter;
private readonly IProjectManager _projectManager;
private readonly ITenantManager _tenantManager;
private readonly IFileSystem _fileSystem;
private readonly ILogger _logger;

public UploadTenantCommand(TenantTargetArgs args, ISecretsMananger secretsMananger, IProjectManager projectManager,
public UploadTenantCommand(UploadTenantArgs args, ISecretsMananger secretsMananger, IProjectManager projectManager,
ITenantManager tenantManager, VariableConverter variableConverter, IFileSystem fileSystem, ILogger logger)
{
_args = args ?? throw new ArgumentNullException(nameof(args));
Expand All @@ -35,9 +35,11 @@ public class UploadTenantCommand
public async Task Execute()
{
var vars = _varConverter.Convert(_fileSystem.File.ReadAllText(_args.File));

await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
await _projectManager.CreateProjectVariables(vars).ConfigureAwait(false);
await _secretsMananger.ReplaceSecrets(vars, _args).ConfigureAwait(false);
if (!_args.SkipUploadProject)
{
await _projectManager.CreateProjectVariables(vars).ConfigureAwait(false);
}
await _tenantManager.CreateTenantVariables(vars).ConfigureAwait(false);

var secretCount = vars.Count(s => s.IsSecret);
Expand Down
2 changes: 1 addition & 1 deletion src/OctoConfig.Core/Commands/ValidateLibraryCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public async Task Execute()
{
var vars = _jsonValidator.Convert(_fileSystem.File.ReadAllText(_args.File));

await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
await _secretsMananger.ReplaceSecrets(vars, _args).ConfigureAwait(false);
await _libraryManager.UpdateVars(vars, _args.Library, _args.Environments, _args.OctoRoles, apply: false).ConfigureAwait(false);

var secretCount = vars.Count(s => s.IsSecret);
Expand Down
2 changes: 1 addition & 1 deletion src/OctoConfig.Core/Commands/ValidateTenantCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public async Task Execute()
{
var vars = _jsonValidator.Convert(_fileSystem.File.ReadAllText(_args.File));

await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
await _secretsMananger.ReplaceSecrets(vars, _args).ConfigureAwait(false);
await _tenantManager.CreateTenantVariables(vars, apply: false).ConfigureAwait(false);

var secretCount = vars.Count(s => s.IsSecret);
Expand Down
9 changes: 6 additions & 3 deletions src/OctoConfig.Core/DependencySetup/DependencyConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ private static void addArgs(ArgsBase args, IServiceCollection coll)
{
coll.AddSingleton(pbArgs);
}
if (args is TenantTargetArgs tArgs)
{
coll.AddSingleton(tArgs);
}
switch (args)
{
case ClearVariableSetArgs cArgs:
Expand All @@ -120,13 +124,12 @@ private static void addArgs(ArgsBase args, IServiceCollection coll)
break;
case ValidateTenantArgs vtArgs:
coll.AddSingleton(vtArgs);
coll.AddSingleton<TenantTargetArgs>(vtArgs);
break;
case UploadProjectArgs upArgs:
coll.AddSingleton(upArgs);
break;
case TenantTargetArgs pAgs:
coll.AddSingleton(pAgs);
case UploadTenantArgs utArgs:
coll.AddSingleton(utArgs);
break;
default:
throw new ArgumentException($"Unknown argument type '{args.GetType()}'", nameof(args));
Expand Down
6 changes: 3 additions & 3 deletions src/OctoConfig.Core/Octopus/ProjectManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace OctoConfig.Core.Octopus
{
public interface IProjectManager
{
Task CreateProjectVariables(List<SecretVariable> vars, bool useValue = false);
Task CreateProjectVariables(IEnumerable<SecretVariable> vars, bool useVariableValueAsDefault = false);
}

public class ProjectManager : IProjectManager
Expand All @@ -27,7 +27,7 @@ public ProjectManager(IProjectArgsBase args, IOctopusAsyncRepository octopusRepo
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

public async Task CreateProjectVariables(List<SecretVariable> vars, bool useValue = false)
public async Task CreateProjectVariables(IEnumerable<SecretVariable> vars, bool useVariableValueAsDefault = false)
{
var project = await _octopusRepository.ValidateProject(_args.ProjectName).ConfigureAwait(false);
var before = project.Templates.Count;
Expand All @@ -40,7 +40,7 @@ public async Task CreateProjectVariables(List<SecretVariable> vars, bool useValu
}
else
{
var value = useValue ? variable.Value : _placeholder;
var value = useVariableValueAsDefault ? variable.Value : _placeholder;
project.AddOrUpdateSingleLineTextTemplate(variable.Name, variable.Name, value, variable.Name);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/OctoConfig.Core/Octopus/TenantManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace OctoConfig.Core.Octopus
{
public interface ITenantManager
{
Task CreateTenantVariables(List<SecretVariable> vars, bool apply = true);
Task CreateTenantVariables(IEnumerable<SecretVariable> vars, bool apply = true);
}

public class TenantManager : ITenantManager
Expand All @@ -27,7 +27,7 @@ public TenantManager(TenantTargetArgs args, IOctopusAsyncRepository octopusRepos
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

public async Task CreateTenantVariables(List<SecretVariable> vars, bool apply = true)
public async Task CreateTenantVariables(IEnumerable<SecretVariable> vars, bool apply = true)
{
var project = await _octopusRepository.ValidateProject(_args.ProjectName).ConfigureAwait(false);
var tenant = await _octopusRepository.ValidateTenant(_args.TenantName).ConfigureAwait(false);
Expand Down
33 changes: 21 additions & 12 deletions src/OctoConfig.Core/Secrets/SecretsManager.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using OctoConfig.Core.Arguments;

namespace OctoConfig.Core.Secrets
{
public interface ISecretsMananger
{
Task ReplaceSecrets(List<SecretVariable> vars);
Task ReplaceSecrets(List<SecretVariable> vars, IVaultArgs vaultArgs);
}

public class SecretsMananger : ISecretsMananger
Expand All @@ -22,24 +23,32 @@ public SecretsMananger(ISecretProviderFactory providerFact)
/// Updates each matching item to be marked as IsSecret
/// </summary>
/// <param name="vars">Variables to run the replacement on</param>
/// <param name="apply">Actually store the value of the variable in the list. Mark as 'false' to only do verification</param>
public async Task ReplaceSecrets(List<SecretVariable> vars)
/// <param name="vaultArgs">Vault parameters used to grab the secrets</param>
public async Task ReplaceSecrets(List<SecretVariable> vars, IVaultArgs vaultArgs)
{
foreach(var item in vars)
if (vaultIsConfigured(vaultArgs))
{
var evaluated = item.Value;
while (hasSecret(evaluated))
foreach (var item in vars)
{
item.IsSecret = true;
var justVariable = getNextSecret(evaluated);
(var prefix, var path) = splitSecretAndPrefix(justVariable);
var secret = await _providerFact.Create(prefix).GetSecret(path).ConfigureAwait(false);
evaluated = evaluated.Replace($"#{{{justVariable}}}", secret);
var evaluated = item.Value;
while (hasSecret(evaluated))
{
item.IsSecret = true;
var justVariable = getNextSecret(evaluated);
(var prefix, var path) = splitSecretAndPrefix(justVariable);
var secret = await _providerFact.Create(prefix).GetSecret(path).ConfigureAwait(false);
evaluated = evaluated.Replace($"#{{{justVariable}}}", secret);
}
item.Value = evaluated;
}
item.Value = evaluated;
}
}

private bool vaultIsConfigured(IVaultArgs vaultArgs)
{
return vaultArgs != null && vaultArgs.VaultRoleId != null && vaultArgs.VaultSecretId != null && vaultArgs.VaultUri != null;
}

private bool hasSecret(string variable)
{
var begin = variable.IndexOf("#{");
Expand Down
4 changes: 2 additions & 2 deletions src/OctoConfigTool/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ public static class Program
{
public static async Task<int> Main(string[] cmdArgs)
{
return await Parser.Default.ParseArguments<ValidateArgs, ClearVariableSetArgs, LibraryTargetArgs, ValidateTenantArgs, TenantTargetArgs, UploadProjectArgs, ClearProjectArgs, ClearTenantArgs>(cmdArgs)
.MapResult<ValidateArgs, ClearVariableSetArgs, LibraryTargetArgs, ValidateTenantArgs, TenantTargetArgs, UploadProjectArgs, ClearProjectArgs, ClearTenantArgs, Task<int>>(
return await Parser.Default.ParseArguments<ValidateArgs, ClearVariableSetArgs, LibraryTargetArgs, ValidateTenantArgs, UploadTenantArgs, UploadProjectArgs, ClearProjectArgs, ClearTenantArgs>(cmdArgs)
.MapResult<ValidateArgs, ClearVariableSetArgs, LibraryTargetArgs, ValidateTenantArgs, UploadTenantArgs, UploadProjectArgs, ClearProjectArgs, ClearTenantArgs, Task<int>>(
async validateArgs =>
{
await DependencyConfig.Setup(validateArgs).ConfigureAwait(false);
Expand Down
5 changes: 4 additions & 1 deletion test/OctoConfig.Tests/DependencyConfigTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,18 @@ public async Task ValidateTenantArgsAddedAndSubTypes(Mock<IServiceCollection> mo
await DependencyConfig.Setup(args, null, mockColl.Object, false).ConfigureAwait(false);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(ValidateTenantArgs))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(TenantTargetArgs))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(IProjectArgsBase))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(FileArgsBase))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(ArgsBase))), Times.Once);
}

[Theory, AppAutoData]
public async Task TenantTargetArgsAddedAndSubTypes(Mock<IServiceCollection> mockColl, TenantTargetArgs args)
public async Task TenantTargetArgsAddedAndSubTypes(Mock<IServiceCollection> mockColl, UploadTenantArgs args)
{
await DependencyConfig.Setup(args, null, mockColl.Object, false).ConfigureAwait(false);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(UploadTenantArgs))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(TenantTargetArgs))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(IProjectArgsBase))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(FileArgsBase))), Times.Once);
mockColl.Verify(m => m.Add(It.Is<ServiceDescriptor>(s => s.ServiceType == typeof(ArgsBase))), Times.Once);
}
Expand Down

0 comments on commit 8aeceeb

Please sign in to comment.