func tagReferenceToTagEvent(stream *api.ImageStream, tagRef api.TagReference, tagOrID string) (*api.TagEvent, error) { switch tagRef.From.Kind { case "DockerImage": return &api.TagEvent{ Created: util.Now(), DockerImageReference: tagRef.From.Name, }, nil case "ImageStreamImage": ref, err := api.DockerImageReferenceForStream(stream) if err != nil { return nil, err } resolvedIDs := api.ResolveImageID(stream, tagOrID) switch len(resolvedIDs) { case 1: ref.ID = resolvedIDs.List()[0] return &api.TagEvent{ Created: util.Now(), DockerImageReference: ref.String(), Image: ref.ID, }, nil case 0: return nil, fmt.Errorf("no images match the prefix %q", tagOrID) default: return nil, fmt.Errorf("multiple images match the prefix %q: %s", tagOrID, strings.Join(resolvedIDs.List(), ", ")) } case "ImageStreamTag": return api.LatestTaggedImage(stream, tagOrID), nil default: return nil, fmt.Errorf("invalid from.kind %q: it must be ImageStreamImage or ImageStreamTag", tagRef.From.Kind) } }
// resolveImageStreamReference looks up the ImageStream[Tag/Image] and converts it to a // docker pull spec that can be used in an Image field. func (g *BuildGenerator) resolveImageStreamReference(ctx kapi.Context, from *kapi.ObjectReference, defaultNamespace string) (string, error) { var namespace string if len(from.Namespace) != 0 { namespace = from.Namespace } else { namespace = defaultNamespace } glog.V(4).Infof("Resolving ImageStreamReference %s of Kind %s in namespace %s", from.Name, from.Kind, namespace) switch from.Kind { case "ImageStream": // NOTE: The 'ImageStream' reference should be used only for the 'output' image is, err := g.Client.GetImageStream(kapi.WithNamespace(ctx, namespace), from.Name) if err != nil { glog.V(2).Infof("Error getting ImageStream %s/%s: %v", namespace, from.Name, err) return "", err } image, err := imageapi.DockerImageReferenceForStream(is) if err != nil { glog.V(2).Infof("Error resolving Docker image reference for %s/%s: %v", namespace, from.Name, err) return "", err } return image.String(), nil case "ImageStreamImage": imageStreamImage, err := g.Client.GetImageStreamImage(kapi.WithNamespace(ctx, namespace), from.Name) if err != nil { glog.V(2).Infof("Error ImageStreamReference %s in namespace %s: %v", from.Name, namespace, err) if errors.IsNotFound(err) { return "", err } return "", fatalError{err} } image := imageStreamImage.Image glog.V(4).Infof("Resolved ImageStreamReference %s to image %s with reference %s in namespace %s", from.Name, image.Name, image.DockerImageReference, namespace) return image.DockerImageReference, nil case "ImageStreamTag": imageStreamTag, err := g.Client.GetImageStreamTag(kapi.WithNamespace(ctx, namespace), from.Name) if err != nil { glog.V(2).Infof("Error resolving ImageStreamTag reference %s in namespace %s: %v", from.Name, namespace, err) if errors.IsNotFound(err) { return "", err } return "", fatalError{err} } image := imageStreamTag.Image glog.V(4).Infof("Resolved ImageStreamTag %s to image %s with reference %s in namespace %s", from.Name, image.Name, image.DockerImageReference, namespace) return image.DockerImageReference, nil case "DockerImage": return from.Name, nil default: return "", fatalError{fmt.Errorf("Unknown From Kind %s", from.Kind)} } }