From 4b6177f91011f25901c66ad8d71bb1e7e952bb65 Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 27 Sep 2024 12:58:53 +1000 Subject: [PATCH 1/4] Add ScopeVariables to tenant variables --- .../Model/CommonVariableValueResource.cs | 10 ++++++++++ .../Model/TenantVariableResource.cs | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 source/Octopus.Server.Client/Model/CommonVariableValueResource.cs diff --git a/source/Octopus.Server.Client/Model/CommonVariableValueResource.cs b/source/Octopus.Server.Client/Model/CommonVariableValueResource.cs new file mode 100644 index 00000000..2b579e44 --- /dev/null +++ b/source/Octopus.Server.Client/Model/CommonVariableValueResource.cs @@ -0,0 +1,10 @@ +namespace Octopus.Client.Model; + +public class CommonVariableValueResource +{ + public string TemplateId { get; set; } + + public PropertyValueResource Value { get; set; } + + public string[] Scope { get; set; } +} \ No newline at end of file diff --git a/source/Octopus.Server.Client/Model/TenantVariableResource.cs b/source/Octopus.Server.Client/Model/TenantVariableResource.cs index e323c1d8..da91a954 100644 --- a/source/Octopus.Server.Client/Model/TenantVariableResource.cs +++ b/source/Octopus.Server.Client/Model/TenantVariableResource.cs @@ -168,6 +168,8 @@ public Library(string libraryVariableSetId) public Dictionary Variables { get; set; } = new Dictionary(); + public CommonVariableValueResource[] ScopedVariables { get; set; } = []; + public LinkCollection Links { get; set; } public bool TryGetVariableValue(string templateName, out PropertyValueResource value) From c0d3272f321d9e34bf7367516b332bc7a22cb3c0 Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 27 Sep 2024 13:06:50 +1000 Subject: [PATCH 2/4] Approve surface area --- ...blicSurfaceAreaShouldNotRegress..NETCore.approved.txt | 9 +++++++++ ...urfaceAreaShouldNotRegress..NETFramework.approved.txt | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt index ecca9cff..3a37a4c8 100644 --- a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt +++ b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt @@ -2448,6 +2448,13 @@ Octopus.Client.Model .ctor() Octopus.Client.Model.TResource Resource { get; set; } } + class CommonVariableValueResource + { + .ctor() + String[] Scope { get; set; } + String TemplateId { get; set; } + Octopus.Client.Model.PropertyValueResource Value { get; set; } + } CommunicationStyle { None = 0 @@ -3587,6 +3594,7 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } + Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) @@ -5774,6 +5782,7 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } + Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) diff --git a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt index dc7933f6..24493420 100644 --- a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt +++ b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt @@ -2465,6 +2465,13 @@ Octopus.Client.Model .ctor() Octopus.Client.Model.TResource Resource { get; set; } } + class CommonVariableValueResource + { + .ctor() + String[] Scope { get; set; } + String TemplateId { get; set; } + Octopus.Client.Model.PropertyValueResource Value { get; set; } + } CommunicationStyle { None = 0 @@ -3604,6 +3611,7 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } + Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) @@ -5795,6 +5803,7 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } + Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) From 15c52a0640b8e01b9e445e8dd61d84118a7b0c6f Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 27 Sep 2024 13:30:07 +1000 Subject: [PATCH 3/4] Add methods to set scope common variables --- .../Editors/Async/TenantVariablesEditor.cs | 7 ++++ .../Model/TenantVariableResource.cs | 38 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/source/Octopus.Server.Client/Editors/Async/TenantVariablesEditor.cs b/source/Octopus.Server.Client/Editors/Async/TenantVariablesEditor.cs index eb59377e..7851c197 100644 --- a/source/Octopus.Server.Client/Editors/Async/TenantVariablesEditor.cs +++ b/source/Octopus.Server.Client/Editors/Async/TenantVariablesEditor.cs @@ -54,5 +54,12 @@ public TenantVariablesEditor SetLibraryVariableValue( Instance.SetLibraryVariableValue(libraryVariableSetResource, templateName, value); return this; } + + public TenantVariablesEditor SetLibraryVariableValue(LibraryVariableSetResource libraryVariableSetResource, + string templateName, PropertyValueResource value, string[] scope) + { + Instance.SetLibraryVariableValue(libraryVariableSetResource, templateName, value, scope); + return this; + } } } \ No newline at end of file diff --git a/source/Octopus.Server.Client/Model/TenantVariableResource.cs b/source/Octopus.Server.Client/Model/TenantVariableResource.cs index da91a954..594f66cf 100644 --- a/source/Octopus.Server.Client/Model/TenantVariableResource.cs +++ b/source/Octopus.Server.Client/Model/TenantVariableResource.cs @@ -87,6 +87,17 @@ public void SetLibraryVariableValue( libraryVariables.SetVariableValue(templateName, value); } + public void SetLibraryVariableValue(LibraryVariableSetResource libraryVariableSetResource, string templateName, + PropertyValueResource value, string[] scope) + { + if (!LibraryVariables.TryGetValue(libraryVariableSetResource.Id, out var libraryVariables)) + { + throw new ArgumentException("Supplied library variable set is not connected", nameof(libraryVariableSetResource)); + } + + libraryVariables.SetVariableValue(templateName, value, scope); + } + public class Project { public Project(string projectId) @@ -168,7 +179,7 @@ public Library(string libraryVariableSetId) public Dictionary Variables { get; set; } = new Dictionary(); - public CommonVariableValueResource[] ScopedVariables { get; set; } = []; + public List ScopedVariables { get; set; } = []; public LinkCollection Links { get; set; } @@ -205,6 +216,31 @@ public void SetVariableValue(string templateName, PropertyValueResource value) Variables[templateId] = value; } + + public void SetVariableValue(string templateName, PropertyValueResource value, string[] scope) + { + var templateId = Templates.SingleOrDefault(t => t.Name == templateName)?.Id; + if (templateId is null) + { + throw new ArgumentException($"No project variable template with name '{templateName}'"); + } + + var existingVariable = ScopedVariables + .Where(v => string.Equals(v.TemplateId, templateId, StringComparison.OrdinalIgnoreCase)) + .FirstOrDefault(v => scope.All(s => v.Scope.Contains(s, StringComparer.OrdinalIgnoreCase))); + if (existingVariable is not null) + { + existingVariable.Value = value; + return; + } + + ScopedVariables.Add(new CommonVariableValueResource + { + TemplateId = templateId, + Value = value, + Scope = scope + }); + } } public string SpaceId { get; set; } From eeefa0a2efdaaaa1ba9f11310015e7027d80d1b3 Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 27 Sep 2024 13:39:32 +1000 Subject: [PATCH 4/4] Update surface area --- ...ublicSurfaceAreaShouldNotRegress..NETCore.approved.txt | 8 ++++++-- ...SurfaceAreaShouldNotRegress..NETFramework.approved.txt | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt index 3a37a4c8..8886597a 100644 --- a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt +++ b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt @@ -1366,6 +1366,7 @@ Octopus.Client.Editors.Async Task Load() Task Save() Octopus.Client.Editors.Async.TenantVariablesEditor SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource) + Octopus.Client.Editors.Async.TenantVariablesEditor SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource, String[]) Octopus.Client.Editors.Async.TenantVariablesEditor SetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource) } class UsernamePasswordAccountEditor @@ -3594,11 +3595,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } - Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } + List ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource) + void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource, String[]) Boolean TryGetVariableValue(String, Octopus.Client.Model.PropertyValueResource&) } class LibraryVariableSetProjectUsage @@ -5773,6 +5775,7 @@ Octopus.Client.Model Octopus.Client.Model.PropertyValueResource GetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String) Octopus.Client.Model.PropertyValueResource GetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String) void SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource) + void SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource, String[]) void SetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource) Boolean TryGetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource&) Boolean TryGetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource&) @@ -5782,11 +5785,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } - Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } + List ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource) + void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource, String[]) Boolean TryGetVariableValue(String, Octopus.Client.Model.PropertyValueResource&) } class Project diff --git a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt index 24493420..1ee53612 100644 --- a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt +++ b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETFramework.approved.txt @@ -1367,6 +1367,7 @@ Octopus.Client.Editors.Async Task Load() Task Save() Octopus.Client.Editors.Async.TenantVariablesEditor SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource) + Octopus.Client.Editors.Async.TenantVariablesEditor SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource, String[]) Octopus.Client.Editors.Async.TenantVariablesEditor SetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource) } class UsernamePasswordAccountEditor @@ -3611,11 +3612,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } - Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } + List ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource) + void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource, String[]) Boolean TryGetVariableValue(String, Octopus.Client.Model.PropertyValueResource&) } class LibraryVariableSetProjectUsage @@ -5794,6 +5796,7 @@ Octopus.Client.Model Octopus.Client.Model.PropertyValueResource GetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String) Octopus.Client.Model.PropertyValueResource GetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String) void SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource) + void SetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource, String[]) void SetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource) Boolean TryGetLibraryVariableValue(Octopus.Client.Model.LibraryVariableSetResource, String, Octopus.Client.Model.PropertyValueResource&) Boolean TryGetProjectVariableValue(Octopus.Client.Model.ProjectResource, Octopus.Client.Model.EnvironmentResource, String, Octopus.Client.Model.PropertyValueResource&) @@ -5803,11 +5806,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { get; set; } - Octopus.Client.Model.CommonVariableValueResource[] ScopedVariables { get; set; } + List ScopedVariables { get; set; } List Templates { get; set; } Dictionary Variables { get; set; } Octopus.Client.Model.PropertyValueResource GetVariableValue(String) void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource) + void SetVariableValue(String, Octopus.Client.Model.PropertyValueResource, String[]) Boolean TryGetVariableValue(String, Octopus.Client.Model.PropertyValueResource&) } class Project