private async Task <IReadOnlyCollection <DeployCommand.Types.Secret> > GetServiceSecrets( ServiceConfiguration service, SecretsResponse existingAppSecrets ) { if (!service.Secrets.Any()) { return(new List <DeployCommand.Types.Secret>()); } var secrets = service.Secrets.Select(secret => new DeployCommand.Types.Secret { Name = secret }).ToList(); var existingServiceSecretNames = (existingAppSecrets.Services .SingleOrDefault(s => s.Name == service.Name) ?.Secrets ?? new RepeatedField <SecretsResponse.Types.Secret>()) .Select(s => s.Name) .ToHashSet(); foreach (var secret in secrets) { var secretAlreadyExists = existingServiceSecretNames.Contains(secret.Name); if (args.UpdateSecretValues || !secretAlreadyExists) { await Console.Out.WriteLineAsync( $"Please enter a value for the {secret.Name} secret for service {service.Name}" + (secretAlreadyExists ? " (leave blank to keep existing value unchanged)" : "") + ":" ); var value = await Console.In.ReadLineAsync(); var isValid = secretAlreadyExists || !string.IsNullOrEmpty(value); while (!isValid) { await Console.Out.WriteLineAsync( $"Value for secret {secret.Name} must not be empty. Please enter a value again: " ); value = await Console.In.ReadLineAsync(); isValid = !string.IsNullOrEmpty(value); } secret.Value = string.IsNullOrEmpty(value) ? null : value; } } return(secrets); }
public void GetSecrets_ValidData(string secretString) { var secretsResponse = new SecretsResponse { Data = new SecretData { Value = Encoding.UTF8.GetBytes(secretString) } }; var secrets = secretsResponse.GetSecrets(); secrets.Length.Should().Be(5); secrets.Should().BeEquivalentTo("secret1", "secret2", "secret3", "secret4", "secret5"); }
private async Task <DeployCommand.Types.Service> ProcessService( ServiceConfiguration service, string applicationName, string configFileDirectory, SecretsResponse existingAppSecrets, int deploymentVersion ) { output.Verbose($"Processing service '{service.Name}' ..."); string dockerImage = null; var isPublicDockerImage = false; if (service.SpecifiesTemplate) { dockerImage = await BuildDockerImageFromTemplate( service, applicationName, configFileDirectory, deploymentVersion ); } else if (service.SpecifiesDockerfile) { dockerImage = await BuildDockerImageFromDockerfile( service, applicationName, configFileDirectory, deploymentVersion ); } else if (service.SpecifiesDockerImage) { dockerImage = service.DockerImage; isPublicDockerImage = true; } output.Verbose($"Successfully processed '{service.Name}'."); return(new DeployCommand.Types.Service { Name = service.Name, DockerImage = dockerImage, IsPublicDockerImage = isPublicDockerImage, HttpPort = service.HttpPort, TcpPorts = { service.TcpPorts }, UdpPorts = { service.UdpPorts }, Replicas = service.Replicas, PersistentStoragePath = service.PersistentStoragePath, EnvironmentVariables = { service.EnvironmentVariables.Select(pair => new DeployCommand.Types.EnvironmentVariable { Name = pair.Key, Value = pair.Value, }) }, Secrets = { await GetServiceSecrets(service, existingAppSecrets), }, }); }