Skip to content

Commit 78db754

Browse files
committed
Merge branch 'RickRen7575-master'
2 parents 5368313 + 7723b80 commit 78db754

18 files changed

+287
-34
lines changed

README.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,32 @@ upload-project --tenant "QA Infra" --project "Deploy API" --variableType Environ
166166
-f "C:\QA\appsettings.json" -e QA RC
167167
```
168168

169+
#### Targeting a Project Template
170+
171+
This command takes the variables from the json file and creates project variable templates in the specified project.
172+
Variables that are not secret are created using their values in the json file as the default value.
173+
Variables that are secret are given no default value.
174+
175+
Targeting a project has one additional argument
176+
177+
- `-p`, `--project`
178+
- The Octopus project to match Tenant variables with
179+
180+
Targeting a project also has one optional argument
181+
182+
- `-c`, `--clear`
183+
- Clears the previous template before uploading new template
184+
185+
Example:
186+
187+
```bash
188+
upload-project-template --project "Deploy API" --variableType JsonConversion \
189+
-a "API-KEY" -p "API_" --vaultUri "http://vaultapi:8200" \
190+
--vaultRole "VAULT_PROVIDED_ROLE_GUID" --secret "VAULT_PROVIDED_ROLE_SECRET_GUID" \
191+
-f "C:\QA\appsettings.json" ---clear
192+
```
193+
194+
169195
#### Clearing a Project of Variable Templates
170196

171197
Deletes **ALL** the variables templates in the specified project
@@ -328,14 +354,37 @@ void ClearTenantConfig(string octoApiUri, string octoApiKey, string vaultUri, st
328354
ClearTenantConfig(new TenantTargetArgs(){ ... });
329355
}
330356

357+
358+
```
359+
#### Cake Project Targets
360+
361+
```csharp
362+
void UploadProjectJson(string octoApiUri, string octoApiKey, string vaultUri, string vaultRoleId, string vaultSecretId,
363+
List<string> enviros, List<string> roles, string project, string filePath, string prefix, bool clear)
364+
{
365+
Information($"Uploading {filePath}");
366+
UploadProject(new UploadProjectArgs(){
367+
File = filePath,
368+
ApiKey = octoApiKey,
369+
OctoUri = octoApiUri,
370+
ProjectName = project,
371+
Environments = enviros,
372+
OctoRoles = roles,
373+
VaultUri = vaultUri,
374+
VaultRoleId = vaultRoleId,
375+
VaultSecretId = vaultSecretId,
376+
VariableType = VariableType.JsonConversion,
377+
Clear = clear
378+
});
379+
}
380+
331381
void ClearProjectConfig(string octoApiUri, string octoApiKey, string vaultUri, string vaultRoleId, string vaultSecretId,
332382
List<string> enviros, List<string> roles, string tenant, string project, string filePath)
333383
{
334384
Information($"Validating {filePath}");
335385
ClearProjectConfig(new TenantTargetArgs(){ ... });
336386
}
337387
```
338-
339388
#### Deprecated Cake Targets
340389

