// Get retrieves an image by ID that has previously been tagged into an image stream. // `id` is of the form <repo name>@<image id>. func (r *REST) Get(ctx kapi.Context, id string) (runtime.Object, error) { name, imageID, err := ParseNameAndID(id) if err != nil { return nil, err } repo, err := r.imageStreamRegistry.GetImageStream(ctx, name) if err != nil { return nil, err } if repo.Status.Tags == nil { return nil, errors.NewNotFound("imageStreamImage", imageID) } set := api.ResolveImageID(repo, imageID) switch len(set) { case 1: imageName := set.List()[0] image, err := r.imageRegistry.GetImage(ctx, imageName) if err != nil { return nil, err } imageWithMetadata, err := api.ImageWithMetadata(*image) if err != nil { return nil, err } if d, err := digest.ParseDigest(imageName); err == nil { imageName = d.Hex() } if len(imageName) > 7 { imageName = imageName[:7] } isi := api.ImageStreamImage{ ObjectMeta: kapi.ObjectMeta{ Namespace: kapi.NamespaceValue(ctx), Name: fmt.Sprintf("%s@%s", name, imageName), }, Image: *imageWithMetadata, } return &isi, nil case 0: return nil, errors.NewNotFound("imageStreamImage", imageID) default: return nil, errors.NewConflict("imageStreamImage", imageID, fmt.Errorf("multiple images match the prefix %q: %s", imageID, strings.Join(set.List(), ", "))) } }
// Get retrieves an image that has been tagged by stream and tag. `id` is of the format // <stream name>:<tag>. func (r *REST) Get(ctx kapi.Context, id string) (runtime.Object, error) { name, tag, err := nameAndTag(id) if err != nil { return nil, err } stream, err := r.imageStreamRegistry.GetImageStream(ctx, name) if err != nil { return nil, err } event := api.LatestTaggedImage(stream, tag) if event == nil || len(event.Image) == 0 { return nil, errors.NewNotFound("imageStreamTag", id) } image, err := r.imageRegistry.GetImage(ctx, event.Image) if err != nil { return nil, err } // if the stream has Spec.Tags[tag].Annotations[k] = v, copy it to the image's annotations if stream.Spec.Tags != nil { if tagRef, ok := stream.Spec.Tags[tag]; ok { if image.Annotations == nil { image.Annotations = make(map[string]string) } for k, v := range tagRef.Annotations { image.Annotations[k] = v } } } imageWithMetadata, err := api.ImageWithMetadata(*image) if err != nil { return nil, err } ist := api.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Namespace: kapi.NamespaceValue(ctx), Name: id, }, Image: *imageWithMetadata, } return &ist, nil }