Skip to content

Commit 7d3355a

Browse files
authored
Merge pull request kubernetes-sigs#7951 from chrischdi/pr-repository-client-remove-redirect-handling
🌱 Remove redirection handling in repository_github client
2 parents d98ae0e + 5d805b5 commit 7d3355a

File tree

2 files changed

+43
-23
lines changed

2 files changed

+43
-23
lines changed

cmd/clusterctl/client/repository/repository_github.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ func (g *gitHubRepository) downloadFilesFromRelease(release *github.RepositoryRe
378378
_ = wait.PollImmediate(retryableOperationInterval, retryableOperationTimeout, func() (bool, error) {
379379
var redirect string
380380
var downloadReleaseError error
381-
reader, redirect, downloadReleaseError = client.Repositories.DownloadReleaseAsset(context.TODO(), g.owner, g.repository, *assetID, http.DefaultClient)
381+
reader, redirect, downloadReleaseError = client.Repositories.DownloadReleaseAsset(ctx, g.owner, g.repository, *assetID, http.DefaultClient)
382382
if downloadReleaseError != nil {
383383
retryError = g.handleGithubErr(downloadReleaseError, "failed to download file %q from %q release", *release.TagName, fileName)
384384
// return immediately if we are rate limited
@@ -388,19 +388,11 @@ func (g *gitHubRepository) downloadFilesFromRelease(release *github.RepositoryRe
388388
return false, nil
389389
}
390390
if redirect != "" {
391-
req, err := http.NewRequestWithContext(ctx, http.MethodGet, redirect, http.NoBody)
392-
if err != nil {
393-
retryError = errors.Wrapf(err, "failed to download file %q from %q release via redirect location %q: failed to create request", *release.TagName, fileName, redirect)
394-
return false, nil
395-
}
396-
397-
response, err := http.DefaultClient.Do(req) //nolint:bodyclose // (NB: The reader is actually closed in a defer)
398-
if err != nil {
399-
retryError = errors.Wrapf(err, "failed to download file %q from %q release via redirect location %q", *release.TagName, fileName, redirect)
400-
return false, nil
401-
}
402-
reader = response.Body
391+
// NOTE: DownloadReleaseAsset should not return a redirect address when used with the DefaultClient
392+
retryError = errors.New("unexpected redirect while downloading the release asset")
393+
return true, retryError
403394
}
395+
404396
retryError = nil
405397
return true, nil
406398
})

cmd/clusterctl/client/repository/repository_github_test.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,8 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
719719
client, mux, teardown := test.NewFakeGitHub()
720720
defer teardown()
721721

722-
providerConfig := config.NewProvider("test", "https://github.com/o/r/releases/v0.4.1/file.yaml", clusterctlv1.CoreProviderType) // tree/main/path not relevant for the test
722+
providerConfig := config.NewProvider("test", "https://github.com/o/r/releases/v0.4.1/file.yaml", clusterctlv1.CoreProviderType) // tree/main/path not relevant for the test
723+
providerConfigWithRedirect := config.NewProvider("test", "https://github.com/o/r-with-redirect/releases/v0.4.1/file.yaml", clusterctlv1.CoreProviderType) // tree/main/path not relevant for the test
723724

724725
// test.NewFakeGitHub an handler for returning a fake release asset
725726
mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
@@ -728,6 +729,11 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
728729
w.Header().Set("Content-Disposition", "attachment; filename=file.yaml")
729730
fmt.Fprint(w, "content")
730731
})
732+
// handler which redirects to a different location
733+
mux.HandleFunc("/repos/o/r-with-redirect/releases/assets/1", func(w http.ResponseWriter, r *http.Request) {
734+
testMethod(t, r, "GET")
735+
http.Redirect(w, r, "/api-v3/repos/o/r/releases/assets/1", http.StatusFound)
736+
})
731737

732738
configVariablesClient := test.NewFakeVariableClient()
733739

@@ -741,10 +747,11 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
741747
fileName string
742748
}
743749
tests := []struct {
744-
name string
745-
args args
746-
want []byte
747-
wantErr bool
750+
name string
751+
args args
752+
providerConfig config.Provider
753+
want []byte
754+
wantErr bool
748755
}{
749756
{
750757
name: "Pass if file exists",
@@ -760,8 +767,27 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
760767
},
761768
fileName: file,
762769
},
763-
want: []byte("content"),
764-
wantErr: false,
770+
providerConfig: providerConfig,
771+
want: []byte("content"),
772+
wantErr: false,
773+
},
774+
{
775+
name: "Pass if file exists with redirect",
776+
args: args{
777+
release: &github.RepositoryRelease{
778+
TagName: &tagName,
779+
Assets: []*github.ReleaseAsset{
780+
{
781+
ID: &id1,
782+
Name: &file,
783+
},
784+
},
785+
},
786+
fileName: file,
787+
},
788+
providerConfig: providerConfigWithRedirect,
789+
want: []byte("content"),
790+
wantErr: false,
765791
},
766792
{
767793
name: "Fails if file does not exists",
@@ -777,7 +803,8 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
777803
},
778804
fileName: "another file",
779805
},
780-
wantErr: true,
806+
providerConfig: providerConfig,
807+
wantErr: true,
781808
},
782809
{
783810
name: "Fails if file does not exists",
@@ -793,15 +820,16 @@ func Test_gitHubRepository_downloadFilesFromRelease(t *testing.T) {
793820
},
794821
fileName: "another file",
795822
},
796-
wantErr: true,
823+
providerConfig: providerConfig,
824+
wantErr: true,
797825
},
798826
}
799827
for _, tt := range tests {
800828
t.Run(tt.name, func(t *testing.T) {
801829
g := NewWithT(t)
802830
resetCaches()
803831

804-
gRepo, err := NewGitHubRepository(providerConfig, configVariablesClient, injectGithubClient(client))
832+
gRepo, err := NewGitHubRepository(tt.providerConfig, configVariablesClient, injectGithubClient(client))
805833
g.Expect(err).NotTo(HaveOccurred())
806834

807835
got, err := gRepo.(*gitHubRepository).downloadFilesFromRelease(tt.args.release, tt.args.fileName)

0 commit comments

Comments
 (0)