Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions source/Calamari.Common/FeatureToggles/OctopusFeatureToggle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ public static class KnownSlugs
public const string AnsiColorsInTaskLogFeatureToggle = "ansi-colors";
public const string ArgoCDHelmReplacePathFromContainerReferenceFeatureToggle = "argo-cd-helm-replace-path-from-container-reference";
public const string KustomizePatchImageUpdatesFeatureToggle = "kustomize-patch-image-updates";
public const string ArgoRolloutsSupportFeatureToggle = "argo-rollouts-support";
};

public static readonly OctopusFeatureToggle AnsiColorsInTaskLogFeatureToggle = new(KnownSlugs.AnsiColorsInTaskLogFeatureToggle);
public static readonly OctopusFeatureToggle ArgoCDHelmReplacePathFromContainerReferenceFeatureToggle = new(KnownSlugs.ArgoCDHelmReplacePathFromContainerReferenceFeatureToggle);
public static readonly OctopusFeatureToggle KustomizePatchImageUpdatesFeatureToggle = new(KnownSlugs.KustomizePatchImageUpdatesFeatureToggle);
public static readonly OctopusFeatureToggle ArgoRolloutsSupportFeatureToggle = new(KnownSlugs.ArgoRolloutsSupportFeatureToggle);

public class OctopusFeatureToggle
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
using System.Collections.Generic;
using System.Linq;
using Calamari.Common.Commands;
using Calamari.Common.FeatureToggles;
using Calamari.Common.Plumbing.Variables;
using Calamari.Kubernetes;
using Calamari.Kubernetes.Commands.Executors;
using Calamari.Kubernetes.ResourceStatus.Resources;
using Calamari.Testing.Helpers;
using FluentAssertions;
using Newtonsoft.Json;
using NUnit.Framework;

