Ejemplo n.º 1
0
        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);
                    }
                }
        }
Ejemplo n.º 2
0
        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);
        }