public void Build(Hapi.Chart.Chart chart, Stream stream) { if (chart == null) { throw new ArgumentNullException(nameof(chart)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanWrite) { throw new ArgumentOutOfRangeException(nameof(stream), "The stream must be writeable"); } if (stream.CanSeek) { // Clear out the stream. stream.SetLength(0); } using (var gzipStream = new GZipStream(stream, CompressionMode.Compress, leaveOpen: true)) using (var writer = new TarWriter(gzipStream, new WriterOptions(CompressionType.None) { LeaveStreamOpen = true })) { var chartName = chart.Metadata.Name; this.WriteObject(writer, $"{chartName}/Chart.yaml", chart.Metadata); if (!string.IsNullOrWhiteSpace(chart.Values.Raw)) { this.WriteString(writer, $"{chartName}/values.yaml", chart.Values.Raw); } foreach (var template in chart.Templates) { if (!template.Name.StartsWith($"templates/")) { throw new InvalidOperationException($"The name of the template {template.Name} must start with templates/."); } this.WriteByteString(writer, $"{chartName}/{template.Name}", template.Data); } foreach (var file in chart.Files) { this.WriteByteString(writer, $"{chartName}/{file.TypeUrl}", file.Value); } } }
public Hapi.Chart.Chart Serialize() { var chart = new Hapi.Chart.Chart(); chart.Metadata = this.Metadata; this.stream.Seek(0, SeekOrigin.Begin); using (var gzipStream = new GZipStream(this.stream, CompressionMode.Decompress, leaveOpen: true)) using (var reader = TarReader.Open(gzipStream, new ReaderOptions() { LeaveStreamOpen = true })) { while (reader.MoveToNextEntry()) { if (this.IsTemplate(reader.Entry.Key)) { using (Stream entryStream = reader.OpenEntryStream()) { var template = new Hapi.Chart.Template() { Data = ByteString.FromStream(entryStream), Name = Normalize(reader.Entry.Key).Substring(this.directoryName.Length + 1) }; chart.Templates.Add(template); } } else if (this.IsValues(reader.Entry.Key)) { using (Stream entryStream = reader.OpenEntryStream()) using (StreamReader entryReader = new StreamReader(entryStream)) { chart.Values = new Hapi.Chart.Config() { Raw = entryReader.ReadToEnd() }; } } else if (!this.IsTemplate(reader.Entry.Key) && !this.IsMetadata(reader.Entry.Key) && !this.IsValues(reader.Entry.Key)) { // TODO: respect .helmignore using (Stream entryStream = reader.OpenEntryStream()) { chart.Files.Add(new Any() { TypeUrl = Normalize(reader.Entry.Key).Substring(this.directoryName.Length + 1), Value = ByteString.FromStream(entryStream) }); } } } } // Dependencies are currently not supported // chart.Dependencies.Add(); return(chart); }