Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pkg/cli/importimage/importimage.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ func NewImportImageOptions(streams genericiooptions.IOStreams) *ImportImageOptio
PrintFlags: genericclioptions.NewPrintFlags("imported"),
IOStreams: streams,
ReferencePolicy: tag.SourceReferencePolicy,
ImportMode: string(imagev1.ImportModeLegacy),
}
}

Expand Down Expand Up @@ -129,7 +128,7 @@ func NewCmdImportImage(f kcmdutil.Factory, streams genericiooptions.IOStreams) *
cmd.Flags().BoolVar(&o.Confirm, "confirm", o.Confirm, "If true, allow the image stream import location to be set or changed")
cmd.Flags().BoolVar(&o.All, "all", o.All, "If true, import all tags from the provided source on creation or if --from is specified")
cmd.Flags().StringVar(&o.ReferencePolicy, "reference-policy", o.ReferencePolicy, "Allow to request pullthrough for external image when set to 'local'. Defaults to 'source'.")
cmd.Flags().StringVar(&o.ImportMode, "import-mode", o.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. Defaults to 'Legacy'.")
cmd.Flags().StringVar(&o.ImportMode, "import-mode", o.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. When set to 'Legacy', imports a single sub-manifest. When unspecified, the cluster determines the import mode.")
Copy link
Copy Markdown
Member

@ardaguclu ardaguclu Jan 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't this be a breaking change?. Because we implicitly change a default behavior. So people who rely on Legacy behavior by default will start getting failures?.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default behavior will only change for clusters installed with the multi-arch payload, where the expectation is that images are manifestlisted. That being said, we should document that on multi-arch clusters, the default behavior is importing manifestlisted images and to get the legacy behavior, --import-mode=Legacy needs to be added.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense. Let's update When unspecified, the cluster determines the import mode. to more explicit about the behavior, such as "When unspecified, if the cluster is single-arch, it will be Legacy; if the cluster is multi-arch, it will PreserveOriginal", etc.

cmd.Flags().BoolVar(&o.DryRun, "dry-run", o.DryRun, "Fetch information about images without creating or updating an image stream.")
cmd.Flags().BoolVar(&o.Scheduled, "scheduled", o.Scheduled, "Set each imported container image to be periodically imported from a remote repository. Defaults to false.")
cmd.Flags().BoolVar(&o.Insecure, "insecure", o.Insecure, "If true, allow importing from registries that have invalid HTTPS certificates or are hosted via HTTP. This flag will take precedence over the insecure annotation.")
Expand Down Expand Up @@ -218,7 +217,8 @@ func (o *ImportImageOptions) Validate() error {
case string(imagev1.ImportModeLegacy):
case string(imagev1.ImportModePreserveOriginal):
case "":
o.ImportMode = string(imagev1.ImportModeLegacy)
// Leave empty and let it be decided based on the ClusterVersion's "desired.architecture" value. If the value is "Multi",
// the import mode is set to "PreserveOriginal", if not it is set to "Legacy"
default:
return fmt.Errorf("valid ImportMode values are %s or %s", imagev1.ImportModeLegacy, imagev1.ImportModePreserveOriginal)
}
Expand Down
56 changes: 28 additions & 28 deletions pkg/cli/importimage/importimage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "nonexisting"},
To: &corev1.LocalObjectReference{Name: "latest"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"confirmed import all from non-existing": {
Expand All @@ -50,7 +50,7 @@ func TestCreateImageImport(t *testing.T) {
expectedRepository: &imagev1.RepositoryImportSpec{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "nonexisting"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
"import from .spec.dockerImageRepository": {
Expand All @@ -66,7 +66,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
To: &corev1.LocalObjectReference{Name: "latest"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"import from .spec.dockerImageRepository non-existing tag": {
Expand All @@ -93,7 +93,7 @@ func TestCreateImageImport(t *testing.T) {
expectedRepository: &imagev1.RepositoryImportSpec{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
"import all from .spec.dockerImageRepository with different from": {
Expand Down Expand Up @@ -124,7 +124,7 @@ func TestCreateImageImport(t *testing.T) {
expectedRepository: &imagev1.RepositoryImportSpec{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "totally/different/spec"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
"import all from .spec.tags": {
Expand All @@ -144,13 +144,13 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:latest"},
To: &corev1.LocalObjectReference{Name: "latest"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
},
Expand All @@ -174,13 +174,13 @@ func TestCreateImageImport(t *testing.T) {
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:latest"},
To: &corev1.LocalObjectReference{Name: "latest"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
},
Expand All @@ -202,13 +202,13 @@ func TestCreateImageImport(t *testing.T) {
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:latest"},
To: &corev1.LocalObjectReference{Name: "latest"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
},
Expand Down Expand Up @@ -250,7 +250,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:latest"},
To: &corev1.LocalObjectReference{Name: "latest"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"import existing tag": {
Expand All @@ -270,7 +270,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:latest"},
To: &corev1.LocalObjectReference{Name: "existing"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"import non-existing tag": {
Expand Down Expand Up @@ -308,7 +308,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"use tag aliases": {
Expand All @@ -330,7 +330,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"import tag from alias of cross-image-stream": {
Expand Down Expand Up @@ -403,7 +403,7 @@ func TestCreateImageImport(t *testing.T) {
expectedImages: []imagev1.ImageImportSpec{{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
To: &corev1.LocalObjectReference{Name: "latest"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
}},
},
Expand All @@ -424,7 +424,7 @@ func TestCreateImageImport(t *testing.T) {
expectedImages: []imagev1.ImageImportSpec{{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
To: &corev1.LocalObjectReference{Name: "latest"},
ImportPolicy: imagev1.TagImportPolicy{Insecure: false, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Insecure: false},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
}},
},
Expand All @@ -446,7 +446,7 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.LocalTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
}},
},
"import all from .spec.tags setting referencePolicy": {
Expand All @@ -467,13 +467,13 @@ func TestCreateImageImport(t *testing.T) {
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.LocalTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.LocalTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
},
Expand All @@ -491,7 +491,7 @@ func TestCreateImageImport(t *testing.T) {
expectedRepository: &imagev1.RepositoryImportSpec{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.LocalTagReferencePolicy},
ImportPolicy: imagev1.TagImportPolicy{ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{},
},
},
"import tag setting scheduled": {
Expand All @@ -511,7 +511,7 @@ func TestCreateImageImport(t *testing.T) {
expectedImages: []imagev1.ImageImportSpec{{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
}},
},
Expand All @@ -533,7 +533,7 @@ func TestCreateImageImport(t *testing.T) {
expectedImages: []imagev1.ImageImportSpec{{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
}},
},
Expand All @@ -554,13 +554,13 @@ func TestCreateImageImport(t *testing.T) {
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
},
Expand All @@ -586,13 +586,13 @@ func TestCreateImageImport(t *testing.T) {
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:mytag"},
To: &corev1.LocalObjectReference{Name: "mytag"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage:other"},
To: &corev1.LocalObjectReference{Name: "other"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: false, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: false},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
},
Expand All @@ -610,7 +610,7 @@ func TestCreateImageImport(t *testing.T) {
},
expectedRepository: &imagev1.RepositoryImportSpec{
From: corev1.ObjectReference{Kind: "DockerImage", Name: "repo.com/somens/someimage"},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true, ImportMode: imagev1.ImportModeLegacy},
ImportPolicy: imagev1.TagImportPolicy{Scheduled: true},
ReferencePolicy: imagev1.TagReferencePolicy{Type: imagev1.SourceTagReferencePolicy},
},
},
Expand Down
2 changes: 1 addition & 1 deletion pkg/cli/newapp/newapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ func NewCmdNewApplication(f kcmdutil.Factory, streams genericiooptions.IOStreams
cmd.Flags().StringVar(&o.Config.SourceSecret, "source-secret", o.Config.SourceSecret, "The name of an existing secret that should be used for cloning a private git repository.")
cmd.Flags().BoolVar(&o.Config.SkipGeneration, "no-install", o.Config.SkipGeneration, "Do not attempt to run images that describe themselves as being installable")
cmd.Flags().BoolVar(&o.Config.BinaryBuild, "binary", o.Config.BinaryBuild, "Instead of expecting a source URL, set the build to expect binary contents. Will disable triggers.")
cmd.Flags().StringVar(&o.Config.ImportMode, "import-mode", o.Config.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. Defaults to 'Legacy'.")
cmd.Flags().StringVar(&o.Config.ImportMode, "import-mode", o.Config.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. When set to 'Legacy', imports a single sub-manifest. When unspecified, the cluster determines the import mode.")

o.Action.BindForOutput(cmd.Flags(), "output", "template")
cmd.Flags().String("output-version", "", "The preferred API versions of the output objects")
Expand Down
2 changes: 1 addition & 1 deletion pkg/cli/newbuild/newbuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func NewCmdNewBuild(f kcmdutil.Factory, streams genericiooptions.IOStreams) *cob
cmd.Flags().BoolVar(&o.Config.NoOutput, "no-output", o.Config.NoOutput, "If true, the build output will not be pushed anywhere.")
cmd.Flags().StringVar(&o.Config.SourceImage, "source-image", o.Config.SourceImage, "Specify an image to use as source for the build. You must also specify --source-image-path.")
cmd.Flags().StringVar(&o.Config.SourceImagePath, "source-image-path", o.Config.SourceImagePath, "Specify the file or directory to copy from the source image and its destination in the build directory. Format: [source]:[destination-dir].")
cmd.Flags().StringVar(&o.Config.ImportMode, "import-mode", o.Config.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. Defaults to 'Legacy'.")
cmd.Flags().StringVar(&o.Config.ImportMode, "import-mode", o.Config.ImportMode, "Imports the full manifest list of a tag when set to 'PreserveOriginal'. When set to 'Legacy', imports a single sub-manifest. When unspecified, the cluster determines the import mode.")

o.Action.BindForOutput(cmd.Flags(), "output", "template", "sort-by")
cmd.Flags().String("output-version", "", "The preferred API versions of the output objects")
Expand Down
Loading