341390
```csharp

src/OctoConfig.Core/Arguments/ArgsBase.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ public class ArgsBase
1818
public bool MergeArrays { get; set; }
1919
}
2020

21+
public interface IProjectArgsBase
22+
{
23+
string ProjectName { get; set; }
24+
}
25+
26+
public class ProjectArgsBase : ArgsBase, IProjectArgsBase
27+
{
28+
[Option('p', "project", Required = true, HelpText = "The Octopus project to match variables with")]
29+
public string ProjectName { get; set; }
30+
}
31+
2132
public class FileArgsBase : ArgsBase
2233
{
2334
[Option('f', "file", Required = true, HelpText = "The json file to parse into variables")]

src/OctoConfig.Core/Arguments/ClearArgs.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ public class ClearVariableSetArgs : LibraryTargetArgs
88
}
99

1010
[Verb("clear-project", HelpText = "Removes ALL the variable templates in the specified project")]
11-
public class ClearProjectArgs : ArgsBase
12-
{
13-
[Option('p', "project", Required = true, HelpText = "The Octopus role(s) to scope variables to")]
14-
public string ProjectName { get; set; }
15-
}
11+
public class ClearProjectArgs : ProjectArgsBase { }
1612

1713
[Verb("clear-tenant", HelpText = "Removes ALL the variables in the specified tenant")]
1814
public class ClearTenantArgs : ArgsBase
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using CommandLine;
2+
3+
namespace OctoConfig.Core.Arguments
4+
{
5+
public class ProjectTargetArgs : FileArgsBase, IProjectArgsBase
6+
{
7+
[Option('p', "project", Required = true, HelpText = "The Octopus project to match variables with")]
8+
public string ProjectName { get; set; }
9+
}
10+
}

src/OctoConfig.Core/Arguments/TenantTargetArgs.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@
33
namespace OctoConfig.Core.Arguments
44
{
55
[Verb("upload-project", HelpText = "Convert json file to environment variables and upload them to Octopus")]
6-
public class TenantTargetArgs : FileArgsBase
6+
public class TenantTargetArgs : ProjectTargetArgs
77
{
88
[Option('t', "tenant", Required = true, HelpText = "The Octopus tenant to attach variables to")]
99
public string TenantName { get; set; }
10-
11-
[Option('p', "project", Required = true, HelpText = "The Octopus project to match tenant variables with")]
12-
public string ProjectName { get; set; }
1310
}
1411
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using CommandLine;
2+
3+
namespace OctoConfig.Core.Arguments
4+
{
5+
[Verb("upload-project-template", HelpText = "Upload them to an Octopus project as templates")]
6+
public sealed class UploadProjectArgs : ProjectTargetArgs
7+
{
8+
[Option('c', "clear", Required = false, Default = false, HelpText = "Clears any project variables in the project before uploading new template")]
9+
public bool ClearProject { get; set; }
10+
}
11+
}

src/OctoConfig.Core/Cake/CakeAliases.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ public static void UploadTenant(this ICakeContext context, TenantTargetArgs args
6969
cmd.Execute().GetAwaiter().GetResult();
7070
}
7171

72+
[CakeMethodAlias]
73+
public static void UploadProject(this ICakeContext context, UploadProjectArgs args)
74+
{
75+
DependencyConfig.Setup(args, context).GetAwaiter().GetResult();
76+
var cmd = DependencyConfig.Container.GetService<UploadProjectCommand>();
77+
cmd.Execute().GetAwaiter().GetResult();
78+
}
79+
7280
[CakeMethodAlias]
7381
public static void ValidateTenantConfig(this ICakeContext context, ValidateTenantArgs args)
7482
{

src/OctoConfig.Core/Commands/ClearProjectCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ namespace OctoConfig.Core.Commands
66
{
77
public class ClearProjectCommand
88
{
9-
private readonly ProjectClearer _projectClearer;
9+
private readonly IProjectClearer _projectClearer;
1010

11-
public ClearProjectCommand(ProjectClearer projectClearer)
11+
public ClearProjectCommand(IProjectClearer projectClearer)
1212
{
1313
_projectClearer = projectClearer ?? throw new System.ArgumentNullException(nameof(projectClearer));
1414
}

src/OctoConfig.Core/Commands/ClearTenantCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ namespace OctoConfig.Core.Commands
66
{
77
public class ClearTenantCommand
88
{
9-
private readonly TenantClearer _tenantClearer;
9+
private readonly ITenantClearer _tenantClearer;
1010

11-
public ClearTenantCommand(TenantClearer tenantClearer)
11+
public ClearTenantCommand(ITenantClearer tenantClearer)
1212
{
1313
_tenantClearer = tenantClearer ?? throw new System.ArgumentNullException(nameof(tenantClearer));
1414
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.IO;
3+
using System.IO.Abstractions;
4+
using System.Linq;
5+
using System.Threading.Tasks;
6+
using OctoConfig.Core.Arguments;
7+
using OctoConfig.Core.Converter;
8+
using OctoConfig.Core.DependencySetup;
9+
using OctoConfig.Core.Octopus;
10+
using OctoConfig.Core.Secrets;
11+
12+
namespace OctoConfig.Core.Commands
13+
{
14+
public class UploadProjectCommand
15+
{
16+
private readonly UploadProjectArgs _args;
17+
private readonly ISecretsMananger _secretsMananger;
18+
private readonly VariableConverter _varConverter;
19+
private readonly IProjectManager _projectManager;
20+
private readonly IProjectClearer _projectClearer;
21+
private readonly IFileSystem _fileSystem;
22+
private readonly ILogger _logger;
23+
24+
public UploadProjectCommand(UploadProjectArgs args, ISecretsMananger secretsMananger, IProjectManager projectManager,
25+
IProjectClearer projectClearer, VariableConverter variableConverter, IFileSystem fileSystem, ILogger logger)
26+
{
27+
_args = args ?? throw new ArgumentNullException(nameof(args));
28+
_secretsMananger = secretsMananger ?? throw new ArgumentNullException(nameof(secretsMananger));
29+
_varConverter = variableConverter ?? throw new ArgumentNullException(nameof(variableConverter));
30+
_projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
31+
_projectClearer = projectClearer ?? throw new ArgumentNullException(nameof(projectClearer));
32+
_fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
33+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
34+
}
35+
36+
public async Task Execute()
37+
{
38+
var vars = _varConverter.Convert(_fileSystem.File.ReadAllText(_args.File));
39+
if(_args.ClearProject)
40+
{
41+
await _projectClearer.ClearProjectVariables();
42+
}
43+
await _secretsMananger.ReplaceSecrets(vars).ConfigureAwait(false);
44+
await _projectManager.CreateProjectVariables(vars, true);
45+
46+
var secretCount = vars.Count(s => s.IsSecret);
47+
var pub = vars.Count - secretCount;
48+
_logger.Information($"Found a total of {vars.Count} variables.");
49+
_logger.Information($"{secretCount} were secrets and {pub} were not");
50+
}
51+
}
52+
}

0 commit comments

Comments
 (0)