diff --git a/pkg/image/registry/imagestreamimage/rest.go b/pkg/image/registry/imagestreamimage/rest.go index bb360051214c..fb8dac5d6e89 100644 --- a/pkg/image/registry/imagestreamimage/rest.go +++ b/pkg/image/registry/imagestreamimage/rest.go @@ -70,6 +70,7 @@ func (r *REST) Get(ctx kapi.Context, id string) (runtime.Object, error) { return nil, err } image.DockerImageManifest = "" + image.DockerImageConfig = "" isi := api.ImageStreamImage{ ObjectMeta: kapi.ObjectMeta{ diff --git a/pkg/image/registry/imagestreamimport/rest.go b/pkg/image/registry/imagestreamimport/rest.go index bb69823bbf37..801b5f99d584 100644 --- a/pkg/image/registry/imagestreamimport/rest.go +++ b/pkg/image/registry/imagestreamimport/rest.go @@ -436,6 +436,7 @@ func clearManifests(isi *api.ImageStreamImport) { if !isi.Spec.Images[i].IncludeManifest { if isi.Status.Images[i].Image != nil { isi.Status.Images[i].Image.DockerImageManifest = "" + isi.Status.Images[i].Image.DockerImageConfig = "" } } } @@ -443,6 +444,7 @@ func clearManifests(isi *api.ImageStreamImport) { for i := range isi.Status.Repository.Images { if isi.Status.Repository.Images[i].Image != nil { isi.Status.Repository.Images[i].Image.DockerImageManifest = "" + isi.Status.Repository.Images[i].Image.DockerImageConfig = "" } } } diff --git a/pkg/image/registry/imagestreamtag/rest.go b/pkg/image/registry/imagestreamtag/rest.go index 14bd91b78a7c..39ebf8af386f 100644 --- a/pkg/image/registry/imagestreamtag/rest.go +++ b/pkg/image/registry/imagestreamtag/rest.go @@ -372,6 +372,7 @@ func newISTag(tag string, imageStream *imageapi.ImageStream, image *imageapi.Ima return nil, err } image.DockerImageManifest = "" + image.DockerImageConfig = "" ist.Image = *image } else { ist.Image = imageapi.Image{} diff --git a/test/integration/imagestream_test.go b/test/integration/imagestream_test.go index 4e9ca659c45e..09df263cf4bb 100644 --- a/test/integration/imagestream_test.go +++ b/test/integration/imagestream_test.go @@ -1,6 +1,7 @@ package integration import ( + "encoding/json" "os" "reflect" "testing" @@ -11,6 +12,7 @@ import ( deployapi "github.com/openshift/origin/pkg/deploy/api" stratsupport "github.com/openshift/origin/pkg/deploy/strategy/support" + imagetest "github.com/openshift/origin/pkg/image/admission/testutil" imageapi "github.com/openshift/origin/pkg/image/api" testutil "github.com/openshift/origin/test/util" testserver "github.com/openshift/origin/test/util/server" @@ -282,6 +284,104 @@ func TestImageStreamMappingCreate(t *testing.T) { } } +func TestImageStreamWithoutDockerImageConfig(t *testing.T) { + testutil.RequireEtcd(t) + defer testutil.DumpEtcdOnFailure(t) + _, clusterAdminKubeConfig, err := testserver.StartTestMasterAPI() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace()) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + stream := mockImageStream() + + expected, err := clusterAdminClient.ImageStreams(testutil.Namespace()).Create(stream) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if expected.Name == "" { + t.Errorf("Unexpected empty image Name %v", expected) + } + + imageConfig := imageapi.DockerConfig{ + Hostname: "example.com", + Env: []string{"A=B"}, + } + + imageConfigBytes, err := json.Marshal(imageConfig) + if err != nil { + t.Fatalf("error marshaling image config: %s", err) + } + + image := imageapi.Image{ + ObjectMeta: kapi.ObjectMeta{ + Name: imagetest.BaseImageWith1LayerDigest, + }, + DockerImageMetadata: imageapi.DockerImage{ + Config: &imageapi.DockerConfig{ + Hostname: "example.com", + Env: []string{"A=B"}, + }, + }, + DockerImageConfig: string(imageConfigBytes), + DockerImageReference: "some/namespace/name", + } + + // create a mapping to an image that doesn't exist + mapping := &imageapi.ImageStreamMapping{ + ObjectMeta: kapi.ObjectMeta{ + Name: stream.Name, + }, + Tag: "newer", + Image: image, + } + if err := clusterAdminClient.ImageStreamMappings(testutil.Namespace()).Create(mapping); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + img, err := clusterAdminClient.Images().Get(image.Name) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if img.Name != image.Name { + t.Fatalf("unexpected image: %#v", img) + } + if len(img.DockerImageConfig) == 0 { + t.Fatalf("image has an empty config: %#v", img) + } + + ist, err := clusterAdminClient.ImageStreamTags(testutil.Namespace()).Get(stream.Name, "newer") + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if ist.Image.Name != image.Name { + t.Fatalf("unexpected image: %#v", img) + } + if len(ist.Image.DockerImageConfig) != 0 { + t.Errorf("image has a not empty config: %#v", ist) + } + + isi, err := clusterAdminClient.ImageStreamImages(testutil.Namespace()).Get(stream.Name, imagetest.BaseImageWith1LayerDigest) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if isi.Image.Name != image.Name { + t.Fatalf("unexpected image: %#v", img) + } + if len(isi.Image.DockerImageConfig) != 0 { + t.Errorf("image has a not empty config: %#v", isi) + } + +} + func TestImageStreamTagLifecycleHook(t *testing.T) { testutil.RequireEtcd(t) defer testutil.DumpEtcdOnFailure(t)