diff --git a/pkg/cli/admin/verifyimagesignature/manifest.go b/pkg/cli/admin/verifyimagesignature/manifest.go index e0b0c16504..2438dad3db 100644 --- a/pkg/cli/admin/verifyimagesignature/manifest.go +++ b/pkg/cli/admin/verifyimagesignature/manifest.go @@ -5,6 +5,7 @@ import ( "net/http" "net/url" + "github.com/docker/distribution/registry/client/transport" godigest "github.com/opencontainers/go-digest" "k8s.io/client-go/rest" @@ -27,6 +28,7 @@ func getImageManifestByIDFromRegistry(registry *url.URL, repositoryName, imageID repo, err := registryclient.NewContext(http.DefaultTransport, insecureRT). WithCredentials(credentials). + WithRequestModifiers(transport.NewHeaderRequestModifier(http.Header{http.CanonicalHeaderKey("User-Agent"): []string{rest.DefaultKubernetesUserAgent()}})). Repository(ctx, registry, repositoryName, insecure) if err != nil { return nil, err diff --git a/pkg/cli/image/manifest/manifest.go b/pkg/cli/image/manifest/manifest.go index 283ed1e1cd..e8da354731 100644 --- a/pkg/cli/image/manifest/manifest.go +++ b/pkg/cli/image/manifest/manifest.go @@ -19,6 +19,7 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/distribution/registry/api/errcode" v2 "github.com/docker/distribution/registry/api/v2" + "github.com/docker/distribution/registry/client/transport" "github.com/docker/libtrust" "github.com/opencontainers/go-digest" @@ -129,7 +130,8 @@ func (o *SecurityOptions) NewContext() (*registryclient.Context, error) { return nil, fmt.Errorf("unable to load --registry-config: %v", err) } } - context := registryclient.NewContext(rt, insecureRT).WithCredentials(creds) + context := registryclient.NewContext(rt, insecureRT).WithCredentials(creds). + WithRequestModifiers(transport.NewHeaderRequestModifier(http.Header{http.CanonicalHeaderKey("User-Agent"): []string{rest.DefaultKubernetesUserAgent()}})) context.DisableDigestVerification = o.SkipVerification return context, nil } diff --git a/pkg/cli/registry/info/info.go b/pkg/cli/registry/info/info.go index cf73e76ba4..6689463295 100644 --- a/pkg/cli/registry/info/info.go +++ b/pkg/cli/registry/info/info.go @@ -6,11 +6,13 @@ import ( "net/http" "net/url" + "github.com/docker/distribution/registry/client/transport" "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/client-go/rest" kcmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/util/templates" @@ -184,7 +186,8 @@ func (o *Options) Run() error { fmt.Fprintf(o.ErrOut, "info: Registry does not have a public hostname\n") } url := &url.URL{Host: host} - c := registryclient.NewContext(http.DefaultTransport, http.DefaultTransport) + c := registryclient.NewContext(http.DefaultTransport, http.DefaultTransport). + WithRequestModifiers(transport.NewHeaderRequestModifier(http.Header{http.CanonicalHeaderKey("User-Agent"): []string{rest.DefaultKubernetesUserAgent()}})) _, src, err := c.Ping(ctx, url, false) if err != nil { return fmt.Errorf("registry could not be contacted at %s: %v", url.Host, err) diff --git a/pkg/cli/registry/login/login.go b/pkg/cli/registry/login/login.go index 77a5fe37fb..985fd26322 100644 --- a/pkg/cli/registry/login/login.go +++ b/pkg/cli/registry/login/login.go @@ -13,23 +13,24 @@ import ( "path/filepath" "strings" + "github.com/docker/distribution/registry/client/transport" "github.com/spf13/cobra" - "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/cli-runtime/pkg/genericclioptions" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/util/homedir" + "k8s.io/klog/v2" kcmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/util/templates" imageclient "github.com/openshift/client-go/image/clientset/versioned" "github.com/openshift/library-go/pkg/image/reference" "github.com/openshift/library-go/pkg/image/registryclient" - "k8s.io/cli-runtime/pkg/genericclioptions" ) var ( @@ -284,7 +285,8 @@ func (o *LoginOptions) Run() error { if err != nil { return err } - c := registryclient.NewContext(http.DefaultTransport, insecureRT).WithCredentials(creds) + c := registryclient.NewContext(http.DefaultTransport, insecureRT).WithCredentials(creds). + WithRequestModifiers(transport.NewHeaderRequestModifier(http.Header{http.CanonicalHeaderKey("User-Agent"): []string{rest.DefaultKubernetesUserAgent()}})) if _, err := c.Repository(ctx, url, "does_not_exist", o.Insecure); err != nil { return fmt.Errorf("unable to check your credentials - pass --skip-check to bypass this error: %v", err) } diff --git a/pkg/helpers/newapp/newapptest/newapp_test.go b/pkg/helpers/newapp/newapptest/newapp_test.go index 3c48de63d7..b7b60478f4 100644 --- a/pkg/helpers/newapp/newapptest/newapp_test.go +++ b/pkg/helpers/newapp/newapptest/newapp_test.go @@ -715,7 +715,7 @@ func TestNewAppRunAll(t *testing.T) { Resolvers: cmd.Resolvers{ DockerSearcher: app.DockerClientSearcher{ Client: &apptest.FakeDockerClient{ - Images: []docker.APIImages{{RepoTags: []string{"centos/ruby-27-centos7"}}}, + Images: []docker.APIImages{{RepoTags: []string{"quay.io/centos7/ruby-27-centos7"}}}, Image: dockerBuilderImage(), }, Insecure: true, @@ -1075,7 +1075,7 @@ func TestNewAppRunBuilds(t *testing.T) { config: &cmd.AppConfig{ ComponentInputs: cmd.ComponentInputs{ SourceRepositories: []string{"https://github.com/openshift/ruby-hello-world"}, - DockerImages: []string{"centos/ruby-27-centos7", "openshift/nodejs-010-centos7"}, + DockerImages: []string{"quay.io/centos7/ruby-27-centos7", "openshift/nodejs-010-centos7"}, }, GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, @@ -1181,7 +1181,7 @@ func TestNewAppRunBuilds(t *testing.T) { SourceRepositories: []string{"https://github.com/openshift/ruby-hello-world"}, }, GenerationInputs: cmd.GenerationInputs{ - Dockerfile: "FROM centos/ruby-27-centos7\nRUN false", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7\nRUN false", }, }, expected: map[string][]string{ @@ -1206,7 +1206,7 @@ func TestNewAppRunBuilds(t *testing.T) { if bc.Spec.Source.Dockerfile != nil { got = *bc.Spec.Source.Dockerfile } - want := "FROM centos/ruby-27-centos7\nRUN false" + want := "FROM quay.io/centos7/ruby-27-centos7\nRUN false" if got != want { return fmt.Errorf("bc.Spec.Source.Dockerfile = %q; want %q", got, want) } @@ -1247,7 +1247,7 @@ func TestNewAppRunBuilds(t *testing.T) { }, }, GenerationInputs: cmd.GenerationInputs{ - Dockerfile: "FROM centos/ruby-27-centos7\nRUN false", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7\nRUN false", }, }, expectedErr: func(err error) bool { @@ -1263,13 +1263,13 @@ func TestNewAppRunBuilds(t *testing.T) { }, }, GenerationInputs: cmd.GenerationInputs{ - SourceImage: "centos/mongodb-26-centos7", + SourceImage: "registry.centos.org/centos/mongodb-34-centos7", SourceImagePath: "/src:dst", }, }, expected: map[string][]string{ "buildConfig": {"ruby-hello-world"}, - "imageStream": {"mongodb-26-centos7", "ruby-27-centos7", "ruby-hello-world"}, + "imageStream": {"mongodb-34-centos7", "ruby-27-centos7", "ruby-hello-world"}, }, checkResult: func(res *cmd.AppResult) error { var bc *buildv1.BuildConfig @@ -1287,7 +1287,7 @@ func TestNewAppRunBuilds(t *testing.T) { } var got string - want := "mongodb-26-centos7:latest" + want := "mongodb-34-centos7:latest" got = bc.Spec.Source.Images[0].From.Name if got != want { return fmt.Errorf("bc.Spec.Source.Image.From.Name = %q; want %q", got, want) @@ -1321,13 +1321,13 @@ func TestNewAppRunBuilds(t *testing.T) { }, GenerationInputs: cmd.GenerationInputs{ To: "outputimage", - SourceImage: "centos/mongodb-26-centos7", + SourceImage: "registry.centos.org/centos/mongodb-34-centos7", SourceImagePath: "/src:dst", }, }, expected: map[string][]string{ "buildConfig": {"outputimage"}, - "imageStream": {"mongodb-26-centos7", "nodejs-010-centos7", "outputimage"}, + "imageStream": {"mongodb-34-centos7", "nodejs-010-centos7", "outputimage"}, }, checkResult: func(res *cmd.AppResult) error { var bc *buildv1.BuildConfig @@ -1345,7 +1345,7 @@ func TestNewAppRunBuilds(t *testing.T) { } var got string - want := "mongodb-26-centos7:latest" + want := "mongodb-34-centos7:latest" got = bc.Spec.Source.Images[0].From.Name if got != want { return fmt.Errorf("bc.Spec.Source.Image.From.Name = %q; want %q", got, want) @@ -1420,7 +1420,7 @@ func TestNewAppRunBuilds(t *testing.T) { config: &cmd.AppConfig{ ComponentInputs: cmd.ComponentInputs{ Components: []string{ - "centos/nodejs-4-centos7~https://github.com/sclorg/nodejs-ex", + "registry.centos.org/centos/nodejs-12-centos7~https://github.com/sclorg/nodejs-ex", }, }, GenerationInputs: cmd.GenerationInputs{ @@ -1582,8 +1582,8 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { config: &cmd.AppConfig{ GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, - To: "centos/ruby-27-centos7", - Dockerfile: "FROM centos/ruby-27-centos7:latest", + To: "quay.io/centos7/ruby-27-centos7", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7:latest", }, }, expected: map[string][]string{ @@ -1595,7 +1595,7 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { if err != nil { return err } - want := "--> WARNING: output image of \"centos/ruby-27-centos7:latest\" should be different than input\n" + want := "--> WARNING: output image of \"quay.io/centos7/ruby-27-centos7:latest\" should be different than input\n" if string(got) != want { return fmt.Errorf("stderr: got %q; want %q", got, want) } @@ -1630,7 +1630,7 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { name: "successful build from dockerfile with identical input and output image references with warning(2)", config: &cmd.AppConfig{ GenerationInputs: cmd.GenerationInputs{ - Dockerfile: "FROM centos/ruby-27-centos7\nRUN yum install -y httpd", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7\nRUN yum install -y httpd", To: "ruby-27-centos7", }, }, @@ -1643,7 +1643,7 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { if err != nil { return err } - want := "--> WARNING: output image of \"centos/ruby-27-centos7:latest\" should be different than input\n" + want := "--> WARNING: output image of \"quay.io/centos7/ruby-27-centos7:latest\" should be different than input\n" if string(got) != want { return fmt.Errorf("stderr: got %q; want %q", got, want) } @@ -1668,12 +1668,12 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { name: "unsuccessful build from dockerfile due to identical input and output image references(2)", config: &cmd.AppConfig{ GenerationInputs: cmd.GenerationInputs{ - Dockerfile: "FROM centos/ruby-27-centos7\nRUN yum install -y httpd", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7\nRUN yum install -y httpd", }, }, expectedErr: func(err error) bool { e := app.CircularOutputReferenceError{ - Reference: "centos/ruby-27-centos7:latest", + Reference: "quay.io/centos7/ruby-27-centos7:latest", } return err.Error() == fmt.Errorf("%v, set a different tag with --to", e).Error() }, @@ -1683,8 +1683,8 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { config: &cmd.AppConfig{ GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, - To: "centos/ruby-27-centos7", - Dockerfile: "FROM centos/ruby-27-centos7", + To: "quay.io/centos7/ruby-27-centos7", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7", }, Resolvers: cmd.Resolvers{ DockerSearcher: app.DockerClientSearcher{ @@ -1703,7 +1703,7 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { if err != nil { return err } - want := "--> WARNING: output image of \"centos/ruby-27-centos7:latest\" should be different than input\n" + want := "--> WARNING: output image of \"quay.io/centos7/ruby-27-centos7:latest\" should be different than input\n" if string(got) != want { return fmt.Errorf("stderr: got %q; want %q", got, want) } @@ -1715,8 +1715,8 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { config: &cmd.AppConfig{ GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, - To: "centos/ruby-27-centos7", - Dockerfile: "FROM centos/ruby-27-centos7:latest", + To: "quay.io/centos7/ruby-27-centos7", + Dockerfile: "FROM quay.io/centos7/ruby-27-centos7:latest", }, Resolvers: cmd.Resolvers{ DockerSearcher: app.DockerClientSearcher{ @@ -1735,7 +1735,7 @@ func TestNewAppBuildOutputCycleDetection(t *testing.T) { if err != nil { return err } - want := "--> WARNING: output image of \"centos/ruby-27-centos7:latest\" should be different than input\n" + want := "--> WARNING: output image of \"quay.io/centos7/ruby-27-centos7:latest\" should be different than input\n" if string(got) != want { return fmt.Errorf("stderr: got %q; want %q", got, want) } @@ -1816,7 +1816,7 @@ func TestNewAppNewBuildEnvVars(t *testing.T) { config: &cmd.AppConfig{ ComponentInputs: cmd.ComponentInputs{ SourceRepositories: []string{"https://github.com/openshift/ruby-hello-world"}, - DockerImages: []string{"centos/ruby-27-centos7", "openshift/nodejs-010-centos7"}, + DockerImages: []string{"quay.io/centos7/ruby-27-centos7", "registry.centos.org/centos/nodejs-12-centos7"}, }, GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, @@ -1892,7 +1892,7 @@ func TestNewAppBuildConfigEnvVarsAndSecrets(t *testing.T) { config: &cmd.AppConfig{ ComponentInputs: cmd.ComponentInputs{ SourceRepositories: []string{"https://github.com/openshift/ruby-hello-world"}, - DockerImages: []string{"centos/ruby-27-centos7", "centos/mongodb-26-centos7"}, + DockerImages: []string{"quay.io/centos7/ruby-27-centos7", "registry.centos.org/centos/mongodb-34-centos7"}, }, GenerationInputs: cmd.GenerationInputs{ OutputDocker: true, @@ -2327,7 +2327,7 @@ func fakeDockerSearcher() app.Searcher { func fakeSimpleDockerSearcher() app.Searcher { return app.DockerClientSearcher{ Client: &apptest.FakeDockerClient{ - Images: []docker.APIImages{{RepoTags: []string{"centos/ruby-27-centos7"}}}, + Images: []docker.APIImages{{RepoTags: []string{"quay.io/centos7/ruby-27-centos7"}}}, Image: &docker.Image{ ID: "ruby", Config: &docker.Config{