summaryrefslogtreecommitdiff
path: root/app/services/packages/helm/extract_file_metadata_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/packages/helm/extract_file_metadata_service.rb')
-rw-r--r--app/services/packages/helm/extract_file_metadata_service.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/app/services/packages/helm/extract_file_metadata_service.rb b/app/services/packages/helm/extract_file_metadata_service.rb
new file mode 100644
index 00000000000..e7373d8ea8f
--- /dev/null
+++ b/app/services/packages/helm/extract_file_metadata_service.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'rubygems/package'
+
+module Packages
+ module Helm
+ class ExtractFileMetadataService
+ ExtractionError = Class.new(StandardError)
+
+ def initialize(package_file)
+ @package_file = package_file
+ end
+
+ def execute
+ raise ExtractionError, 'invalid package file' unless valid_package_file?
+
+ metadata
+ end
+
+ private
+
+ def valid_package_file?
+ @package_file &&
+ @package_file.package&.helm? &&
+ @package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate
+ end
+
+ def metadata
+ YAML.safe_load(chart_yaml_content)
+ rescue Psych::Exception => e
+ raise ExtractionError, "Error while parsing Chart.yaml: #{e.message}"
+ end
+
+ def chart_yaml_content
+ @package_file.file.use_open_file do |file|
+ tar_reader = Gem::Package::TarReader.new(Zlib::GzipReader.new(file))
+
+ chart_yaml = tar_reader.find do |entry|
+ next unless entry.file?
+
+ entry.full_name.end_with?('/Chart.yaml')
+ end
+
+ raise ExtractionError, 'Chart.yaml not found within a directory' unless chart_yaml
+
+ chart_yaml.read
+ ensure
+ tar_reader.close
+ end
+ end
+ end
+ end
+end