diff --git a/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt b/source/Octopus.Client.Tests/PublicSurfaceAreaFixture.ThePublicSurfaceAreaShouldNotRegress..NETCore.approved.txt index ecca9cff..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 @@ -2448,6 +2449,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,10 +3595,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { 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 @@ -5765,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&) @@ -5774,10 +5785,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { 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 dc7933f6..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 @@ -2465,6 +2466,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,10 +3612,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { 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 @@ -5786,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&) @@ -5795,10 +5806,12 @@ Octopus.Client.Model String LibraryVariableSetId { get; } String LibraryVariableSetName { get; set; } Octopus.Client.Extensibility.LinkCollection Links { 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.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/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..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,6 +179,8 @@ public Library(string libraryVariableSetId) public Dictionary Variables { get; set; } = new Dictionary(); + public List ScopedVariables { get; set; } = []; + public LinkCollection Links { get; set; } public bool TryGetVariableValue(string templateName, out PropertyValueResource value) @@ -203,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; }