From e535a497b813598d1865b6eb4b026bc42f6c00cc Mon Sep 17 00:00:00 2001 From: Frank Lin Date: Tue, 11 Aug 2020 13:05:54 +1000 Subject: [PATCH 1/4] Accounts contribute well known variables --- .../AmazonWebServicesAccountDetails.cs | 4 +- .../AmazonWebServicesAccountModule.cs | 7 +- .../AmazonWebServicesAccountTypeProvider.cs | 7 ++ source/Sashimi.Aws.Accounts/KnownVariables.cs | 16 +++++ .../Sashimi.Aws.Accounts/SpecialVariables.cs | 28 -------- ...zureServicePrincipalAccountTypeProvider.cs | 6 ++ .../SpecialVariables.cs | 2 + .../AzureSubscriptionTypeProvider.cs | 6 ++ .../Accounts/IAccountTypeProvider.cs | 3 +- .../IContributeWellKnownVariables.cs | 9 +++ source/Server.Contracts/Variables/Variable.cs | 15 ++++ .../Variables/WellKnownVariable.cs | 70 +++++++++++++++++++ 12 files changed, 141 insertions(+), 32 deletions(-) create mode 100644 source/Sashimi.Aws.Accounts/KnownVariables.cs delete mode 100644 source/Sashimi.Aws.Accounts/SpecialVariables.cs create mode 100644 source/Server.Contracts/Variables/IContributeWellKnownVariables.cs create mode 100644 source/Server.Contracts/Variables/WellKnownVariable.cs diff --git a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountDetails.cs b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountDetails.cs index ed5af041..d8e68b31 100644 --- a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountDetails.cs +++ b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountDetails.cs @@ -30,8 +30,8 @@ public override IEnumerable ExpandVariable(Variable variable) public override IEnumerable ContributeVariables() { - yield return new Variable(SpecialVariables.Action.Amazon.AccessKey, AccessKey); - yield return new Variable(SpecialVariables.Action.Amazon.SecretKey, SecretKey); + yield return new Variable(KnownVariables.Action.Aws.AccessKey, AccessKey); + yield return new Variable(KnownVariables.Action.Aws.SecretKey, SecretKey); } public bool CanExpand(string id, string referencedEntityId) diff --git a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountModule.cs b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountModule.cs index 39c1e9ca..83d6f72b 100644 --- a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountModule.cs +++ b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountModule.cs @@ -1,6 +1,7 @@ using Autofac; using Octopus.Server.Extensibility.Extensions.Mappings; using Sashimi.Server.Contracts.Accounts; +using Sashimi.Server.Contracts.Variables; namespace Sashimi.Aws.Accounts { @@ -8,7 +9,11 @@ public class AmazonWebServicesAccountModule : Module { protected override void Load(ContainerBuilder builder) { - builder.RegisterType().As().As().SingleInstance(); + builder.RegisterType() + .As() + .As() + .As() + .SingleInstance(); } } } \ No newline at end of file diff --git a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs index 256faba9..692f1033 100644 --- a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs +++ b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs @@ -5,6 +5,7 @@ using Octopus.Server.Extensibility.HostServices.Mapping; using Sashimi.Server.Contracts.Accounts; using Sashimi.Server.Contracts.ServiceMessages; +using Sashimi.Server.Contracts.Variables; namespace Sashimi.Aws.Accounts { @@ -28,5 +29,11 @@ public void BuildMappings(IResourceMappingsBuilder builder) { builder.Map(); } + + public IEnumerable GetWellKnownVariables() + { + yield return KnownVariables.Action.Aws.AccessKey; + yield return KnownVariables.Action.Aws.SecretKey; + } } } \ No newline at end of file diff --git a/source/Sashimi.Aws.Accounts/KnownVariables.cs b/source/Sashimi.Aws.Accounts/KnownVariables.cs new file mode 100644 index 00000000..fcdd1945 --- /dev/null +++ b/source/Sashimi.Aws.Accounts/KnownVariables.cs @@ -0,0 +1,16 @@ +using Sashimi.Server.Contracts.Variables; + +namespace Sashimi.Aws.Accounts +{ + public class KnownVariables + { + public static class Action + { + public static class Aws + { + public static readonly WellKnownVariable AccessKey = new WellKnownVariable("Octopus.Action.Amazon.AccessKey"); + public static readonly WellKnownVariable SecretKey = new WellKnownVariable("Octopus.Action.Amazon.SecretKey"); + } + } + } +} \ No newline at end of file diff --git a/source/Sashimi.Aws.Accounts/SpecialVariables.cs b/source/Sashimi.Aws.Accounts/SpecialVariables.cs deleted file mode 100644 index b5ea7441..00000000 --- a/source/Sashimi.Aws.Accounts/SpecialVariables.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Sashimi.Aws.Accounts -{ - public class SpecialVariables - { - public static class Action - { - //We will make this public once we remove the Server version (we need to contribute these special variables via IContributeSpecialVariables) - internal static class Amazon - { - public static readonly string AccessKey = "Octopus.Action.Amazon.AccessKey"; - public static readonly string SecretKey = "Octopus.Action.Amazon.SecretKey"; - } - - public static class Aws - { - public static readonly string AccountId = "Octopus.Action.AwsAccount.Variable"; - public static readonly string UseInstanceRole = "Octopus.Action.AwsAccount.UseInstanceRole"; - public static readonly string AwsRegion = "Octopus.Action.Aws.Region"; - public static readonly string AssumeRole = "Octopus.Action.Aws.AssumeRole"; - public static readonly string AssumedRoleArn = "Octopus.Action.Aws.AssumedRoleArn"; - public static readonly string AssumedRoleSession = "Octopus.Action.Aws.AssumedRoleSession"; - public static readonly string AssumeRoleSessionDurationSeconds = "Octopus.Action.Aws.AssumeRoleSessionDurationSeconds"; - public static readonly string IamCapabilities = "Octopus.Action.Aws.IamCapabilities"; - public static readonly string AssumeRoleExternalId = "Octopus.Action.Aws.AssumeRoleExternalId"; - } - } - } -} \ No newline at end of file diff --git a/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs b/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs index bf7bcaa8..7af9d80e 100644 --- a/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs +++ b/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs @@ -6,6 +6,7 @@ using Octopus.Server.Extensibility.HostServices.Mapping; using Sashimi.Server.Contracts.Accounts; using Sashimi.Server.Contracts.ServiceMessages; +using Sashimi.Server.Contracts.Variables; namespace Sashimi.Azure.Accounts { @@ -34,5 +35,10 @@ public void BuildMappings(IResourceMappingsBuilder builder) { builder.Map(); } + + public IEnumerable GetWellKnownVariables() + { + yield break; + } } } \ No newline at end of file diff --git a/source/Sashimi.Azure.Accounts/SpecialVariables.cs b/source/Sashimi.Azure.Accounts/SpecialVariables.cs index aa401227..827d319c 100644 --- a/source/Sashimi.Azure.Accounts/SpecialVariables.cs +++ b/source/Sashimi.Azure.Accounts/SpecialVariables.cs @@ -1,3 +1,5 @@ +using Sashimi.Server.Contracts.Variables; + namespace Sashimi.Azure.Accounts { class SpecialVariables diff --git a/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs b/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs index 880f2bab..f5543ba1 100644 --- a/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs +++ b/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs @@ -5,6 +5,7 @@ using Octopus.Server.Extensibility.HostServices.Mapping; using Sashimi.Server.Contracts.Accounts; using Sashimi.Server.Contracts.ServiceMessages; +using Sashimi.Server.Contracts.Variables; namespace Sashimi.AzureCloudService { @@ -28,5 +29,10 @@ public void BuildMappings(IResourceMappingsBuilder builder) { builder.Map(); } + + public IEnumerable GetWellKnownVariables() + { + yield break; + } } } \ No newline at end of file diff --git a/source/Server.Contracts/Accounts/IAccountTypeProvider.cs b/source/Server.Contracts/Accounts/IAccountTypeProvider.cs index a9ae7a34..8602b31b 100644 --- a/source/Server.Contracts/Accounts/IAccountTypeProvider.cs +++ b/source/Server.Contracts/Accounts/IAccountTypeProvider.cs @@ -3,10 +3,11 @@ using FluentValidation; using Octopus.Server.Extensibility.Extensions.Mappings; using Sashimi.Server.Contracts.ServiceMessages; +using Sashimi.Server.Contracts.Variables; namespace Sashimi.Server.Contracts.Accounts { - public interface IAccountTypeProvider: IContributeMappings + public interface IAccountTypeProvider: IContributeMappings, IContributeWellKnownVariables { AccountType AccountType { get; } Type ModelType { get; } diff --git a/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs b/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs new file mode 100644 index 00000000..b65a7b2f --- /dev/null +++ b/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Sashimi.Server.Contracts.Variables +{ + public interface IContributeWellKnownVariables + { + IEnumerable GetWellKnownVariables(); + } +} \ No newline at end of file diff --git a/source/Server.Contracts/Variables/Variable.cs b/source/Server.Contracts/Variables/Variable.cs index bb88e19c..522ebacf 100644 --- a/source/Server.Contracts/Variables/Variable.cs +++ b/source/Server.Contracts/Variables/Variable.cs @@ -4,11 +4,21 @@ namespace Sashimi.Server.Contracts.Variables { public class Variable { + public Variable(WellKnownVariable wellKnownVariable, string? value) + : this(wellKnownVariable.Name, value, VariableType.String) + { + } + public Variable(string name, string? value) : this(name, value, VariableType.String) { } + public Variable(WellKnownVariable wellKnownVariable, string? value, VariableType type) + : this(wellKnownVariable.Name, value, type) + { + } + public Variable(string name, string? value, VariableType type) { Name = name; @@ -16,6 +26,11 @@ public Variable(string name, string? value, VariableType type) Type = type; } + public Variable(WellKnownVariable wellKnownVariable, SensitiveString? value) + : this(wellKnownVariable.Name, value) + { + } + public Variable(string name, SensitiveString? value) { Name = name; diff --git a/source/Server.Contracts/Variables/WellKnownVariable.cs b/source/Server.Contracts/Variables/WellKnownVariable.cs new file mode 100644 index 00000000..1dc2a372 --- /dev/null +++ b/source/Server.Contracts/Variables/WellKnownVariable.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Sashimi.Server.Contracts.Variables +{ + public class WellKnownVariable + { + public WellKnownVariable(string name, Visibility visibility = Visibility.Hidden, params string[] aliases) + { + Name = name; + Aliases = aliases; + Visibility = visibility; + } + + public string Name { get; } + public IEnumerable Aliases { get; } + public Visibility Visibility { get; } + + protected bool Equals(WellKnownVariable other) + { + return Name == other.Name + && Aliases.SequenceEqual(other.Aliases) //This is stricter than it needs to be but we're unlikely to even have more than 1 alias + && Visibility == other.Visibility; + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != this.GetType()) + return false; + return Equals((WellKnownVariable)obj); + } + + public override int GetHashCode() + { + return HashCode.Combine(Name, Aliases, (int)Visibility); + } + + public static bool operator ==(WellKnownVariable? left, WellKnownVariable? right) + { + return Equals(left, right); + } + + public static bool operator !=(WellKnownVariable? left, WellKnownVariable? right) + { + return !Equals(left, right); + } + + public static implicit operator string?(WellKnownVariable? wellKnownVariable) + { + return wellKnownVariable?.Name; + } + + //Override ToString() because these used to be constants, so we want to retain this behaviour in case we are constructing a string somewhere + public override string ToString() + { + return Name; + } + } + + public enum Visibility + { + Visible, + Hidden + } +} \ No newline at end of file From 09da6faee04571c3b400d5884b8f659e649edef5 Mon Sep 17 00:00:00 2001 From: Frank Lin Date: Tue, 11 Aug 2020 15:48:33 +1000 Subject: [PATCH 2/4] Restore constants --- source/Sashimi.Aws.Accounts/KnownVariables.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/Sashimi.Aws.Accounts/KnownVariables.cs b/source/Sashimi.Aws.Accounts/KnownVariables.cs index fcdd1945..9db7a763 100644 --- a/source/Sashimi.Aws.Accounts/KnownVariables.cs +++ b/source/Sashimi.Aws.Accounts/KnownVariables.cs @@ -10,6 +10,16 @@ public static class Aws { public static readonly WellKnownVariable AccessKey = new WellKnownVariable("Octopus.Action.Amazon.AccessKey"); public static readonly WellKnownVariable SecretKey = new WellKnownVariable("Octopus.Action.Amazon.SecretKey"); + + public static readonly string AccountId = "Octopus.Action.AwsAccount.Variable"; + public static readonly string UseInstanceRole = "Octopus.Action.AwsAccount.UseInstanceRole"; + public static readonly string AwsRegion = "Octopus.Action.Aws.Region"; + public static readonly string AssumeRole = "Octopus.Action.Aws.AssumeRole"; + public static readonly string AssumedRoleArn = "Octopus.Action.Aws.AssumedRoleArn"; + public static readonly string AssumedRoleSession = "Octopus.Action.Aws.AssumedRoleSession"; + public static readonly string AssumeRoleSessionDurationSeconds = "Octopus.Action.Aws.AssumeRoleSessionDurationSeconds"; + public static readonly string IamCapabilities = "Octopus.Action.Aws.IamCapabilities"; + public static readonly string AssumeRoleExternalId = "Octopus.Action.Aws.AssumeRoleExternalId"; } } } From cb44f42ab4c9b3b0e2aff51621e7bd8b70ac8b04 Mon Sep 17 00:00:00 2001 From: Frank Lin Date: Wed, 12 Aug 2020 09:45:25 +1000 Subject: [PATCH 3/4] Change interface for well known variables --- .../IContributeWellKnownVariables.cs | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs b/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs index b65a7b2f..3e2ee8cb 100644 --- a/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs +++ b/source/Server.Contracts/Variables/IContributeWellKnownVariables.cs @@ -1,9 +1,56 @@ +using System; using System.Collections.Generic; +using System.Linq; namespace Sashimi.Server.Contracts.Variables { public interface IContributeWellKnownVariables { - IEnumerable GetWellKnownVariables(); + //IEnumerable GetWellKnownVariables(); + IEnumerable GetUserVisibleWellKnownVariables(); + IEnumerable GetVariablesWithAliases(); + } + + public class WellKnownVariableAliasMapping + { + public WellKnownVariableAliasMapping(string currentName, params string[] aliases) + { + CurrentName = currentName; + Aliases = aliases; + } + + public string CurrentName { get; } + public IEnumerable Aliases { get; } + + protected bool Equals(WellKnownVariableAliasMapping other) + { + return CurrentName == other.CurrentName && Aliases.SequenceEqual(other.Aliases); //Strict + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != this.GetType()) + return false; + return Equals((WellKnownVariableAliasMapping) obj); + } + + public override int GetHashCode() + { + return HashCode.Combine(CurrentName, Aliases); + } + + public static bool operator ==(WellKnownVariableAliasMapping? left, WellKnownVariableAliasMapping? right) + { + return Equals(left, right); + } + + public static bool operator !=(WellKnownVariableAliasMapping? left, WellKnownVariableAliasMapping? right) + { + return !Equals(left, right); + } } } \ No newline at end of file From f6cea6438d95379bab09dd0ef439397971be6dd8 Mon Sep 17 00:00:00 2001 From: Frank Lin Date: Wed, 12 Aug 2020 09:50:02 +1000 Subject: [PATCH 4/4] Fix compile errors --- .../AmazonWebServicesAccountTypeProvider.cs | 7 ++++++- source/Sashimi.Aws.Accounts/KnownVariables.cs | 4 ++-- .../AzureServicePrincipalAccountTypeProvider.cs | 7 ++++++- .../AzureSubscriptionTypeProvider.cs | 7 ++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs index 692f1033..80bac01d 100644 --- a/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs +++ b/source/Sashimi.Aws.Accounts/AmazonWebServicesAccountTypeProvider.cs @@ -30,10 +30,15 @@ public void BuildMappings(IResourceMappingsBuilder builder) builder.Map(); } - public IEnumerable GetWellKnownVariables() + public IEnumerable GetUserVisibleWellKnownVariables() { yield return KnownVariables.Action.Aws.AccessKey; yield return KnownVariables.Action.Aws.SecretKey; } + + public IEnumerable GetVariablesWithAliases() + { + yield break; + } } } \ No newline at end of file diff --git a/source/Sashimi.Aws.Accounts/KnownVariables.cs b/source/Sashimi.Aws.Accounts/KnownVariables.cs index 9db7a763..2692b349 100644 --- a/source/Sashimi.Aws.Accounts/KnownVariables.cs +++ b/source/Sashimi.Aws.Accounts/KnownVariables.cs @@ -8,8 +8,8 @@ public static class Action { public static class Aws { - public static readonly WellKnownVariable AccessKey = new WellKnownVariable("Octopus.Action.Amazon.AccessKey"); - public static readonly WellKnownVariable SecretKey = new WellKnownVariable("Octopus.Action.Amazon.SecretKey"); + public static readonly string AccessKey = "Octopus.Action.Amazon.AccessKey"; + public static readonly string SecretKey = "Octopus.Action.Amazon.SecretKey"; public static readonly string AccountId = "Octopus.Action.AwsAccount.Variable"; public static readonly string UseInstanceRole = "Octopus.Action.AwsAccount.UseInstanceRole"; diff --git a/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs b/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs index 7af9d80e..8d5ef333 100644 --- a/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs +++ b/source/Sashimi.Azure.Accounts/AzureServicePrincipalAccountTypeProvider.cs @@ -36,7 +36,12 @@ public void BuildMappings(IResourceMappingsBuilder builder) builder.Map(); } - public IEnumerable GetWellKnownVariables() + public IEnumerable GetUserVisibleWellKnownVariables() + { + yield break; + } + + public IEnumerable GetVariablesWithAliases() { yield break; } diff --git a/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs b/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs index f5543ba1..796ce011 100644 --- a/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs +++ b/source/Sashimi.AzureCloudService/AzureSubscriptionTypeProvider.cs @@ -30,7 +30,12 @@ public void BuildMappings(IResourceMappingsBuilder builder) builder.Map(); } - public IEnumerable GetWellKnownVariables() + public IEnumerable GetUserVisibleWellKnownVariables() + { + yield break; + } + + public IEnumerable GetVariablesWithAliases() { yield break; }