diff --git a/external-plugins/botreview/review/BUILD.bazel b/external-plugins/botreview/review/BUILD.bazel index b9e8fdfded..71d38dfc91 100644 --- a/external-plugins/botreview/review/BUILD.bazel +++ b/external-plugins/botreview/review/BUILD.bazel @@ -5,6 +5,7 @@ go_library( srcs = [ "bump_kubevirtci.go", "image_update.go", + "kubevirt_uploader.go", "prow_autobump.go", "result.go", "review.go", @@ -24,6 +25,7 @@ go_test( srcs = [ "bump_kubevirtci_test.go", "image_update_test.go", + "kubevirt_uploader_test.go", "prow_autobump_test.go", "result_test.go", "review_test.go", diff --git a/external-plugins/botreview/review/kubevirt_uploader.go b/external-plugins/botreview/review/kubevirt_uploader.go new file mode 100644 index 0000000000..1236cab68a --- /dev/null +++ b/external-plugins/botreview/review/kubevirt_uploader.go @@ -0,0 +1,94 @@ +/* + * This file is part of the KubeVirt project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright the KubeVirt authors. + * + */ + +package review + +import ( + "fmt" + "github.com/sourcegraph/go-diff/diff" + "regexp" + "strings" +) + +const ( + kubevirtUploaderApproveComment = `:thumbsup: This looks like a simple kubevirt uploader bump.` + kubevirtUploaderDisapproveComment = `:thumbsdown: This doesn't look like a kubevirt uploader bump.` +) + +var kubevirtUploaderMatcher *regexp.Regexp + +func init() { + kubevirtUploaderMatcher = regexp.MustCompile(`(?m)^\+\s+"https://storage.googleapis.com/builddeps/\S+$`) +} + +type KubeVirtUploader struct { + relevantFileDiffs []*diff.FileDiff + unwantedFiles map[string]struct{} +} + +func (t *KubeVirtUploader) IsRelevant() bool { + return len(t.relevantFileDiffs) > 0 +} + +func (t *KubeVirtUploader) AddIfRelevant(fileDiff *diff.FileDiff) { + fileName := strings.TrimPrefix(fileDiff.NewName, "b/") + + if fileName == "WORKSPACE" { + t.relevantFileDiffs = append(t.relevantFileDiffs, fileDiff) + return + } + + if t.unwantedFiles == nil { + t.unwantedFiles = make(map[string]struct{}) + } + t.unwantedFiles[fileName] = struct{}{} +} + +func (t *KubeVirtUploader) Review() BotReviewResult { + result := NewCanMergeReviewResult(kubevirtUploaderApproveComment, kubevirtUploaderDisapproveComment) + + for _, fileDiff := range t.relevantFileDiffs { + fileName := strings.TrimPrefix(fileDiff.NewName, "b/") + switch fileName { + case "WORKSPACE": + for _, hunk := range fileDiff.Hunks { + if !matchesKubeVirtUploaderPattern(hunk) { + result.AddReviewFailure(fileDiff.NewName, hunk) + } + } + default: + // no checks since we can't do anything reasonable here + continue + } + } + + for fileName := range t.unwantedFiles { + result.AddReviewFailure(fileName) + } + + return result +} + +func matchesKubeVirtUploaderPattern(hunk *diff.Hunk) bool { + return kubevirtUploaderMatcher.Match(hunk.Body) +} + +func (t *KubeVirtUploader) String() string { + return fmt.Sprintf("relevantFileDiffs: %v", t.relevantFileDiffs) +} diff --git a/external-plugins/botreview/review/kubevirt_uploader_test.go b/external-plugins/botreview/review/kubevirt_uploader_test.go new file mode 100644 index 0000000000..12f1d33d90 --- /dev/null +++ b/external-plugins/botreview/review/kubevirt_uploader_test.go @@ -0,0 +1,194 @@ +/* + * This file is part of the KubeVirt project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright the KubeVirt authors. + * + */ + +package review + +import ( + "fmt" + "github.com/sourcegraph/go-diff/diff" + "os" + "reflect" + "testing" +) + +func TestKubeVirtUploader_Review(t1 *testing.T) { + diffFilePaths := []string{ + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch00", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch01", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch02", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch03", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch04", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch05", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch06", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch07", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch08", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch09", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch10", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch11", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch12", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch13", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch14", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch15", + "testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch16", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch00", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch01", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch02", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch03", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch04", + "testdata/kubevirt/ci-bump-remove-provider-local/bump-kci.patch05", + "testdata/kubevirt/uploader/uploader-autoupdate.patch00", + } + diffFilePathsToDiffs := map[string]*diff.FileDiff{} + for _, diffFile := range diffFilePaths { + bumpImagesDiffFile, err := os.ReadFile(diffFile) + if err != nil { + t1.Errorf("failed to read diff: %v", err) + } + bumpFileDiffs, err := diff.ParseFileDiff(bumpImagesDiffFile) + if err != nil { + t1.Errorf("failed to read diff: %v", err) + } + if bumpFileDiffs == nil { + panic(fmt.Sprintf("file diff %q empty", diffFile)) + } + diffFilePathsToDiffs[diffFile] = bumpFileDiffs + } + type fields struct { + relevantFileDiffs []*diff.FileDiff + } + tests := []struct { + name string + fields fields + want BotReviewResult + }{ + { + name: "simple kubevirt upload", + fields: fields{ + relevantFileDiffs: []*diff.FileDiff{ + diffFilePathsToDiffs["testdata/kubevirt/uploader/uploader-autoupdate.patch00"], + }, + }, + want: newReviewResultWithData(kubevirtUploaderApproveComment, kubevirtUploaderDisapproveComment, nil, ""), + }, + { + name: "mixed kubevirt upload", + fields: fields{ + relevantFileDiffs: []*diff.FileDiff{ + diffFilePathsToDiffs["testdata/kubevirt/uploader/uploader-autoupdate.patch00"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch00"], + }, + }, + want: newReviewResultWithData(kubevirtUploaderApproveComment, kubevirtUploaderDisapproveComment, map[string][]*diff.Hunk{ + "api/openapi-spec/swagger.json": nil, + }, ""), + }, + { + name: "non kubevirt upload", + fields: fields{ + relevantFileDiffs: []*diff.FileDiff{ + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch00"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch01"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch02"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch03"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch04"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch05"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch06"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch07"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch08"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch09"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch10"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch11"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch12"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch13"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch14"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch15"], + diffFilePathsToDiffs["testdata/kubevirt/fix-containerdisks-migration/fix-containerdisks-migrations.patch16"], + }, + }, + want: newReviewResultWithData(kubevirtUploaderApproveComment, kubevirtUploaderDisapproveComment, map[string][]*diff.Hunk{ + "pkg/virt-operator/resource/generate/components/daemonsets.go": nil, + "pkg/container-disk/container-disk_test.go": nil, + "pkg/virt-handler/container-disk/BUILD.bazel": nil, + "staging/src/kubevirt.io/api/core/v1/types_swagger_generated.go": nil, + "staging/src/kubevirt.io/client-go/api/openapi_generated.go": nil, + "staging/src/kubevirt.io/api/core/v1/types.go": nil, + "api/openapi-spec/swagger.json": nil, + "pkg/virt-handler/container-disk/mount.go": nil, + "pkg/virt-controller/services/template.go": nil, + "staging/src/kubevirt.io/api/core/v1/deepcopy_generated.go": nil, + "pkg/virt-operator/resource/generate/components/validations_generated.go": nil, + "pkg/virt-handler/vm.go": nil, + "pkg/virt-handler/container-disk/generated_mock_mount.go": nil, + "pkg/virt-handler/isolation/isolation.go": nil, + "pkg/virt-handler/container-disk/mount_test.go": nil, + "pkg/virt-handler/vm_test.go": nil, + "pkg/container-disk/container-disk.go": nil, + }, ""), + }, + } + for _, tt := range tests { + t1.Run(tt.name, func(t1 *testing.T) { + t := &KubeVirtUploader{} + for index, fileDiff := range tt.fields.relevantFileDiffs { + if fileDiff == nil { + t1.Errorf("fileDiff[%d] nil", index) + } + t.AddIfRelevant(fileDiff) + } + if got := t.Review(); !reflect.DeepEqual(got, tt.want) { + t1.Errorf("Review() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_matchesKubeVirtUploaderPattern(t *testing.T) { + type args struct { + hunk *diff.Hunk + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "builddeps 1", + args: args{ + hunk: &diff.Hunk{ + Body: []byte(` urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.42.0/rules_go-v0.42.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.42.0/rules_go-v0.42.0.zip", ++ "https://storage.googleapis.com/builddeps/91585017debb61982f7054c9688857a2ad1fd823fc3f9cb05048b0025c47d023", + ], + ) + +`), + }, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := matchesKubeVirtUploaderPattern(tt.args.hunk); got != tt.want { + t.Errorf("matchesKubeVirtUploaderPattern() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/external-plugins/botreview/review/result.go b/external-plugins/botreview/review/result.go index a93cada3d2..641cbc72a4 100644 --- a/external-plugins/botreview/review/result.go +++ b/external-plugins/botreview/review/result.go @@ -77,14 +77,14 @@ func (r *BasicReviewResult) String() string { return r.approveComment } else { comment := r.disapproveComment + comment += fmt.Sprintf("\n\n
\n") for fileName, hunks := range r.notMatchingHunks { - comment += fmt.Sprintf("\n\n
") - comment += fmt.Sprintf("\n\n_%s_", fileName) + comment += fmt.Sprintf("\n_%s_", fileName) for _, hunk := range hunks { comment += fmt.Sprintf("\n\n~~~diff\n%s\n~~~", string(hunk.Body)) } - comment += fmt.Sprintf("\n\n
\n") } + comment += fmt.Sprintf("\n\n
\n") return comment } } diff --git a/external-plugins/botreview/review/review.go b/external-plugins/botreview/review/review.go index 826d34a103..2b13d5e880 100644 --- a/external-plugins/botreview/review/review.go +++ b/external-plugins/botreview/review/review.go @@ -40,6 +40,7 @@ func newPossibleReviewTypes() []KindOfChange { &ProwJobImageUpdate{}, &BumpKubevirtCI{}, &ProwAutobump{}, + &KubeVirtUploader{}, } } diff --git a/external-plugins/botreview/review/review_test.go b/external-plugins/botreview/review/review_test.go index fd17f9f8aa..b4dd87547a 100644 --- a/external-plugins/botreview/review/review_test.go +++ b/external-plugins/botreview/review/review_test.go @@ -313,6 +313,53 @@ nil +This PR does not satisfy at least one automated review criteria. + +Holding this PR because: +* should not get merged at all reason + +/hold + +**Note: botreview (kubevirt/project-infra#3100) is a Work In Progress!** +`, + }, + }, + }, + { + name: "one review without hunks, not approved", + fields: newFields(), + args: args{ + githubClient: newGHReviewClient(), + botReviewResults: []BotReviewResult{ + newReviewResultWithData( + "approved", + "disapproved", + map[string][]*diff.Hunk{ + "test": nil, + "blah": nil, + }, + "should not get merged at all reason", + ), + }, + }, + wantErr: false, + wantReviewComments: []*FakeComment{ + { + Org: "", + Repo: "", + Number: 0, + Comment: `@pr-reviewer's review-bot says: + +disapproved + +
+ +_test_ +_blah_ + +
+ + This PR does not satisfy at least one automated review criteria. Holding this PR because: diff --git a/external-plugins/botreview/review/testdata/kubevirt/uploader/uploader-autoupdate.patch00 b/external-plugins/botreview/review/testdata/kubevirt/uploader/uploader-autoupdate.patch00 new file mode 100644 index 0000000000..e6d8232816 --- /dev/null +++ b/external-plugins/botreview/review/testdata/kubevirt/uploader/uploader-autoupdate.patch00 @@ -0,0 +1,380 @@ +diff --git a/WORKSPACE b/WORKSPACE +index 7e52cfbe2c..09386cf256 100644 +--- a/WORKSPACE ++++ b/WORKSPACE +@@ -428,6 +428,7 @@ rpm( + sha256 = "a0a9b302d252d32c0da8100a0ad762852c22eeac4ccad0aaf72ad68a2bbd7a93", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/acl-2.3.1-4.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/a0a9b302d252d32c0da8100a0ad762852c22eeac4ccad0aaf72ad68a2bbd7a93", + ], + ) + +@@ -436,6 +437,7 @@ rpm( + sha256 = "dd11bab2ea0abdfa310362eace871422a003340bf223135626500f8f5a985f6b", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/acl-2.3.1-4.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/dd11bab2ea0abdfa310362eace871422a003340bf223135626500f8f5a985f6b", + ], + ) + +@@ -1380,6 +1382,7 @@ rpm( + sha256 = "bc553c8c569bfb2051f1395d981d7c9c6e259b57a41dced51f7fac20b63fc929", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/glibc-2.34-88.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/bc553c8c569bfb2051f1395d981d7c9c6e259b57a41dced51f7fac20b63fc929", + ], + ) + +@@ -1388,6 +1391,7 @@ rpm( + sha256 = "6a590a3ac551dcd27ea5fc0097d19915e32af47ecddb52bcabbef12bbda97a54", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/glibc-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/6a590a3ac551dcd27ea5fc0097d19915e32af47ecddb52bcabbef12bbda97a54", + ], + ) + +@@ -1396,6 +1400,7 @@ rpm( + sha256 = "c4814302b6884c0626afd04dc1fdb28cb3d7f92af307a91785ce37e5309e53a9", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/glibc-common-2.34-88.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/c4814302b6884c0626afd04dc1fdb28cb3d7f92af307a91785ce37e5309e53a9", + ], + ) + +@@ -1404,6 +1409,7 @@ rpm( + sha256 = "f19cf4786a59ab7b7064d31230e7b59d8d47723061ee3f6eb8168bbece13938f", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/glibc-common-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/f19cf4786a59ab7b7064d31230e7b59d8d47723061ee3f6eb8168bbece13938f", + ], + ) + +@@ -1412,6 +1418,7 @@ rpm( + sha256 = "6483807486e2c20f02202d39f32d1bac055e8d24135f0af213e123b72b9d8e59", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/aarch64/os/Packages/glibc-devel-2.34-88.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/6483807486e2c20f02202d39f32d1bac055e8d24135f0af213e123b72b9d8e59", + ], + ) + +@@ -1420,6 +1427,7 @@ rpm( + sha256 = "7a4067c3a52eb334c520c53b2ec0d1beae2be57af0eec75ba7fcd728feb59e45", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/glibc-devel-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/7a4067c3a52eb334c520c53b2ec0d1beae2be57af0eec75ba7fcd728feb59e45", + ], + ) + +@@ -1428,6 +1436,7 @@ rpm( + sha256 = "76cd179192536f23c0a112fc56e532c4a2c681956439cbda2a3f0a101edaa72b", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/glibc-headers-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/76cd179192536f23c0a112fc56e532c4a2c681956439cbda2a3f0a101edaa72b", + ], + ) + +@@ -1436,6 +1445,7 @@ rpm( + sha256 = "dddcc43e175550a9759671d6fb7889f4cecdcb18ad83ea9a766a9247dd910990", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/glibc-minimal-langpack-2.34-88.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/dddcc43e175550a9759671d6fb7889f4cecdcb18ad83ea9a766a9247dd910990", + ], + ) + +@@ -1444,6 +1454,7 @@ rpm( + sha256 = "f1224ca96983442834cb93c940859c668393a6132e93dee871b74b2fe703a748", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/glibc-minimal-langpack-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/f1224ca96983442834cb93c940859c668393a6132e93dee871b74b2fe703a748", + ], + ) + +@@ -1452,6 +1463,7 @@ rpm( + sha256 = "4f68cb7013c8f0011aabea5a5fd7a934106a47620b68f3d684c32b86e65e3ddf", + urls = [ + "http://mirror.stream.centos.org/9-stream/CRB/aarch64/os/Packages/glibc-static-2.34-88.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/4f68cb7013c8f0011aabea5a5fd7a934106a47620b68f3d684c32b86e65e3ddf", + ], + ) + +@@ -1460,6 +1472,7 @@ rpm( + sha256 = "828c1702e243fb2828d826229a7d97cae3fc04c497166eb26b048bca4d993ccd", + urls = [ + "http://mirror.stream.centos.org/9-stream/CRB/x86_64/os/Packages/glibc-static-2.34-88.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/828c1702e243fb2828d826229a7d97cae3fc04c497166eb26b048bca4d993ccd", + ], + ) + +@@ -1495,6 +1508,7 @@ rpm( + sha256 = "eac46f3673c8a12d24eee7d123734c72afe9b6bff58fba8177c703d950aa05bb", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/gnutls-3.8.2-1.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/eac46f3673c8a12d24eee7d123734c72afe9b6bff58fba8177c703d950aa05bb", + ], + ) + +@@ -1503,6 +1517,7 @@ rpm( + sha256 = "86d1cc7c87c5edf4f8321a8d6e4af70dbfe3f0399ff0b15235ac19fccfae3f2b", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/gnutls-3.8.2-1.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/86d1cc7c87c5edf4f8321a8d6e4af70dbfe3f0399ff0b15235ac19fccfae3f2b", + ], + ) + +@@ -1511,6 +1526,7 @@ rpm( + sha256 = "f652a005815c700deb11fa2a887636082b0d9336a16c1022781b7c3a7536d0d1", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/aarch64/os/Packages/gnutls-dane-3.8.2-1.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/f652a005815c700deb11fa2a887636082b0d9336a16c1022781b7c3a7536d0d1", + ], + ) + +@@ -1519,6 +1535,7 @@ rpm( + sha256 = "3394c59b4587e99912709f2da9a21d926c3dff2ea03c181c6bc8ab7ce52690c6", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/gnutls-dane-3.8.2-1.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/3394c59b4587e99912709f2da9a21d926c3dff2ea03c181c6bc8ab7ce52690c6", + ], + ) + +@@ -1527,6 +1544,7 @@ rpm( + sha256 = "1f2d549c703fa1b9ec962761a1cd005559bc50b5c511e37cb3c75337d9b15d3d", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/aarch64/os/Packages/gnutls-utils-3.8.2-1.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/1f2d549c703fa1b9ec962761a1cd005559bc50b5c511e37cb3c75337d9b15d3d", + ], + ) + +@@ -1535,6 +1553,7 @@ rpm( + sha256 = "1e18d57c938cf1030134c209a5d8252abee7358b0ea96db1e10a57f14ee3d040", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/gnutls-utils-3.8.2-1.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/1e18d57c938cf1030134c209a5d8252abee7358b0ea96db1e10a57f14ee3d040", + ], + ) + +@@ -1768,6 +1787,7 @@ rpm( + sha256 = "e6e2fc336d80aa44fe72230bd0bc14df3e8c9062b6876c597170f6cd53b6a435", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/aarch64/os/Packages/kernel-headers-5.14.0-390.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/e6e2fc336d80aa44fe72230bd0bc14df3e8c9062b6876c597170f6cd53b6a435", + ], + ) + +@@ -1776,6 +1796,7 @@ rpm( + sha256 = "13c602c556d2a26dd9bb80a17ae5f01a2640cd32fd273d4a62ed01ff247c8b82", + urls = [ + "http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/kernel-headers-5.14.0-390.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/13c602c556d2a26dd9bb80a17ae5f01a2640cd32fd273d4a62ed01ff247c8b82", + ], + ) + +@@ -1865,6 +1886,7 @@ rpm( + sha256 = "90e4392e312cd793eeba4cd68bd12836a882ac37356c784806d67a0cd1d48c25", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/libacl-2.3.1-4.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/90e4392e312cd793eeba4cd68bd12836a882ac37356c784806d67a0cd1d48c25", + ], + ) + +@@ -1873,6 +1895,7 @@ rpm( + sha256 = "60a3affaa1c387fd6f72dd65aa7ad619a1830947823abb4b29e7b9fcb4c9d27c", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/libacl-2.3.1-4.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/60a3affaa1c387fd6f72dd65aa7ad619a1830947823abb4b29e7b9fcb4c9d27c", + ], + ) + +@@ -2916,6 +2939,7 @@ rpm( + sha256 = "a5a3ceb11e0c361d33b339d8c1561101c7351c248ed6e31c72864e76464bdae9", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/libsss_idmap-2.9.3-2.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/a5a3ceb11e0c361d33b339d8c1561101c7351c248ed6e31c72864e76464bdae9", + ], + ) + +@@ -2924,6 +2948,7 @@ rpm( + sha256 = "f1bf2658c6e669b7f921d8ef77a0fa042108fd2bf04890d9e251c085e351650d", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/libsss_idmap-2.9.3-2.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/f1bf2658c6e669b7f921d8ef77a0fa042108fd2bf04890d9e251c085e351650d", + ], + ) + +@@ -2932,6 +2957,7 @@ rpm( + sha256 = "c1f45f999739c5e70bd69bd100143f504779b774a4bd1b1530a03ab3edfd2b17", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/libsss_nss_idmap-2.9.3-2.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/c1f45f999739c5e70bd69bd100143f504779b774a4bd1b1530a03ab3edfd2b17", + ], + ) + +@@ -2940,6 +2966,7 @@ rpm( + sha256 = "38fdda92ea92479e64a3dc7d2f4e069b62fcc545ae0aa407773a595dbbeb0ff1", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/libsss_nss_idmap-2.9.3-2.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/38fdda92ea92479e64a3dc7d2f4e069b62fcc545ae0aa407773a595dbbeb0ff1", + ], + ) + +@@ -3524,6 +3551,7 @@ rpm( + sha256 = "991294c5c3f1544172cbc0c3bf27540036e0d09f42c161ef8bdf231c97d9ced0", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/nettle-3.9.1-1.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/991294c5c3f1544172cbc0c3bf27540036e0d09f42c161ef8bdf231c97d9ced0", + ], + ) + +@@ -3532,6 +3560,7 @@ rpm( + sha256 = "ffeeab0a6b0caaf457ad77a64bb1dfac6c1144343f1057de64a89b5ae4b58bf5", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/ffeeab0a6b0caaf457ad77a64bb1dfac6c1144343f1057de64a89b5ae4b58bf5", + ], + ) + +@@ -3612,6 +3641,7 @@ rpm( + sha256 = "c7f9e7e2d37c5d8ae263e8789142ba6956337a12a139a9661efff6ebfd3758c4", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/numad-0.5-37.20150602git.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/c7f9e7e2d37c5d8ae263e8789142ba6956337a12a139a9661efff6ebfd3758c4", + ], + ) + +@@ -3620,6 +3650,7 @@ rpm( + sha256 = "82e83efcc0528646c0cfdaa846e45e89b6e347b78664b5528bbfdf919d57bd46", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/numad-0.5-37.20150602git.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/82e83efcc0528646c0cfdaa846e45e89b6e347b78664b5528bbfdf919d57bd46", + ], + ) + +@@ -3700,6 +3731,7 @@ rpm( + sha256 = "bdd4c7f279730c079b5f766a5c9f1297ee02120840bd12f084ab6f22e50c2203", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/p11-kit-0.25.3-2.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/bdd4c7f279730c079b5f766a5c9f1297ee02120840bd12f084ab6f22e50c2203", + ], + ) + +@@ -3708,6 +3740,7 @@ rpm( + sha256 = "0839ee9854251e66f3109b6c685f1e6b3cce6d2a1415e9f71a03d71f03eeb708", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-2.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/0839ee9854251e66f3109b6c685f1e6b3cce6d2a1415e9f71a03d71f03eeb708", + ], + ) + +@@ -3716,6 +3749,7 @@ rpm( + sha256 = "f49208d939702ade5ff36a42af67be05ca5c3125665c23275520880a07f5d16a", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/p11-kit-trust-0.25.3-2.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/f49208d939702ade5ff36a42af67be05ca5c3125665c23275520880a07f5d16a", + ], + ) + +@@ -3724,6 +3758,7 @@ rpm( + sha256 = "177b963e62a19a2539138c1e5828a331bdf04c3675829a0dc88699765a4e0e63", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/p11-kit-trust-0.25.3-2.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/177b963e62a19a2539138c1e5828a331bdf04c3675829a0dc88699765a4e0e63", + ], + ) + +@@ -3795,6 +3830,7 @@ rpm( + sha256 = "1189e1b5f7587cbfa3b17a457cd0ffa49014d98fdab271a6446ac252ab996753", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/pcre2-10.40-4.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/1189e1b5f7587cbfa3b17a457cd0ffa49014d98fdab271a6446ac252ab996753", + ], + ) + +@@ -3803,6 +3839,7 @@ rpm( + sha256 = "c50497baeb5a3b381a09039f4f6483f359610096b3ecd235cc2b89b17cc713bf", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/pcre2-10.40-4.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/c50497baeb5a3b381a09039f4f6483f359610096b3ecd235cc2b89b17cc713bf", + ], + ) + +@@ -3811,6 +3848,7 @@ rpm( + sha256 = "65b2b8673081f99db0f91777d18cd96cb86f1a4db7363f79bd6edaee893ea3ee", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/pcre2-syntax-10.40-4.el9.noarch.rpm", ++ "https://storage.googleapis.com/builddeps/65b2b8673081f99db0f91777d18cd96cb86f1a4db7363f79bd6edaee893ea3ee", + ], + ) + +@@ -3819,6 +3857,7 @@ rpm( + sha256 = "65b2b8673081f99db0f91777d18cd96cb86f1a4db7363f79bd6edaee893ea3ee", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/pcre2-syntax-10.40-4.el9.noarch.rpm", ++ "https://storage.googleapis.com/builddeps/65b2b8673081f99db0f91777d18cd96cb86f1a4db7363f79bd6edaee893ea3ee", + ], + ) + +@@ -4466,6 +4505,7 @@ rpm( + sha256 = "6da546a4d87940c00edd0655788f8ec912575ba875ca4bf4ca5b66fc63b7f8fe", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/rpm-4.16.1.3-26.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/6da546a4d87940c00edd0655788f8ec912575ba875ca4bf4ca5b66fc63b7f8fe", + ], + ) + +@@ -4474,6 +4514,7 @@ rpm( + sha256 = "5b4dd36ab74e8516b75580f64df49c40a32e47ee069513eb120c9ea5c38fb6bc", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/rpm-4.16.1.3-26.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/5b4dd36ab74e8516b75580f64df49c40a32e47ee069513eb120c9ea5c38fb6bc", + ], + ) + +@@ -4482,6 +4523,7 @@ rpm( + sha256 = "e3b35a5792160a0531ffaadda108359747e89df892cbf636dceb3f452d7733d3", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/rpm-libs-4.16.1.3-26.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/e3b35a5792160a0531ffaadda108359747e89df892cbf636dceb3f452d7733d3", + ], + ) + +@@ -4490,6 +4532,7 @@ rpm( + sha256 = "73ac8b7bf54ff0fce758f4d0235ba06e66f7f65da89bd41d41d1f469547e4a84", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/rpm-libs-4.16.1.3-26.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/73ac8b7bf54ff0fce758f4d0235ba06e66f7f65da89bd41d41d1f469547e4a84", + ], + ) + +@@ -4498,6 +4541,7 @@ rpm( + sha256 = "7c3f309f7d002e53a686d89b53ea3c92c9ab021b59f258b9614ce86e24ae83f7", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/rpm-plugin-selinux-4.16.1.3-26.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/7c3f309f7d002e53a686d89b53ea3c92c9ab021b59f258b9614ce86e24ae83f7", + ], + ) + +@@ -4506,6 +4550,7 @@ rpm( + sha256 = "a9b0d3b9a6383fb5edb5f34dc2a64b0abe9ce02c63d80145b1f0b5a78daa76da", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/rpm-plugin-selinux-4.16.1.3-26.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/a9b0d3b9a6383fb5edb5f34dc2a64b0abe9ce02c63d80145b1f0b5a78daa76da", + ], + ) + +@@ -4685,6 +4730,7 @@ rpm( + sha256 = "5577c15821003db50849de851f6d2acfad4506c461c1f9e42b31b5652f13012b", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/Packages/sssd-client-2.9.3-2.el9.aarch64.rpm", ++ "https://storage.googleapis.com/builddeps/5577c15821003db50849de851f6d2acfad4506c461c1f9e42b31b5652f13012b", + ], + ) + +@@ -4693,6 +4739,7 @@ rpm( + sha256 = "9001f9740bcdce56b4ad91248c6b0e427c683b0ab6baa2e5a79ac7b9943767f1", + urls = [ + "http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/sssd-client-2.9.3-2.el9.x86_64.rpm", ++ "https://storage.googleapis.com/builddeps/9001f9740bcdce56b4ad91248c6b0e427c683b0ab6baa2e5a79ac7b9943767f1", + ], + ) +