diff --git a/.golangci.yml b/.golangci.yml index ade7260bf6fa..597722eaa67e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -25,6 +25,7 @@ linters: - misspell - nakedret - nilerr + - noctx - nolintlint - prealloc - predeclared @@ -37,6 +38,7 @@ linters: - typecheck - unconvert - unparam + - unused - varcheck - whitespace @@ -149,6 +151,8 @@ linters-settings: - unnecessaryDefer - whyNoLint - wrapperFunc + unused: + go: "1.17" issues: max-same-issues: 0 max-issues-per-linter: 0 diff --git a/cmd/clusterctl/client/config/reader_viper.go b/cmd/clusterctl/client/config/reader_viper.go index 135ec7dca64a..939f8720afaf 100644 --- a/cmd/clusterctl/client/config/reader_viper.go +++ b/cmd/clusterctl/client/config/reader_viper.go @@ -17,6 +17,7 @@ limitations under the License. package config import ( + "context" "fmt" "io" "net/http" @@ -133,6 +134,8 @@ func (v *viperReader) Init(path string) error { } func downloadFile(url string, filepath string) error { + ctx := context.TODO() + // Create the file out, err := os.Create(filepath) if err != nil { @@ -144,7 +147,12 @@ func downloadFile(url string, filepath string) error { Timeout: 30 * time.Second, } // Get the data - resp, err := client.Get(url) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) + if err != nil { + return errors.Wrapf(err, "failed to download the clusterctl config file from %s: failed to create request", url) + } + + resp, err := client.Do(req) if err != nil { return errors.Wrapf(err, "failed to download the clusterctl config file from %s", url) } diff --git a/cmd/clusterctl/client/repository/repository_github.go b/cmd/clusterctl/client/repository/repository_github.go index b710cfb91da9..ee0ddbe6b069 100644 --- a/cmd/clusterctl/client/repository/repository_github.go +++ b/cmd/clusterctl/client/repository/repository_github.go @@ -262,6 +262,8 @@ func (g *gitHubRepository) getReleaseByTag(tag string) (*github.RepositoryReleas // downloadFilesFromRelease download a file from release. func (g *gitHubRepository) downloadFilesFromRelease(release *github.RepositoryRelease, fileName string) ([]byte, error) { + ctx := context.TODO() + cacheID := fmt.Sprintf("%s/%s:%s:%s", g.owner, g.repository, *release.TagName, fileName) if content, ok := cacheFiles[cacheID]; ok { return content, nil @@ -287,7 +289,12 @@ func (g *gitHubRepository) downloadFilesFromRelease(release *github.RepositoryRe return nil, g.handleGithubErr(err, "failed to download file %q from %q release", *release.TagName, fileName) } if redirect != "" { - response, err := http.Get(redirect) //nolint:bodyclose,gosec // (NB: The reader is actually closed in a defer) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, redirect, http.NoBody) + if err != nil { + return nil, errors.Wrapf(err, "failed to download file %q from %q release via redirect location %q: failed to create request", *release.TagName, fileName, redirect) + } + + response, err := http.DefaultClient.Do(req) //nolint:bodyclose // (NB: The reader is actually closed in a defer) if err != nil { return nil, errors.Wrapf(err, "failed to download file %q from %q release via redirect location %q", *release.TagName, fileName, redirect) } diff --git a/hack/tools/mdbook/embed/embed.go b/hack/tools/mdbook/embed/embed.go index 3d2cb89dda4f..5ab97308607c 100644 --- a/hack/tools/mdbook/embed/embed.go +++ b/hack/tools/mdbook/embed/embed.go @@ -56,7 +56,7 @@ func (l Embed) Process(input *plugin.Input) error { Path: path.Join("/", repository, branch, filePath), } - resp, err := http.Get(rawURL.String()) + resp, err := http.Get(rawURL.String()) //nolint:noctx // NB: as we're just implementing an external interface we won't be able to get a context here. if err != nil { return "", err } diff --git a/hack/tools/mdbook/releaselink/releaselink.go b/hack/tools/mdbook/releaselink/releaselink.go index 7310755a0b6e..538870a9c553 100644 --- a/hack/tools/mdbook/releaselink/releaselink.go +++ b/hack/tools/mdbook/releaselink/releaselink.go @@ -68,7 +68,7 @@ func (l ReleaseLink) Process(input *plugin.Input) error { Path: path.Join(gomodule, "@v", "/list"), } - resp, err := http.Get(rawURL.String()) + resp, err := http.Get(rawURL.String()) //nolint:noctx // NB: as we're just implementing an external interface we won't be able to get a context here. if err != nil { return "", err } diff --git a/test/e2e/clusterctl_upgrade.go b/test/e2e/clusterctl_upgrade.go index 6cbd213a074f..5fb56dbfaa5b 100644 --- a/test/e2e/clusterctl_upgrade.go +++ b/test/e2e/clusterctl_upgrade.go @@ -189,7 +189,7 @@ func ClusterctlUpgradeSpec(ctx context.Context, inputGetter func() ClusterctlUpg // Download the older clusterctl version to be used for setting up the management cluster to be upgraded log.Logf("Downloading clusterctl binary from %s", clusterctlBinaryURL) - clusterctlBinaryPath := downloadToTmpFile(clusterctlBinaryURL) + clusterctlBinaryPath := downloadToTmpFile(ctx, clusterctlBinaryURL) defer os.Remove(clusterctlBinaryPath) // clean up err := os.Chmod(clusterctlBinaryPath, 0744) //nolint:gosec @@ -391,13 +391,16 @@ func ClusterctlUpgradeSpec(ctx context.Context, inputGetter func() ClusterctlUpg }) } -func downloadToTmpFile(url string) string { +func downloadToTmpFile(ctx context.Context, url string) string { tmpFile, err := os.CreateTemp("", "clusterctl") Expect(err).ToNot(HaveOccurred(), "failed to get temporary file") defer tmpFile.Close() // Get the data - resp, err := http.Get(url) //nolint:gosec + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) + Expect(err).ToNot(HaveOccurred(), "failed to get clusterctl: failed to create request") + + resp, err := http.DefaultClient.Do(req) Expect(err).ToNot(HaveOccurred(), "failed to get clusterctl") defer resp.Body.Close() diff --git a/test/framework/clusterctl/repository.go b/test/framework/clusterctl/repository.go index 8b8aa494e5a9..6bb17bf08585 100644 --- a/test/framework/clusterctl/repository.go +++ b/test/framework/clusterctl/repository.go @@ -143,7 +143,7 @@ func YAMLForComponentSource(ctx context.Context, source ProviderVersionSource) ( switch source.Type { case URLSource: - buf, err := getComponentSourceFromURL(source) + buf, err := getComponentSourceFromURL(ctx, source) if err != nil { return nil, errors.Wrap(err, "failed to get component source YAML from URL") } @@ -173,7 +173,7 @@ func YAMLForComponentSource(ctx context.Context, source ProviderVersionSource) ( } // getComponentSourceFromURL fetches contents of component source YAML file from provided URL source. -func getComponentSourceFromURL(source ProviderVersionSource) ([]byte, error) { +func getComponentSourceFromURL(ctx context.Context, source ProviderVersionSource) ([]byte, error) { var buf []byte u, err := url.Parse(source.Value) @@ -189,14 +189,18 @@ func getComponentSourceFromURL(source ProviderVersionSource) ([]byte, error) { return nil, errors.Wrap(err, "failed to read file") } case httpURIScheme, httpsURIScheme: - resp, err := http.Get(source.Value) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, source.Value, http.NoBody) if err != nil { - return nil, err + return nil, errors.Wrapf(err, "failed to get %s: failed to create request", source.Value) + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, errors.Wrapf(err, "failed to get %s", source.Value) } defer resp.Body.Close() buf, err = io.ReadAll(resp.Body) if err != nil { - return nil, err + return nil, errors.Wrapf(err, "failed to get %s: failed to read body", source.Value) } default: return nil, errors.Errorf("unknown scheme for component source %q: allowed values are file, http, https", u.Scheme) diff --git a/test/framework/kubernetesversions/versions.go b/test/framework/kubernetesversions/versions.go index 2d5e026cbffe..6340229a178f 100644 --- a/test/framework/kubernetesversions/versions.go +++ b/test/framework/kubernetesversions/versions.go @@ -17,12 +17,14 @@ limitations under the License. package kubernetesversions import ( + "context" "fmt" "io" "net/http" "strings" "github.com/blang/semver" + "github.com/pkg/errors" ) const ( @@ -33,14 +35,21 @@ const ( // LatestCIRelease fetches the latest main branch Kubernetes version. func LatestCIRelease() (string, error) { - resp, err := http.Get(ciVersionURL) + ctx := context.TODO() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, ciVersionURL, http.NoBody) if err != nil { - return "", err + return "", errors.Wrapf(err, "failed to get %s: failed to create request", ciVersionURL) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", errors.Wrapf(err, "failed to get %s", ciVersionURL) } defer resp.Body.Close() b, err := io.ReadAll(resp.Body) if err != nil { - return "", err + return "", errors.Wrapf(err, "failed to get %s: failed to read body", ciVersionURL) } return strings.TrimSpace(string(b)), nil @@ -48,18 +57,27 @@ func LatestCIRelease() (string, error) { // LatestPatchRelease returns the latest patch release matching. func LatestPatchRelease(searchVersion string) (string, error) { + ctx := context.TODO() + searchSemVer, err := semver.Make(strings.TrimPrefix(searchVersion, tagPrefix)) if err != nil { return "", err } - resp, err := http.Get(fmt.Sprintf(stableVersionURL, searchSemVer.Major, searchSemVer.Minor)) + + url := fmt.Sprintf(stableVersionURL, searchSemVer.Major, searchSemVer.Minor) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) if err != nil { - return "", err + return "", errors.Wrapf(err, "failed to get %s: failed to create request", url) + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", errors.Wrapf(err, "failed to get %s", url) } defer resp.Body.Close() b, err := io.ReadAll(resp.Body) if err != nil { - return "", err + return "", errors.Wrapf(err, "failed to get %s: failed to read body", url) } return strings.TrimSpace(string(b)), nil diff --git a/test/infrastructure/container/docker.go b/test/infrastructure/container/docker.go index 0c36d288bb1a..610163f0fe87 100644 --- a/test/infrastructure/container/docker.go +++ b/test/infrastructure/container/docker.go @@ -341,28 +341,6 @@ func dockerContainerToContainer(container *types.Container) Container { } } -// ownerAndGroup gets the user configuration for the container (user:group). -func (crc *RunContainerInput) ownerAndGroup() string { - if crc.User != "" { - if crc.Group != "" { - return fmt.Sprintf("%s:%s", crc.User, crc.Group) - } - - return crc.User - } - - return "" -} - -// environmentVariables gets the collection of environment variables for the container. -func (crc *RunContainerInput) environmentVariables() []string { - envVars := []string{} - for key, val := range crc.EnvironmentVars { - envVars = append(envVars, fmt.Sprintf("%s=%s", key, val)) - } - return envVars -} - // RunContainer will run a docker container with the given settings and arguments, returning any errors. func (d *dockerRuntime) RunContainer(ctx context.Context, runConfig *RunContainerInput, output io.Writer) error { containerConfig := dockercontainer.Config{