[dotnet] Unsecret and IsSecret implementation for .NET (#6092)

This commit is contained in:
Mikhail Shilkov 2021-01-12 15:54:08 +01:00 committed by GitHub
parent 0d4f886525
commit 710f385447
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 83 additions and 0 deletions

View file

@ -18,6 +18,14 @@ CHANGELOG
- [sdk/dotnet] Moved urn value retrieval into if statement for MockMonitor
[#6081](https://github.com/pulumi/pulumi/pull/6081)
- [sdk/dotnet] Added `Pulumi.Output.Unsecret` which will take an existing secret output and
create a non-secret variant with an unwrapped secret value.
[#6092](https://github.com/pulumi/pulumi/pull/6092)
- [sdk/dotnet] Added `Pulumi.Output.IsSecretAsync` which will take an existing output and
determine if an output has a secret within the output.
[#6092](https://github.com/pulumi/pulumi/pull/6092)
## 2.17.0 (2021-01-06)
- Respect the `version` resource option for provider resources.

View file

@ -293,6 +293,63 @@ namespace Pulumi.Tests.Core
var data = await o.DataTask.ConfigureAwait(false);
Assert.Equal(new[] { 1, 2 }, data.Value);
});
[Fact]
public Task IsSecretAsyncOnKnownOutput()
=> RunInPreview(async () =>
{
var o1 = CreateOutput(0, isKnown: true, isSecret: true);
var o2 = CreateOutput(1, isKnown: true, isSecret: false);
var isSecret1 = await Output.IsSecretAsync(o1).ConfigureAwait(false);
var isSecret2 = await Output.IsSecretAsync(o2).ConfigureAwait(false);
Assert.True(isSecret1);
Assert.False(isSecret2);
});
[Fact]
public Task IsSecretAsyncOnAwaitableOutput()
=> RunInPreview(async () =>
{
var o1 = CreateOutput(0, isKnown: true, isSecret: true).Apply(a => Task.FromResult("inner1"));
var o2 = CreateOutput(1, isKnown: true, isSecret: false).Apply(a => Task.FromResult("inner2"));
var isSecret1 = await Output.IsSecretAsync(o1).ConfigureAwait(false);
var isSecret2 = await Output.IsSecretAsync(o2).ConfigureAwait(false);
Assert.True(isSecret1);
Assert.False(isSecret2);
});
[Fact]
public Task UnsecretOnKnownSecretValue()
=> RunInPreview(async () =>
{
var secret = CreateOutput(1, isKnown: true, isSecret: true);
var notSecret = Output.Unsecret(secret);
var notSecretData = await notSecret.DataTask.ConfigureAwait(false);
Assert.False(notSecretData.IsSecret);
Assert.Equal(1, notSecretData.Value);
});
[Fact]
public Task UnsecretOnAwaitableSecretValue()
=> RunInPreview(async () =>
{
var secret = CreateOutput(0, isKnown: true, isSecret: true).Apply(a => Task.FromResult("inner"));
var notSecret = Output.Unsecret(secret);
var notSecretData = await notSecret.DataTask.ConfigureAwait(false);
Assert.False(notSecretData.IsSecret);
Assert.Equal("inner", notSecretData.Value);
});
[Fact]
public Task UnsecretOnNonSecretValue()
=> RunInPreview(async () =>
{
var secret = CreateOutput(2, isKnown: true, isSecret: false);
var notSecret = Output.Unsecret(secret);
var notSecretData = await notSecret.DataTask.ConfigureAwait(false);
Assert.False(notSecretData.IsSecret);
Assert.Equal(2, notSecretData.Value);
});
}
public class NormalTests

View file

@ -27,6 +27,22 @@ namespace Pulumi
public static Output<T> CreateSecret<T>(Task<T> value)
=> Output<T>.CreateSecret(value);
/// <summary>
/// Returns a new <see cref="Output{T}"/> which is a copy of the existing output but marked as
/// a non-secret. The original output is not modified in any way.
/// </summary>
public static Output<T> Unsecret<T>(Output<T> output)
=> output.WithIsSecret(Task.FromResult(false));
/// <summary>
/// Retrieves the secretness status of the given output.
/// </summary>
public static async Task<bool> IsSecretAsync<T>(Output<T> output)
{
var dataTask = await output.DataTask.ConfigureAwait(false);
return dataTask.IsSecret;
}
/// <summary>
/// Combines all the <see cref="Input{T}"/> values in <paramref name="inputs"/>
/// into a single <see cref="Output{T}"/> with an <see cref="ImmutableArray{T}"/>

View file

@ -302,6 +302,7 @@ static Pulumi.Output.Create<T>(T value) -> Pulumi.Output<T>
static Pulumi.Output.CreateSecret<T>(System.Threading.Tasks.Task<T> value) -> Pulumi.Output<T>
static Pulumi.Output.CreateSecret<T>(T value) -> Pulumi.Output<T>
static Pulumi.Output.Format(System.FormattableString formattableString) -> Pulumi.Output<string>
static Pulumi.Output.IsSecretAsync<T>(Pulumi.Output<T> output) -> System.Threading.Tasks.Task<bool>
static Pulumi.Output.Tuple<T1, T2, T3, T4, T5, T6, T7, T8>(Pulumi.Input<T1> item1, Pulumi.Input<T2> item2, Pulumi.Input<T3> item3, Pulumi.Input<T4> item4, Pulumi.Input<T5> item5, Pulumi.Input<T6> item6, Pulumi.Input<T7> item7, Pulumi.Input<T8> item8) -> Pulumi.Output<(T1, T2, T3, T4, T5, T6, T7, T8)>
static Pulumi.Output.Tuple<T1, T2, T3, T4, T5, T6, T7, T8>(Pulumi.Output<T1> item1, Pulumi.Output<T2> item2, Pulumi.Output<T3> item3, Pulumi.Output<T4> item4, Pulumi.Output<T5> item5, Pulumi.Output<T6> item6, Pulumi.Output<T7> item7, Pulumi.Output<T8> item8) -> Pulumi.Output<(T1, T2, T3, T4, T5, T6, T7, T8)>
static Pulumi.Output.Tuple<T1, T2, T3, T4, T5, T6, T7>(Pulumi.Input<T1> item1, Pulumi.Input<T2> item2, Pulumi.Input<T3> item3, Pulumi.Input<T4> item4, Pulumi.Input<T5> item5, Pulumi.Input<T6> item6, Pulumi.Input<T7> item7) -> Pulumi.Output<(T1, T2, T3, T4, T5, T6, T7)>
@ -316,6 +317,7 @@ static Pulumi.Output.Tuple<T1, T2, T3>(Pulumi.Input<T1> item1, Pulumi.Input<T2>
static Pulumi.Output.Tuple<T1, T2, T3>(Pulumi.Output<T1> item1, Pulumi.Output<T2> item2, Pulumi.Output<T3> item3) -> Pulumi.Output<(T1, T2, T3)>
static Pulumi.Output.Tuple<T1, T2>(Pulumi.Input<T1> item1, Pulumi.Input<T2> item2) -> Pulumi.Output<(T1, T2)>
static Pulumi.Output.Tuple<T1, T2>(Pulumi.Output<T1> item1, Pulumi.Output<T2> item2) -> Pulumi.Output<(T1, T2)>
static Pulumi.Output.Unsecret<T>(Pulumi.Output<T> output) -> Pulumi.Output<T>
static Pulumi.Output<T>.Create(System.Threading.Tasks.Task<T> value) -> Pulumi.Output<T>
static Pulumi.OutputExtensions.AsT0<T0, T1>(this Pulumi.Output<Pulumi.Union<T0, T1>> output) -> Pulumi.Output<T0>
static Pulumi.OutputExtensions.AsT1<T0, T1>(this Pulumi.Output<Pulumi.Union<T0, T1>> output) -> Pulumi.Output<T1>