예제 #1
0
        protected override async Task <CmdResult> RunRawAsyncImpl(CliString arguments, string?standardInput, CancellationToken cancellationToken)
        {
            var consulIsRunning = SysProcess.GetProcesses()
                                  .Any(p => p.ProcessName == "consul" || p.ProcessName == "consul.exe");
            var now = DateTimeOffset.Now;

            if (consulIsRunning)
            {
                return(new CmdResult(null !, 0, now, now, "Consul service is already running."));
            }

            var targetCmd = TargetCmdFactory.Invoke();

            // If the repo w/ Consul is supposed to be fetched, it is fetched at this point
            targetCmd.EchoMode         = EchoMode;
            targetCmd.ResultValidation = ResultValidation;
            var consulTask    = targetCmd.RunRawAsync(arguments, standardInput, cancellationToken);
            var completedTask = await Task.WhenAny(consulTask, Task.Delay(CheckDelay, cancellationToken));

            if (completedTask == consulTask)
            {
                return(await consulTask);
            }
            return(new CmdResult(null !, 0, now, now, "Consul service seems to be started successfully."));
        }
예제 #2
0
        public void ListTest()
        {
            var actual = CliFormatter.Format(new Arguments {
                Flags = new CliList <string> {
                    "x", "yy"
                }
            });
            var q1 = CliString.Quote("x"); // Depends on OS, so can't use " or '
            var q2 = CliString.Quote("yy");

            actual.Value.Should().Be($"-flag {q1} -flag {q2}");
        }
예제 #3
0
        public async Task <CmdResult> InitAsync(
            CliString dir                       = default,
            InitArguments?arguments             = null,
            CancellationToken cancellationToken = default)
        {
            // A workaround for this issue:
            // https://github.com/hashicorp/terraform/issues/21393
            var oldEnv = EnvironmentVariables;

            EnvironmentVariables = oldEnv.SetItem("TF_WORKSPACE", "default");
            try {
                return(await RunRawAsync("init", arguments ?? new InitArguments(), dir, cancellationToken)
                       .ConfigureAwait(false));
            }
            finally {
                EnvironmentVariables = oldEnv;
            }
        }
예제 #4
0
        public async Task FormatterMockTest()
        {
            var formatter     = new Mock <ICliFormatter>();
            var terraformEcho = new TerraformCmd {
                EchoMode     = true,
                CliFormatter = formatter.Object
            };

            var applyArguments     = new ApplyArguments();
            var formattedArguments = CliString.New("arguments");

            formatter
            .Setup(x => x.Format(It.IsAny <object>(), It.IsAny <CliArgumentAttribute>()))
            .Returns(formattedArguments);
            var dir = "dir";

            var result = (await terraformEcho.ApplyAsync(dir, arguments: applyArguments)).StandardOutput.Trim();

            result.Should().Be(terraformEcho + " apply arguments dir");
            formatter.Verify(x => x.Format(applyArguments, It.IsAny <CliArgumentAttribute>()));
        }
예제 #5
0
        public async Task FetchAsync(CancellationToken cancellationToken = default)
        {
            using var _ = await FileLock
                          .LockAsync(TargetPath + ".lock", cancellationToken)
                          .ConfigureAwait(false);

            async Task TryAsync()
            {
                var git = GitCmdFactory.Invoke();

                git.ResultValidation = CommandResultValidation.ZeroExitCode;

                var gitFolder = TargetPath & ".git";

                if (!Directory.Exists(gitFolder))
                {
                    if (!Directory.Exists(TargetPath))
                    {
                        Directory.CreateDirectory(TargetPath);
                    }
                    git.WorkingDirectory = ""; // It has to be non-target path on cloning
                    await git
                    .RunAsync("clone" + CliString.Quote(SourceUrl) + CliString.Quote(TargetPath), cancellationToken)
                    .ConfigureAwait(false);

                    git.WorkingDirectory = TargetPath;
                    await git
                    .RunAsync("checkout" + new CliString(SourceRevision), cancellationToken)
                    .ConfigureAwait(false);
                }
                else
                {
                    git.WorkingDirectory = TargetPath;
                    var mustFetch = AlwaysFetch;
                    if (!AlwaysFetch)
                    {
                        using (git.ChangeResultValidation(0)) {
                            var r = await git
                                    .RunAsync("rev-parse --short=10 HEAD", cancellationToken)
                                    .ConfigureAwait(false);

                            mustFetch |= r.ExitCode != 0;
                            mustFetch |= r.StandardOutput.Trim() != SourceRevision;
                        }
                    }
                    if (mustFetch)
                    {
                        await git
                        .RunAsync("reset --hard HEAD", cancellationToken)
                        .ConfigureAwait(false);

                        await git
                        .RunAsync("fetch origin", cancellationToken)
                        .ConfigureAwait(false);

                        await git
                        .RunAsync("checkout" + new CliString(SourceRevision), cancellationToken)
                        .ConfigureAwait(false);
                    }
                }
            }

            try {
                await TryAsync().ConfigureAwait(false);
            }
            catch (CommandExecutionException e) {
                if (!e.Message.Contains("non-zero exit code"))
                {
                    throw;
                }
                Directory.Delete(TargetPath, true);
                await TryAsync().ConfigureAwait(false);
            }
        }
예제 #6
0
 public Task <CmdResult> WorkspaceListAsync(
     CliString dirName = default,
     CancellationToken cancellationToken = default)
 => RunRawAsync("workspace list", null, dirName, cancellationToken);
예제 #7
0
 public Task <CmdResult> WorkspaceSelectAsync(
     CliString workspaceName,
     CliString dirName = default,
     CancellationToken cancellationToken = default)
 => RunRawAsync("workspace select", null, workspaceName + dirName, cancellationToken);
예제 #8
0
 public Task <CmdResult> WorkspaceDeleteAsync(
     CliString workspaceName,
     CliString dirName = default,
     WorkspaceDeleteArguments?arguments  = null,
     CancellationToken cancellationToken = default)
 => RunRawAsync("workspace delete", arguments ?? new WorkspaceDeleteArguments(), workspaceName + dirName, cancellationToken);
예제 #9
0
 public Task <CmdResult> DestroyAsync(
     CliString dir = default,
     DestroyArguments?arguments          = null,
     CancellationToken cancellationToken = default)
 => RunRawAsync("destroy", arguments ?? new DestroyArguments(), dir, cancellationToken);
예제 #10
0
 public Task <CmdResult> FmtAsync(
     CliString dir          = default,
     FmtArguments?arguments = null,
     CancellationToken cancellationToken = default)
 => RunRawAsync("fmt", arguments ?? new FmtArguments(), dir, cancellationToken);
예제 #11
0
 public Task <CmdResult> ApplyAsync(
     CliString dir                       = default,
     ApplyArguments?arguments            = null,
     CancellationToken cancellationToken = default)
 => RunRawAsync("apply", arguments ?? new ApplyArguments(), dir, cancellationToken);