namespace Calamari.Tests.KubernetesFixtures.Commands.Executors
{
[TestFixture]
public class AppliedResourcesOutputHelperTests
{
InMemoryLog log;

[SetUp]
public void SetUp()
{
log = new InMemoryLog();
}

[Test]
public void SetsAppliedResourcesOutputVariable_WhenFeatureToggleIsEnabled()
{
// Arrange
var variables = new CalamariVariables
{
[KnownVariables.EnabledFeatureToggles] = OctopusFeatureToggles.KnownSlugs.ArgoRolloutsSupportFeatureToggle
};
var deployment = new RunningDeployment(variables);
var resources = new[]
{
new ResourceIdentifier(SupportedResourceGroupVersionKinds.DeploymentV1, "my-deployment", "default"),
new ResourceIdentifier(SupportedResourceGroupVersionKinds.ServiceV1, "my-service", "default")
};

// Act
AppliedResourcesOutputHelper.SetAppliedResourcesOutputVariable(log, deployment, resources);

// Assert
var outputVariable = variables.Get(SpecialVariables.AppliedResources);
outputVariable.Should().NotBeNullOrEmpty();

var deserializedResources = JsonConvert.DeserializeAnonymousType(outputVariable, new[]
{
new { Group = "", Version = "", Kind = "", Name = "", Namespace = "" }
});

deserializedResources.Should().HaveCount(2);
deserializedResources[0].Should().BeEquivalentTo(new
{
Group = "apps",
Version = "v1",
Kind = "Deployment",
Name = "my-deployment",
Namespace = "default"
});
deserializedResources[1].Should().BeEquivalentTo(new
{
Group = "",
Version = "v1",
Kind = "Service",
Name = "my-service",
Namespace = "default"
});
}

[Test]
public void DoesNotSetOutputVariable_WhenFeatureToggleIsDisabled()
{
// Arrange
var variables = new CalamariVariables();
var deployment = new RunningDeployment(variables);
var resources = new[]
{
new ResourceIdentifier(SupportedResourceGroupVersionKinds.DeploymentV1, "my-deployment", "default")
};

// Act
AppliedResourcesOutputHelper.SetAppliedResourcesOutputVariable(log, deployment, resources);

// Assert
var outputVariable = variables.Get(SpecialVariables.AppliedResources);
outputVariable.Should().BeNull();
}

[Test]
public void HandlesEmptyResourceCollection_WhenFeatureToggleIsEnabled()
{
// Arrange
var variables = new CalamariVariables
{
[KnownVariables.EnabledFeatureToggles] = OctopusFeatureToggles.KnownSlugs.ArgoRolloutsSupportFeatureToggle
};
var deployment = new RunningDeployment(variables);
var resources = Enumerable.Empty<ResourceIdentifier>();

// Act
AppliedResourcesOutputHelper.SetAppliedResourcesOutputVariable(log, deployment, resources);

// Assert
var outputVariable = variables.Get(SpecialVariables.AppliedResources);
outputVariable.Should().NotBeNullOrEmpty();
outputVariable.Should().Be("[]");
}

[Test]
public void SerializesResourcesWithCorrectJsonFormat()
{
// Arrange
var variables = new CalamariVariables
{
[KnownVariables.EnabledFeatureToggles] = OctopusFeatureToggles.KnownSlugs.ArgoRolloutsSupportFeatureToggle
};
var deployment = new RunningDeployment(variables);
var resources = new[]
{
new ResourceIdentifier(new ResourceGroupVersionKind("argoproj.io", "v1alpha1", "Rollout"), "my-rollout", "production")
};

// Act
AppliedResourcesOutputHelper.SetAppliedResourcesOutputVariable(log, deployment, resources);

// Assert
var outputVariable = variables.Get(SpecialVariables.AppliedResources);
var deserializedResources = JsonConvert.DeserializeAnonymousType(outputVariable, new[]
{
new { Group = "", Version = "", Kind = "", Name = "", Namespace = "" }
});

deserializedResources.Should().ContainSingle()
.Which.Should().BeEquivalentTo(new
{
Group = "argoproj.io",
Version = "v1alpha1",
Kind = "Rollout",
Name = "my-rollout",
Namespace = "production"
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Threading.Tasks;
using Calamari.Common.Commands;
using Calamari.Common.Features.Processes;
using Calamari.Common.FeatureToggles;
using Calamari.Common.Plumbing.FileSystem;
using Calamari.Common.Plumbing.Variables;
using Calamari.Kubernetes;
Expand All @@ -14,6 +15,7 @@
using Calamari.Testing.Helpers;
using Calamari.Tests.Fixtures.Integration.FileSystem;
using FluentAssertions;
using Newtonsoft.Json;
using NSubstitute;
using NSubstitute.ClearExtensions;
using NUnit.Framework;
Expand Down Expand Up @@ -371,6 +373,59 @@ public async Task CommandLineReturnsNonZeroCode_ReturnsFalseToIndicateFailure()
AssertNoManifestsReported();
}

[Test]
public async Task SetsAppliedResourcesOutputVariable_WhenFeatureToggleIsEnabled()
{
// Arrange
SetupCommandLineRunnerMock();
var variables = new CalamariVariables
{
[KnownVariables.OriginalPackageDirectoryPath] = StagingDirectory,
[SpecialVariables.KustomizeOverlayPath] = OverlayPath,
[KnownVariables.EnabledFeatureToggles] = OctopusFeatureToggles.KnownSlugs.ArgoRolloutsSupportFeatureToggle
};
var runningDeployment = new RunningDeployment(variables);
var executor = CreateExecutor(variables);

// Act
var result = await executor.Execute(runningDeployment, RecordingCallback);

// Assert
result.Should().BeTrue();
var appliedResourcesJson = variables.Get(SpecialVariables.AppliedResources);
appliedResourcesJson.Should().NotBeNullOrEmpty();

var deserializedResources = JsonConvert.DeserializeAnonymousType(appliedResourcesJson, new[]
{
new { Group = "", Version = "", Kind = "", Name = "", Namespace = "" }
});
deserializedResources.Should().HaveCount(2);
deserializedResources.Should().Contain(r => r.Kind == "Deployment" && r.Name == "basic-deployment" && r.Namespace == "dev");
deserializedResources.Should().Contain(r => r.Kind == "Service" && r.Name == "basic-service" && r.Namespace == "dev");
}

[Test]
public async Task DoesNotSetAppliedResourcesOutputVariable_WhenFeatureToggleIsDisabled()
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it doesn't really hurt but because the feature toggle guard is in the SetAppliedResourcesOutputVariable method, we don't really need this test as well?

{
// Arrange
SetupCommandLineRunnerMock();
var variables = new CalamariVariables
{
[KnownVariables.OriginalPackageDirectoryPath] = StagingDirectory,
[SpecialVariables.KustomizeOverlayPath] = OverlayPath
};
var runningDeployment = new RunningDeployment(variables);
var executor = CreateExecutor(variables);

// Act
var result = await executor.Execute(runningDeployment, RecordingCallback);

// Assert
result.Should().BeTrue();
var appliedResourcesJson = variables.Get("AppliedResources");
appliedResourcesJson.Should().BeNull();
}

void SetupCommandLineRunnerMock(int kubectlMinor = 28)
{
const string resourceJson = @"{
Expand Down
Loading