Compare commits

...

4 commits

Author SHA1 Message Date
stack72 ec9353d20e [deps] Ensuring pulumi/pulumi pkg references pulumi sdk v2.24.1 2021-04-01 22:02:52 +01:00
stack72 d5086c6a43 Prepare for v2.24.1 release 2021-04-01 22:01:42 +01:00
Anton Tayanovskyy 6d393ac929 Avoid overriding dotnet proj settings accidentally (#6670)
* Add failing test

* Guard against overrding project settings accidentally

* Throw exception in case of conflct

* Update sdk/dotnet/Pulumi.Automation/DictionaryContentsComparer.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectRuntime.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectTemplateConfigValue.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectTemplate.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectRuntimeOptions.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectBackend.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Update sdk/dotnet/Pulumi.Automation/ProjectSettings.cs

Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>

* Reduce nesting

* Make the new exception public

* Introduce a CHANGELOG entry since we add to pub API

* Stricter check before throwing

* Address PR feedback, round 1

* Use Reference.Equals check

* Move DictionaryContentsComparer out of top-level

Co-authored-by: Komal Ali <komal@pulumi.com>
Co-authored-by: Ville Penttinen <villem.penttinen@gmail.com>
2021-04-01 22:01:00 +01:00
Levi Blackstone 1c3bbc0de8 Revert "Swap out YAML parser library (#6642)" (#6681)
This reverts commit ff2cf70
2021-04-01 22:00:08 +01:00
23 changed files with 546 additions and 111 deletions

View file

@ -1,6 +1,17 @@
CHANGELOG
=========
## 2.24.1 (2021-04-01)
### Bug Fixes
- [cli] Revert the swapping out of the YAML parser library
[#6681](https://github.com/pulumi/pulumi/pull/6681)
- [automation/go,python,nodejs] Respect pre-existing Pulumi.yaml for inline programs.
[#6655](https://github.com/pulumi/pulumi/pull/6655)
## 2.24.0 (2021-03-31)
### Improvements

View file

@ -1,31 +1,7 @@
### Breaking
### Improvements
- [sdk/nodejs] Add provider side caching for dynamic provider deserialization
[#6657](https://github.com/pulumi/pulumi/pull/6657)
- [automation/dotnet] Expose structured logging
[#6572](https://github.com/pulumi/pulumi/pull/6572)
- [cli] Support full fidelity YAML round-tripping
- Strip Byte-order Mark (BOM) from YAML configs during load. - [#6636](https://github.com/pulumi/pulumi/pull/6636)
- Swap out YAML parser library - [#6642](https://github.com/pulumi/pulumi/pull/6642)
- [sdk/python] Ensure all async tasks are awaited prior to exit.
[#6606](https://github.com/pulumi/pulumi/pull/6606)
### Bug Fixes
- [sdk/nodejs] Fix error propagation in registerResource and other resource methods.
[#6644](https://github.com/pulumi/pulumi/pull/6644)
- [automation/python] Fix passing of additional environment variables.
[#6639](https://github.com/pulumi/pulumi/pull/6639)
- [sdk/python] Make exceptions raised by calls to provider functions (e.g. data sources) catchable.
[#6504](https://github.com/pulumi/pulumi/pull/6504)
- [cli] Revert the swapping out of the YAML parser library
[#6681](https://github.com/pulumi/pulumi/pull/6681)
- [automation/go,python,nodejs] Respect pre-existing Pulumi.yaml for inline programs.
[#6655](https://github.com/pulumi/pulumi/pull/6655)

View file

@ -33,14 +33,14 @@ require (
github.com/opentracing/opentracing-go v1.1.0
github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386
github.com/pkg/errors v0.9.1
github.com/pulumi/pulumi/sdk/v2 v2.24.0
github.com/pulumi/pulumi/sdk/v2 v2.24.1
github.com/rjeczalik/notify v0.9.2
github.com/sergi/go-diff v1.1.0
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 // indirect
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
github.com/spf13/cobra v1.0.0
github.com/stretchr/testify v1.7.0
github.com/stretchr/testify v1.6.1
github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7
github.com/xeipuuv/gojsonschema v1.2.0
github.com/zclconf/go-cty v1.3.1

View file

@ -216,8 +216,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
@ -263,8 +261,6 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
@ -498,8 +494,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI=
github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@ -589,8 +583,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzr
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94 h1:Htsu46DUlRauQVuY0qXQWwGMkuGvc9PReS60kNYPuzE=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94/go.mod h1:gY5v736YyqzhcB0WcDSX4ePCUM90DU88xiH4gQ/ZcXo=
github.com/pulumi/pulumi/sdk/v2 v2.23.0 h1:uyTvI6axYV3feeMbcWLnNtHZQsbkx98OoY5Jpq7acSM=
github.com/pulumi/pulumi/sdk/v2 v2.23.0/go.mod h1:sHQdzD0/cIopR5uLeoikXi1pNBv5SwA4M617VqdIA3E=
github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8=
@ -652,9 +644,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=

View file

@ -0,0 +1,3 @@
description: This is a description
name: correct_project
runtime: dotnet

View file

@ -6,8 +6,10 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Pulumi.Automation.Exceptions;
using Pulumi.Automation.Commands.Exceptions;
using Pulumi.Automation.Events;
using Xunit;
@ -16,9 +18,6 @@ namespace Pulumi.Automation.Tests
{
public class LocalWorkspaceTests
{
private static readonly string _dataDirectory =
Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, "Data");
private static readonly string _pulumiOrg = GetTestOrg();
private static string GetTestSuffix()
@ -55,7 +54,7 @@ namespace Pulumi.Automation.Tests
[InlineData("json")]
public async Task GetProjectSettings(string extension)
{
var workingDir = Path.Combine(_dataDirectory, extension);
var workingDir = ResourcePath(Path.Combine("Data", extension));
using var workspace = await LocalWorkspace.CreateAsync(new LocalWorkspaceOptions
{
WorkDir = workingDir,
@ -74,7 +73,7 @@ namespace Pulumi.Automation.Tests
[InlineData("json")]
public async Task GetStackSettings(string extension)
{
var workingDir = Path.Combine(_dataDirectory, extension);
var workingDir = ResourcePath(Path.Combine("Data", extension));
using var workspace = await LocalWorkspace.CreateAsync(new LocalWorkspaceOptions
{
WorkDir = workingDir,
@ -283,7 +282,7 @@ namespace Pulumi.Automation.Tests
public async Task StackLifecycleLocalProgram()
{
var stackName = $"{RandomStackName()}";
var workingDir = Path.Combine(_dataDirectory, "testproj");
var workingDir = ResourcePath(Path.Combine("Data", "testproj"));
using var stack = await LocalWorkspace.CreateStackAsync(new LocalProgramArgs(stackName, workingDir)
{
EnvironmentVariables = new Dictionary<string, string>()
@ -622,7 +621,7 @@ namespace Pulumi.Automation.Tests
}
static async Task<T> RunCommand<T, TOptions>(Func<TOptions, CancellationToken, Task<T>> func, string command)
where TOptions: UpdateOptions, new()
where TOptions : UpdateOptions, new()
{
var events = new List<EngineEvent>();
@ -908,7 +907,7 @@ namespace Pulumi.Automation.Tests
Assert.True(expSecretValue.IsSecret);
}
}
[Fact]
public async Task PulumiVersionTest()
{
@ -939,5 +938,55 @@ namespace Pulumi.Automation.Tests
LocalWorkspace.ValidatePulumiVersion(testMinVersion, currentVersion);
}
}
[Fact]
public async Task RespectsProjectSettingsTest()
{
var program = PulumiFn.Create<ValidStack>();
var stackName = $"{RandomStackName()}";
var projectName = "project_was_overwritten";
var workdir = ResourcePath(Path.Combine("Data", "correct_project"));
var stack = await LocalWorkspace.CreateStackAsync(
new InlineProgramArgs(projectName, stackName, program)
{
WorkDir = workdir
});
var settings = await stack.Workspace.GetProjectSettingsAsync();
Assert.Equal("correct_project", settings!.Name);
Assert.Equal("This is a description", settings.Description);
}
[Fact]
public async Task DetectsProjectSettingConflictTest()
{
var program = PulumiFn.Create<ValidStack>();
var stackName = $"{RandomStackName()}";
var projectName = "project_was_overwritten";
var workdir = ResourcePath(Path.Combine("Data", "correct_project"));
var projectSettings = ProjectSettings.Default(projectName);
projectSettings.Description = "non-standard description";
await Assert.ThrowsAsync<ProjectSettingsConflictException>(() =>
LocalWorkspace.CreateStackAsync(
new InlineProgramArgs(projectName, stackName, program)
{
WorkDir = workdir,
ProjectSettings = projectSettings
})
);
}
private string ResourcePath(string path, [CallerFilePath] string pathBase = "LocalWorkspaceTests.cs")
{
var dir = Path.GetDirectoryName(pathBase) ?? ".";
return Path.Combine(dir, path);
}
}
}

View file

@ -0,0 +1,58 @@
// Copyright 2016-2019, Pulumi Corporation
using System.Collections.Generic;
namespace Pulumi.Automation.Collections
{
/// Compares two dictionaries for equality by content, as F# maps would.
internal sealed class DictionaryContentsComparer<K, V> : IEqualityComparer<IDictionary<K, V>> where K : notnull
{
private readonly IEqualityComparer<K> _keyComparer;
private readonly IEqualityComparer<V> _valueComparer;
public DictionaryContentsComparer(IEqualityComparer<K> keyComparer, IEqualityComparer<V> valueComparer)
{
this._keyComparer = keyComparer;
this._valueComparer = valueComparer;
}
bool IEqualityComparer<IDictionary<K, V>>.Equals(IDictionary<K, V>? x, IDictionary<K, V>? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
if (x.Count != y.Count)
{
return false;
}
var y2 = new Dictionary<K, V>(y, this._keyComparer);
foreach (var pair in x)
{
if (!y2.ContainsKey(pair.Key))
{
return false;
}
if (!this._valueComparer.Equals(pair.Value, y2[pair.Key]))
{
return false;
}
}
return true;
}
int IEqualityComparer<IDictionary<K, V>>.GetHashCode(IDictionary<K, V> obj)
{
return 0; // inefficient but correct
}
}
}

View file

@ -0,0 +1,39 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
namespace Pulumi.Automation.Exceptions
{
/// <summary>
///
/// Thrown when creating a Workspace detects a conflict between
/// project settings found on disk (such as Pulumi.yaml) and a
/// ProjectSettings object passed to the Create API.
///
/// There are two resolutions:
///
/// (A) to use the ProjectSettings, delete the Pulumi.yaml file
/// from WorkDir or use a different WorkDir
///
/// (B) to use the exiting Pulumi.yaml from WorkDir, avoid
/// customizing the ProjectSettings
///
/// </summary>
public class ProjectSettingsConflictException : Exception
{
/// <summary>
///
/// FullPath of the Pulumi.yaml (or Pulumi.yml, Pulumi.json)
/// settings file found on disk.
///
/// </summary>
public string SettingsFileLocation { get; }
internal ProjectSettingsConflictException(string settingsFileLocation)
: base($"Custom {nameof(ProjectSettings)} passed in code conflict with settings found on disk: {settingsFileLocation}")
{
SettingsFileLocation = settingsFileLocation;
}
}
}

View file

@ -328,9 +328,10 @@ namespace Pulumi.Automation
readyTasks.Add(this.PopulatePulumiVersionAsync(cancellationToken));
// these are after working dir is set because they start immediately
if (options?.ProjectSettings != null)
readyTasks.Add(this.SaveProjectSettingsAsync(options.ProjectSettings, cancellationToken));
{
readyTasks.Add(this.InitializeProjectSettingsAsync(options.ProjectSettings, cancellationToken));
}
if (options?.StackSettings != null && options.StackSettings.Any())
{
@ -341,6 +342,26 @@ namespace Pulumi.Automation
this._readyTask = Task.WhenAll(readyTasks);
}
private async Task InitializeProjectSettingsAsync(ProjectSettings projectSettings,
CancellationToken cancellationToken)
{
// If given project settings, we want to write them out to
// the working dir. We do not want to override existing
// settings with default settings though.
var existingSettings = await this.GetProjectSettingsAsync(cancellationToken);
if (existingSettings == null)
{
await this.SaveProjectSettingsAsync(projectSettings, cancellationToken);
}
else if (!projectSettings.IsDefault &&
!ProjectSettings.Comparer.Equals(projectSettings, existingSettings))
{
var path = this.FindSettingsFile();
throw new Exceptions.ProjectSettingsConflictException(path);
}
}
private static readonly string[] SettingsExtensions = new string[] { ".yaml", ".yml", ".json" };
private async Task PopulatePulumiVersionAsync(CancellationToken cancellationToken)
@ -358,10 +379,12 @@ namespace Pulumi.Automation
internal static void ValidatePulumiVersion(SemVersion minVersion, SemVersion currentVersion)
{
if (minVersion.Major < currentVersion.Major) {
if (minVersion.Major < currentVersion.Major)
{
throw new InvalidOperationException($"Major version mismatch. You are using Pulumi CLI version {currentVersion} with Automation SDK v{minVersion.Major}. Please update the SDK.");
}
if (minVersion > currentVersion) {
if (minVersion > currentVersion)
{
throw new InvalidOperationException($"Minimum version requirement failed. The minimum CLI version requirement is {minVersion}, your current CLI version is {currentVersion}. Please update the Pulumi CLI.");
}
}
@ -369,41 +392,46 @@ namespace Pulumi.Automation
/// <inheritdoc/>
public override async Task<ProjectSettings?> GetProjectSettingsAsync(CancellationToken cancellationToken = default)
{
foreach (var ext in SettingsExtensions)
var path = this.FindSettingsFile();
var isJson = Path.GetExtension(path) == ".json";
if (!File.Exists(path))
{
return null;
}
var content = await File.ReadAllTextAsync(path, cancellationToken).ConfigureAwait(false);
if (isJson)
{
return this._serializer.DeserializeJson<ProjectSettings>(content);
}
else
{
var isJson = ext == ".json";
var path = Path.Combine(this.WorkDir, $"Pulumi{ext}");
if (!File.Exists(path))
continue;
var content = await File.ReadAllTextAsync(path, cancellationToken).ConfigureAwait(false);
if (isJson)
return this._serializer.DeserializeJson<ProjectSettings>(content);
var model = this._serializer.DeserializeYaml<ProjectSettingsModel>(content);
return model.Convert();
}
return null;
}
/// <inheritdoc/>
public override Task SaveProjectSettingsAsync(ProjectSettings settings, CancellationToken cancellationToken = default)
{
var foundExt = ".yaml";
var path = this.FindSettingsFile();
var ext = Path.GetExtension(path);
var content = ext == ".json" ? this._serializer.SerializeJson(settings) : this._serializer.SerializeYaml(settings);
return File.WriteAllTextAsync(path, content, cancellationToken);
}
private string FindSettingsFile()
{
foreach (var ext in SettingsExtensions)
{
var testPath = Path.Combine(this.WorkDir, $"Pulumi{ext}");
if (File.Exists(testPath))
{
foundExt = ext;
break;
return testPath;
}
}
var path = Path.Combine(this.WorkDir, $"Pulumi{foundExt}");
var content = foundExt == ".json" ? this._serializer.SerializeJson(settings) : this._serializer.SerializeYaml(settings);
return File.WriteAllTextAsync(path, content, cancellationToken);
var defaultPath = Path.Combine(this.WorkDir, "Pulumi.yaml");
return defaultPath;
}
private static string GetStackSettingsName(string stackName)
@ -498,8 +526,8 @@ namespace Pulumi.Automation
/// <inheritdoc/>
public override async Task SetConfigAsync(string stackName, IDictionary<string, ConfigValue> configMap, CancellationToken cancellationToken = default)
{
var args = new List<string>{"config", "set-all", "--stack", stackName};
foreach (var (key, value) in configMap)
var args = new List<string> { "config", "set-all", "--stack", stackName };
foreach (var (key, value) in configMap)
{
var secretArg = value.IsSecret ? "--secret" : "--plaintext";
args.Add(secretArg);
@ -524,7 +552,7 @@ namespace Pulumi.Automation
/// <inheritdoc/>
public override async Task RemoveConfigAsync(string stackName, IEnumerable<string> keys, CancellationToken cancellationToken = default)
{
var args = new List<string>{"config", "rm-all", "--stack", stackName};
var args = new List<string> { "config", "rm-all", "--stack", stackName };
args.AddRange(keys);
await this.RunCommandAsync(args, cancellationToken).ConfigureAwait(false);
}
@ -574,7 +602,7 @@ namespace Pulumi.Automation
var result = await this.RunCommandAsync(new[] { "stack", "ls", "--json" }, cancellationToken).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result.StandardOutput))
return ImmutableList<StackSummary>.Empty;
var stacks = this._serializer.DeserializeJson<List<StackSummary>>(result.StandardOutput);
return stacks.ToImmutableList();
}

View file

@ -1,5 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
namespace Pulumi.Automation
{
/// <summary>
@ -7,6 +10,36 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectBackend
{
internal static IEqualityComparer<ProjectBackend> Comparer { get; } = new ProjectBackendComparer();
public string? Url { get; set; }
private sealed class ProjectBackendComparer : IEqualityComparer<ProjectBackend>
{
bool IEqualityComparer<ProjectBackend>.Equals(ProjectBackend? x, ProjectBackend? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.Url == y.Url;
}
int IEqualityComparer<ProjectBackend>.GetHashCode(ProjectBackend obj)
{
return HashCode.Combine(obj.Url);
}
}
}
}

View file

@ -1,5 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
namespace Pulumi.Automation
{
/// <summary>
@ -7,6 +10,8 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectRuntime
{
internal static IEqualityComparer<ProjectRuntime> Comparer { get; } = new ProjectRuntimeComparer();
public ProjectRuntimeName Name { get; set; }
public ProjectRuntimeOptions? Options { get; set; }
@ -15,5 +20,36 @@ namespace Pulumi.Automation
{
this.Name = name;
}
private sealed class ProjectRuntimeComparer : IEqualityComparer<ProjectRuntime>
{
bool IEqualityComparer<ProjectRuntime>.Equals(ProjectRuntime? x, ProjectRuntime? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.Name == y.Name && ProjectRuntimeOptions.Comparer.Equals(x.Options, y.Options);
}
int IEqualityComparer<ProjectRuntime>.GetHashCode(ProjectRuntime obj)
{
return HashCode.Combine(
obj.Name,
obj.Options != null ? ProjectRuntimeOptions.Comparer.GetHashCode(obj.Options) : 0
);
}
}
}
}

View file

@ -1,5 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
namespace Pulumi.Automation
{
/// <summary>
@ -7,6 +10,8 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectRuntimeOptions
{
internal static IEqualityComparer<ProjectRuntimeOptions> Comparer { get; } = new ProjectRuntimeOptionsComparer();
/// <summary>
/// Applies to NodeJS projects only.
/// <para/>
@ -29,5 +34,33 @@ namespace Pulumi.Automation
/// A string that specifies the path to a virtual environment to use when running the program.
/// </summary>
public string? VirtualEnv { get; set; }
private sealed class ProjectRuntimeOptionsComparer : IEqualityComparer<ProjectRuntimeOptions>
{
bool IEqualityComparer<ProjectRuntimeOptions>.Equals(ProjectRuntimeOptions? x, ProjectRuntimeOptions? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.TypeScript == y.TypeScript && x.Binary == y.Binary && x.VirtualEnv == y.VirtualEnv;
}
int IEqualityComparer<ProjectRuntimeOptions>.GetHashCode(ProjectRuntimeOptions obj)
{
return HashCode.Combine(obj.TypeScript, obj.Binary, obj.VirtualEnv);
}
}
}
}

View file

@ -1,5 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
namespace Pulumi.Automation
{
/// <summary>
@ -7,6 +10,8 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectSettings
{
internal static IEqualityComparer<ProjectSettings> Comparer { get; } = new ProjectSettingsComparer();
public string Name { get; set; }
public ProjectRuntime Runtime { get; set; }
@ -44,5 +49,60 @@ namespace Pulumi.Automation
internal static ProjectSettings Default(string name)
=> new ProjectSettings(name, new ProjectRuntime(ProjectRuntimeName.NodeJS));
internal bool IsDefault
{
get
{
return ProjectSettings.Comparer.Equals(this, ProjectSettings.Default(this.Name));
}
}
private sealed class ProjectSettingsComparer : IEqualityComparer<ProjectSettings>
{
bool IEqualityComparer<ProjectSettings>.Equals(ProjectSettings? x, ProjectSettings? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.Name == y.Name &&
ProjectRuntime.Comparer.Equals(x.Runtime, y.Runtime) &&
x.Main == y.Main &&
x.Description == y.Description &&
x.Author == y.Author &&
x.Website == y.Website &&
x.License == y.License &&
x.Config == y.Config &&
ProjectTemplate.Comparer.Equals(x.Template, y.Template) &&
ProjectBackend.Comparer.Equals(x.Backend, y.Backend);
}
int IEqualityComparer<ProjectSettings>.GetHashCode(ProjectSettings obj)
{
// fields with custom Comparer skipped for efficiency
return HashCode.Combine(
obj.Name,
obj.Main,
obj.Description,
obj.Author,
obj.Website,
obj.License,
obj.Config,
obj.Backend
);
}
}
}
}

View file

@ -1,6 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
using Pulumi.Automation.Collections;
namespace Pulumi.Automation
{
@ -9,6 +11,8 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectTemplate
{
internal static IEqualityComparer<ProjectTemplate> Comparer { get; } = new ProjectTemplateComparer();
public string? Description { get; set; }
public string? QuickStart { get; set; }
@ -16,5 +20,43 @@ namespace Pulumi.Automation
public IDictionary<string, ProjectTemplateConfigValue>? Config { get; set; }
public bool? Important { get; set; }
private sealed class ProjectTemplateComparer : IEqualityComparer<ProjectTemplate>
{
private IEqualityComparer<IDictionary<string, ProjectTemplateConfigValue>> _configComparer =
new DictionaryContentsComparer<string, ProjectTemplateConfigValue>(
EqualityComparer<string>.Default,
ProjectTemplateConfigValue.Comparer);
bool IEqualityComparer<ProjectTemplate>.Equals(ProjectTemplate? x, ProjectTemplate? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.Description == y.Description
&& x.QuickStart == y.QuickStart
&& x.Important == y.Important
&& _configComparer.Equals(x.Config, y.Config);
}
int IEqualityComparer<ProjectTemplate>.GetHashCode(ProjectTemplate obj)
{
// omit hashing Config dict for efficiency
return HashCode.Combine(obj.Description, obj.QuickStart, obj.Important);
}
}
}
}

View file

@ -1,5 +1,8 @@
// Copyright 2016-2021, Pulumi Corporation
using System;
using System.Collections.Generic;
namespace Pulumi.Automation
{
/// <summary>
@ -7,10 +10,40 @@ namespace Pulumi.Automation
/// </summary>
public class ProjectTemplateConfigValue
{
internal static IEqualityComparer<ProjectTemplateConfigValue> Comparer { get; } = new ProjectTemplateConfigValueComparer();
public string? Description { get; set; }
public string? Default { get; set; }
public bool? Secret { get; set; }
private sealed class ProjectTemplateConfigValueComparer : IEqualityComparer<ProjectTemplateConfigValue>
{
bool IEqualityComparer<ProjectTemplateConfigValue>.Equals(ProjectTemplateConfigValue? x, ProjectTemplateConfigValue? y)
{
if (x == null)
{
return y == null;
}
if (y == null)
{
return x == null;
}
if (ReferenceEquals(x, y))
{
return true;
}
return x.Description == y.Description && x.Default == y.Default && x.Secret == y.Secret;
}
int IEqualityComparer<ProjectTemplateConfigValue>.GetHashCode(ProjectTemplateConfigValue obj)
{
return HashCode.Combine(obj.Description, obj.Default, obj.Secret);
}
}
}
}

View file

@ -429,3 +429,5 @@ static Pulumi.Automation.WorkspaceStack.CreateOrSelectAsync(string name, Pulumi.
static Pulumi.Automation.WorkspaceStack.SelectAsync(string name, Pulumi.Automation.Workspace workspace, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Pulumi.Automation.WorkspaceStack>
virtual Pulumi.Automation.Workspace.Dispose() -> void
virtual Pulumi.Automation.Workspace.GetStackAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Pulumi.Automation.StackSummary>
Pulumi.Automation.Exceptions.ProjectSettingsConflictException
Pulumi.Automation.Exceptions.ProjectSettingsConflictException.SettingsFileLocation.get -> string

View file

@ -4,6 +4,9 @@
<name>Pulumi.Automation</name>
</assembly>
<members>
<member name="T:Pulumi.Automation.Collections.DictionaryContentsComparer`2">
Compares two dictionaries for equality by content, as F# maps would.
</member>
<member name="T:Pulumi.Automation.DestroyOptions">
<summary>
Options controlling the behavior of an <see cref="M:Pulumi.Automation.WorkspaceStack.DestroyAsync(Pulumi.Automation.DestroyOptions,System.Threading.CancellationToken)"/> operation.
@ -274,6 +277,31 @@
PolicyPacks run during update. Maps PolicyPackName -> version.
</summary>
</member>
<member name="T:Pulumi.Automation.Exceptions.ProjectSettingsConflictException">
<summary>
Thrown when creating a Workspace detects a conflict between
project settings found on disk (such as Pulumi.yaml) and a
ProjectSettings object passed to the Create API.
There are two resolutions:
(A) to use the ProjectSettings, delete the Pulumi.yaml file
from WorkDir or use a different WorkDir
(B) to use the exiting Pulumi.yaml from WorkDir, avoid
customizing the ProjectSettings
</summary>
</member>
<member name="P:Pulumi.Automation.Exceptions.ProjectSettingsConflictException.SettingsFileLocation">
<summary>
FullPath of the Pulumi.yaml (or Pulumi.yml, Pulumi.json)
settings file found on disk.
</summary>
</member>
<member name="T:Pulumi.Automation.HistoryOptions">
<summary>
Options controlling the behavior of a <see cref="M:Pulumi.Automation.WorkspaceStack.GetHistoryAsync(Pulumi.Automation.HistoryOptions,System.Threading.CancellationToken)"/> operation.

View file

@ -77,3 +77,23 @@ $ pulumi config set aws:region us-west-2
```
And finally, preview and update as you would any other Pulumi project.
## Public API Changes
When making changes to the code you may get the following compilation
error:
```
error RS0016: Symbol XYZ' is not part of the declared API.
```
This indicates a change in public API. If you are developing a change
and this is intentional, add the new API elements to
`PublicAPI.Unshipped.txt` corresponding to your project (some IDEs
will do this automatically for you, but manual additions are fine as
well).
Project maintainers will move API elements from
`PublicAPI.Unshipped.txt` to `PublicAPI.Shipped.txt` when cutting a
release.

View file

@ -8,6 +8,7 @@ require (
github.com/cheggaaa/pb v1.0.18
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
github.com/djherbis/times v1.2.0
github.com/fatih/color v1.9.0 // indirect
github.com/gofrs/flock v0.7.1
github.com/gofrs/uuid v3.3.0+incompatible
github.com/gogo/protobuf v1.3.1 // indirect
@ -18,24 +19,24 @@ require (
github.com/hashicorp/go-multierror v1.0.0
github.com/kr/pretty v0.2.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-colorable v0.1.6 // indirect
github.com/mattn/go-runewidth v0.0.8 // indirect
github.com/mitchellh/go-ps v1.0.0
github.com/nxadm/tail v1.4.8
github.com/opentracing/basictracer-go v1.0.0 // indirect
github.com/opentracing/opentracing-go v1.1.0
github.com/pkg/errors v0.9.1
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94
github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94
github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/cast v1.3.1
github.com/spf13/cobra v1.0.0
github.com/stretchr/testify v1.7.0
github.com/stretchr/testify v1.6.1
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6
github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7
github.com/uber/jaeger-client-go v2.22.1+incompatible
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
go.uber.org/atomic v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/mod v0.3.0
golang.org/x/net v0.0.0-20200602114024-627f9648deb9

View file

@ -67,10 +67,11 @@ github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELB
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@ -83,14 +84,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc=
@ -173,12 +166,13 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
@ -226,8 +220,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzr
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94 h1:Htsu46DUlRauQVuY0qXQWwGMkuGvc9PReS60kNYPuzE=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94/go.mod h1:gY5v736YyqzhcB0WcDSX4ePCUM90DU88xiH4gQ/ZcXo=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
@ -268,8 +260,8 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
@ -304,8 +296,8 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 h1:TjszyFsQsyZNHwdVdZ5m7bjmreu0znc2kRYsEml9/Ww=
golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4 h1:c2HOrn5iMezYjSlGPncknSEr/8x5LELb/ilJbXi9DEA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -345,10 +337,12 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -374,9 +368,8 @@ golang.org/x/tools v0.0.0-20200608174601-1b747fd94509 h1:MI14dOfl3OG6Zd32w3ugsrv
golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=

View file

@ -18,7 +18,7 @@ import (
"encoding/json"
"path/filepath"
"github.com/pulumi/go-yaml"
yaml "gopkg.in/yaml.v2"
)
var JSONExt = ".json"

View file

@ -13,7 +13,7 @@ require (
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/pkg/errors v0.9.1
github.com/pulumi/pulumi-random/sdk/v2 v2.4.2
github.com/pulumi/pulumi/pkg/v2 v2.22.0
github.com/pulumi/pulumi/sdk/v2 v2.24.0
github.com/stretchr/testify v1.7.0
github.com/pulumi/pulumi/pkg/v2 v2.0.0
github.com/pulumi/pulumi/sdk/v2 v2.24.1
github.com/stretchr/testify v1.6.1
)

View file

@ -214,8 +214,8 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
@ -259,9 +259,8 @@ github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8c
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
@ -492,12 +491,14 @@ github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDe
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI=
github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
@ -583,8 +584,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzr
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94 h1:Htsu46DUlRauQVuY0qXQWwGMkuGvc9PReS60kNYPuzE=
github.com/pulumi/go-yaml v1.8.10-0.20210311214047-95da20da6e94/go.mod h1:gY5v736YyqzhcB0WcDSX4ePCUM90DU88xiH4gQ/ZcXo=
github.com/pulumi/pulumi-random/sdk/v2 v2.4.2 h1:c6UyC/SIx0vV1tVdJKjBYM89wLj1BWARIFEQlSrmtBU=
github.com/pulumi/pulumi-random/sdk/v2 v2.4.2/go.mod h1:PPzzdlKYXLuBjcl6T4FvvQgKBntKa9gMbZtgslBlVHc=
github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8=
@ -646,9 +645,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E=
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
@ -717,6 +715,7 @@ golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=