List <string> MatchingFiles(string currentDirectory, string target) { var files = fileSystem.EnumerateFilesWithGlob(currentDirectory, target).Select(Path.GetFullPath).ToList(); foreach (var path in variables.GetStrings(ActionVariables.AdditionalPaths).Where(s => !string.IsNullOrWhiteSpace(s))) { var pathFiles = fileSystem.EnumerateFilesWithGlob(path, target).Select(Path.GetFullPath); files.AddRange(pathFiles); } return(files); }
private List <string> MatchingFiles(RunningDeployment deployment, string target) { var files = fileSystem.EnumerateFilesWithGlob(deployment.CurrentDirectory, target).Select(Path.GetFullPath).ToList(); foreach (var path in deployment.Variables.GetStrings(SpecialVariables.Action.AdditionalPaths).Where(s => !string.IsNullOrWhiteSpace(s))) { var pathFiles = fileSystem.EnumerateFilesWithGlob(path, target).Select(Path.GetFullPath); files.AddRange(pathFiles); } return(files); }
public void ShouldFindAndCallModifyOnTargetFile() { fileSystem.EnumerateFilesWithGlob(Arg.Any <string>(), "appsettings.environment.json") .Returns(new[] { TestEnvironment.ConstructRootedPath("applications", "Acme", "1.0.0", "appsettings.environment.json") }); deployment.Variables.Set(SpecialVariables.Package.JsonConfigurationVariablesEnabled, "true"); deployment.Variables.Set(SpecialVariables.Package.JsonConfigurationVariablesTargets, "appsettings.environment.json"); var convention = new JsonConfigurationVariablesConvention(configurationVariableReplacer, fileSystem); convention.Install(deployment); configurationVariableReplacer.Received().ModifyJsonFile(TestEnvironment.ConstructRootedPath("applications", "Acme", "1.0.0", "appsettings.environment.json"), deployment.Variables); }
/// <summary> /// Uploads multiple files given the globbing patterns provided by the selection properties. /// </summary> /// <param name="clientFactory"></param> /// <param name="deployment"></param> /// <param name="selection"></param> private IEnumerable <S3UploadResult> UploadMultiFileSelection(Func <AmazonS3Client> clientFactory, RunningDeployment deployment, S3MultiFileSelectionProperties selection) { Guard.NotNull(deployment, "Deployment may not be null"); Guard.NotNull(selection, "Mutli file selection properties may not be null"); Guard.NotNull(clientFactory, "Client factory must not be null"); var files = fileSystem.EnumerateFilesWithGlob(deployment.StagingDirectory, selection.Pattern).ToList(); if (!files.Any()) { Log.Info($"The glob pattern '{selection.Pattern}' didn't match any files. Nothing was uploaded to S3."); yield break; } Log.Info($"Glob pattern '{selection.Pattern}' matched {files.Count} files."); var substitutionPatterns = selection.VariableSubstitutionPatterns?.Split(new[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) ?? new string[0]; new SubstituteInFilesConvention(fileSystem, fileSubstituter, _ => substitutionPatterns.Any(), _ => substitutionPatterns) .Install(deployment); foreach (var matchedFile in files) { yield return(CreateRequest(matchedFile, GetBucketKey(fileSystem, matchedFile, new S3MultiFileSelectionBucketKeyAdapter(selection)), selection) .Tee(x => LogPutObjectRequest(matchedFile, x)) //We only warn on multi file uploads .Map(x => HandleUploadRequest(clientFactory(), x, WarnAndIgnoreException))); } }
/// <summary> /// Uploads multiple files given the globbing patterns provided by the selection properties. /// </summary> /// <param name="clientFactory"></param> /// <param name="deployment"></param> /// <param name="selection"></param> private async Task <IEnumerable <S3UploadResult> > UploadMultiFileSelection(Func <AmazonS3Client> clientFactory, RunningDeployment deployment, S3MultiFileSelectionProperties selection) { Guard.NotNull(deployment, "Deployment may not be null"); Guard.NotNull(selection, "Multi file selection properties may not be null"); Guard.NotNull(clientFactory, "Client factory must not be null"); var results = new List <S3UploadResult>(); var files = new RelativeGlobber((@base, pattern) => fileSystem.EnumerateFilesWithGlob(@base, pattern), deployment.StagingDirectory).EnumerateFilesWithGlob(selection.Pattern).ToList(); if (!files.Any()) { Log.Info($"The glob pattern '{selection.Pattern}' didn't match any files. Nothing was uploaded to S3."); return(results); } Log.Info($"Glob pattern '{selection.Pattern}' matched {files.Count} files"); var substitutionPatterns = selection.VariableSubstitutionPatterns?.Split(new[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) ?? new string[0]; new SubstituteInFilesConvention(fileSystem, fileSubstituter, _ => substitutionPatterns.Any(), _ => substitutionPatterns) .Install(deployment); foreach (var matchedFile in files) { var request = CreateRequest(matchedFile.FilePath, () => $"{selection.BucketKeyPrefix}{matchedFile.MappedRelativePath}", selection); LogPutObjectRequest(matchedFile.FilePath, request); results.Add(await HandleUploadRequest(clientFactory(), request, WarnAndIgnoreException)); } return(results); }
private IEnumerable <string> AdditionalValuesFiles(RunningDeployment deployment) { var variables = deployment.Variables; var packageReferenceNames = variables.GetIndexes(Deployment.SpecialVariables.Packages.PackageCollection); foreach (var packageReferenceName in packageReferenceNames) { var sanitizedPackageReferenceName = fileSystem.RemoveInvalidFileNameChars(packageReferenceName); var paths = variables.GetPaths(SpecialVariables.Helm.Packages.ValuesFilePath(packageReferenceName)); foreach (var providedPath in paths) { var packageId = variables.Get(Deployment.SpecialVariables.Packages.PackageId(packageReferenceName)); var version = variables.Get(Deployment.SpecialVariables.Packages.PackageVersion(packageReferenceName)); var relativePath = Path.Combine(sanitizedPackageReferenceName, providedPath); var files = fileSystem.EnumerateFilesWithGlob(deployment.CurrentDirectory, relativePath).ToList(); if (!files.Any()) { throw new CommandException($"Unable to find file `{providedPath}` for package {packageId} v{version}"); } foreach (var file in files) { var relative = file.Substring(Path.Combine(deployment.CurrentDirectory, sanitizedPackageReferenceName).Length); Log.Info($"Including values file `{relative}` from package {packageId} v{version}"); yield return(Path.GetFullPath(file)); } } } }
IEnumerable <string> AdditionalValuesFiles(RunningDeployment deployment) { var variables = deployment.Variables; var packageReferenceNames = variables.GetIndexes(PackageVariables.PackageCollection); foreach (var packageReferenceName in packageReferenceNames) { var sanitizedPackageReferenceName = fileSystem.RemoveInvalidFileNameChars(packageReferenceName); var paths = variables.GetPaths(SpecialVariables.Helm.Packages.ValuesFilePath(packageReferenceName)); foreach (var providedPath in paths) { var packageId = variables.Get(PackageVariables.IndexedPackageId(packageReferenceName)); var version = variables.Get(PackageVariables.IndexedPackageVersion(packageReferenceName)); var relativePath = Path.Combine(sanitizedPackageReferenceName, providedPath); var files = fileSystem.EnumerateFilesWithGlob(deployment.CurrentDirectory, relativePath).ToList(); if (!files.Any() && string.IsNullOrEmpty(packageReferenceName)) // Chart archives have chart name root directory { log.Verbose($"Unable to find values files at path `{providedPath}`. " + $"Chart package contains root directory with chart name, so looking for values in there."); var chartRelativePath = Path.Combine(fileSystem.RemoveInvalidFileNameChars(packageId), relativePath); files = fileSystem.EnumerateFilesWithGlob(deployment.CurrentDirectory, chartRelativePath).ToList(); } if (!files.Any()) { throw new CommandException($"Unable to find file `{providedPath}` for package {packageId} v{version}"); } foreach (var file in files) { var relative = file.Substring(Path.Combine(deployment.CurrentDirectory, sanitizedPackageReferenceName).Length); log.Info($"Including values file `{relative}` from package {packageId} v{version}"); yield return(Path.GetFullPath(file)); } } } }
public void ShouldPerformSubstitutions() { string glob = "**\\*config.json"; string actualMatch = "config.json"; fileSystem.EnumerateFilesWithGlob(StagingDirectory, glob).Returns(new[] { Path.Combine(StagingDirectory, actualMatch) }); variables.Set(SpecialVariables.Package.SubstituteInFilesTargets, glob); variables.Set(SpecialVariables.Package.SubstituteInFilesEnabled, true.ToString()); CreateConvention().Install(deployment); substituter.Received().PerformSubstitution(Path.Combine(StagingDirectory, actualMatch), variables); }
/// <summary> /// Uploads multiple files given the globbing patterns provided by the selection properties. /// </summary> /// <param name="clientFactory"></param> /// <param name="deployment"></param> /// <param name="selection"></param> private async Task <IEnumerable <S3UploadResult> > UploadMultiFileSelection(Func <AmazonS3Client> clientFactory, RunningDeployment deployment, S3MultiFileSelectionProperties selection) { Guard.NotNull(deployment, "Deployment may not be null"); Guard.NotNull(selection, "Multi file selection properties may not be null"); Guard.NotNull(clientFactory, "Client factory must not be null"); var results = new List <S3UploadResult>(); var files = new RelativeGlobber((@base, pattern) => fileSystem.EnumerateFilesWithGlob(@base, pattern), deployment.StagingDirectory).EnumerateFilesWithGlob(selection.Pattern).ToList(); if (!files.Any()) { Log.Info($"The glob pattern '{selection.Pattern}' didn't match any files. Nothing was uploaded to S3."); return(results); } Log.Info($"Glob pattern '{selection.Pattern}' matched {files.Count} files"); var substitutionPatterns = SplitFilePatternString(selection.VariableSubstitutionPatterns); if (substitutionPatterns.Any()) { substituteInFiles.Substitute(deployment.CurrentDirectory, substitutionPatterns); } var structuredSubstitutionPatterns = SplitFilePatternString(selection.StructuredVariableSubstitutionPatterns); if (structuredSubstitutionPatterns.Any()) { structuredConfigVariablesService.ReplaceVariables(deployment.CurrentDirectory, structuredSubstitutionPatterns.ToList()); } foreach (var matchedFile in files) { var request = CreateRequest(matchedFile.FilePath, $"{selection.BucketKeyPrefix}{matchedFile.MappedRelativePath}", selection); LogPutObjectRequest(matchedFile.FilePath, request); results.Add(await HandleUploadRequest(clientFactory(), request, WarnAndIgnoreException)); } return(results); }