From dd0f2669e56342d3960851a280eb4980322f171e Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 26 Apr 2023 10:47:00 +0200 Subject: [PATCH] [backend] get rid of push_blob_content() function Instead, add make_blob_entry() to BSContar to create a normal tar entry and use push_blob(). --- src/backend/BSContar.pm | 10 ++++++++-- src/backend/BSPublisher/Registry.pm | 24 +++++++----------------- src/backend/bs_regpush | 12 +++++------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/backend/BSContar.pm b/src/backend/BSContar.pm index afe4cacf170..182f3a639de 100644 --- a/src/backend/BSContar.pm +++ b/src/backend/BSContar.pm @@ -49,6 +49,13 @@ sub blobid { return 'sha256:'.Digest::SHA::sha256_hex($_[0]); } +sub make_blob_entry { + my ($name, $blob, %extra) = @_; + my $blobid = blobid($blob); + my $ent = { %extra, 'name' => $name, 'size' => length($blob), 'data' => $blob, 'blobid' => $blobid }; + return ($ent, $blobid); +} + sub checksum_entry { my ($ent, $ctx) = @_; my $offset = 0; @@ -423,8 +430,7 @@ sub container_from_helm { push @layercomp, ''; } # create ent for the config - my $config_ent = { 'name' => 'config.json', 'size' => length($config_json), 'data' => $config_json, 'mtime' => $mtime }; - $config_ent->{'mimetype'} = $mt_helm_config; + my ($config_ent) = make_blob_entry('config.json', $config_json, 'mtime' => $mtime, 'mimetype' => $mt_helm_config); # create ent for the manifest my $manifest = { 'Layers' => [ $chartbasename ], diff --git a/src/backend/BSPublisher/Registry.pm b/src/backend/BSPublisher/Registry.pm index 6d0c4c354f1..ecf6e77c6cb 100644 --- a/src/backend/BSPublisher/Registry.pm +++ b/src/backend/BSPublisher/Registry.pm @@ -145,17 +145,6 @@ sub push_blob { return $blobid; } -sub push_blob_content { - my ($repodir, $content) = @_; - my $blob_id = BSContar::blobid($content); - my $dir = "$repodir/:blobs"; - return $blob_id if -e "$dir/$blob_id"; - mkdir_p($dir) unless -d $dir; - unlink("$dir/.$blob_id.$$"); - writestr("$dir/.$blob_id.$$", "$dir/$blob_id", $content); - return $blob_id; -} - sub push_manifest { my ($repodir, $mani_json) = @_; my $mani_id = BSContar::blobid($mani_json); @@ -428,17 +417,18 @@ sub update_sigs { sub create_cosign_manifest { my ($repodir, $oci, $knownmanifests, $knownblobs, $config, @payload_layers) = @_; - my $config_blobid = push_blob_content($repodir, $config); + my ($config_ent, $config_blobid) = BSContar::make_blob_entry('config.json', $config); + push_blob($repodir, $config_ent); $knownblobs->{$config_blobid} = 1; - my $config_ent = { 'name' => 'config.json', 'size' => length($config), 'data' => $config, 'blobid' => $config_blobid }; my $config_data = BSContar::create_config_data($config_ent, $oci); my @layer_data; while (@payload_layers >= 2) { - my ($payload_layer, $payload) = splice(@payload_layers, 0, 2); - my $payload_blobid = push_blob_content($repodir, $payload); + my ($payload_layer_data, $payload) = splice(@payload_layers, 0, 2); + my ($payload_ent, $payload_blobid) = BSContar::make_blob_entry($payload_layer_data->{'digest'}, $payload); + die unless $payload_blobid eq $payload_layer_data->{'digest'}; + push_blob($repodir, $payload_ent); $knownblobs->{$payload_blobid} = 1; - die unless $payload_blobid eq $payload_layer->{'digest'}; - push @layer_data, $payload_layer; + push @layer_data, $payload_layer_data; } my $mani = BSContar::create_dist_manifest_data($config_data, \@layer_data, $oci); my $mani_json = BSContar::create_dist_manifest($mani); diff --git a/src/backend/bs_regpush b/src/backend/bs_regpush index 34c78e85e3c..79783786da4 100755 --- a/src/backend/bs_regpush +++ b/src/backend/bs_regpush @@ -260,18 +260,16 @@ sub manifest_upload_tags { sub cosign_upload { my ($tag, $config, @layers) = @_; my $oci = 1; - my $config_blobid = BSContar::blobid($config); - my $config_ent = { 'name' => 'config.json', 'size' => length($config), 'data' => $config, 'blobid' => $config_blobid }; + my ($config_ent, $config_blobid) = BSContar::make_blob_entry('config.json', $config); blob_upload($config_blobid, $config_ent); my $config_data = BSContar::create_config_data($config_ent, $oci); my @layer_data; while (@layers >= 2) { - my ($payload_layer, $payload) = splice(@layers, 0, 2); - my $payload_blobid = BSContar::blobid($payload); - die unless $payload_blobid eq $payload_layer->{'digest'}; - my $payload_ent = { 'name' => $payload_blobid, 'size' => length($payload), 'data' => $payload, 'blobid' => $payload_blobid }; + my ($payload_layer_data, $payload) = splice(@layers, 0, 2); + my ($payload_ent, $payload_blobid) = BSContar::make_blob_entry($payload_layer_data->{'digest'}, $payload); + die unless $payload_blobid eq $payload_layer_data->{'digest'}; blob_upload($payload_blobid, $payload_ent); - push @layer_data, $payload_layer; + push @layer_data, $payload_layer_data; } my $mani = BSContar::create_dist_manifest_data($config_data, \@layer_data, $oci); my $mani_json = BSContar::create_dist_manifest_list($mani);