Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/trace/remote_checksum.rb')
-rw-r--r--lib/gitlab/ci/trace/remote_checksum.rb75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/gitlab/ci/trace/remote_checksum.rb b/lib/gitlab/ci/trace/remote_checksum.rb
new file mode 100644
index 00000000000..d57f3888ec0
--- /dev/null
+++ b/lib/gitlab/ci/trace/remote_checksum.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class Trace
+ ##
+ # RemoteChecksum class is responsible for fetching the MD5 checksum of
+ # an uploaded build trace.
+ #
+ class RemoteChecksum
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(trace_artifact)
+ @trace_artifact = trace_artifact
+ end
+
+ def md5_checksum
+ strong_memoize(:md5_checksum) do
+ fetch_md5_checksum
+ end
+ end
+
+ private
+
+ attr_reader :trace_artifact
+ delegate :aws?, :google?, to: :object_store_config, prefix: :provider
+
+ def fetch_md5_checksum
+ return unless Feature.enabled?(:ci_archived_build_trace_checksum, trace_artifact.project, default_enabled: :yaml)
+ return unless object_store_config.enabled?
+ return if trace_artifact.local_store?
+
+ remote_checksum_value
+ end
+
+ def remote_checksum_value
+ strong_memoize(:remote_checksum_value) do
+ if provider_google?
+ checksum_from_google
+ elsif provider_aws?
+ checksum_from_aws
+ end
+ end
+ end
+
+ def object_store_config
+ strong_memoize(:object_store_config) do
+ trace_artifact.file.class.object_store_config
+ end
+ end
+
+ def checksum_from_google
+ content_md5 = upload_attributes.fetch(:content_md5)
+
+ Base64
+ .decode64(content_md5)
+ .unpack1('H*')
+ end
+
+ def checksum_from_aws
+ upload_attributes.fetch(:etag)
+ end
+
+ # Carrierwave caches attributes for the local file and does not replace
+ # them with the ones from object store after the upload completes.
+ # We need to force it to fetch them directly from the object store.
+ def upload_attributes
+ strong_memoize(:upload_attributes) do
+ ::Ci::JobArtifact.find(trace_artifact.id).file.file.attributes
+ end
+ end
+ end
+ end
+ end
+end