func getSharedImageStream(namespace, name string) *imageapi.ImageStream { tevList := imageapi.TagEventList{} for _, imgName := range []string{ baseImageWith1LayerDigest, baseImageWith2LayersDigest, childImageWith2LayersDigest, childImageWith3LayersDigest, miscImageDigest, } { tevList.Items = append(tevList.Items, imageapi.TagEvent{ DockerImageReference: fmt.Sprintf("172.30.12.34:5000/test/is@%s", imgName), Image: imgName, }) } sharedIS := imageapi.ImageStream{ ObjectMeta: kapi.ObjectMeta{ Namespace: namespace, Name: name, }, Status: imageapi.ImageStreamStatus{ Tags: map[string]imageapi.TagEventList{ "latest": tevList, }, }, } return &sharedIS }
// DeletingImageStreamPruneFunc returns an ImageStreamPruneFunc that deletes the imageStream. func DeletingImageStreamPruneFunc(streams client.ImageStreamsNamespacer) ImageStreamPruneFunc { return func(stream *imageapi.ImageStream, image *imageapi.Image) (*imageapi.ImageStream, error) { glog.V(4).Infof("Checking if ImageStream %s/%s has references to image in status.tags", stream.Namespace, stream.Name) for tag, history := range stream.Status.Tags { glog.V(4).Infof("Checking tag %q", tag) newHistory := imageapi.TagEventList{} for i, tagEvent := range history.Items { glog.V(4).Infof("Checking tag event %d with image %q", i, tagEvent.Image) if tagEvent.Image != image.Name { glog.V(4).Infof("Tag event doesn't match deleting image - keeping") newHistory.Items = append(newHistory.Items, tagEvent) } } stream.Status.Tags[tag] = newHistory } glog.V(4).Infof("Updating ImageStream %s/%s", stream.Namespace, stream.Name) glog.V(5).Infof("Updated stream: %#v", stream) updatedStream, err := streams.ImageStreams(stream.Namespace).UpdateStatus(stream) if err != nil { return nil, err } return updatedStream, nil } }
// GetSharedImageStream returns an image stream having all the testing images tagged in its status under // latest tag. func GetSharedImageStream(namespace, name string) *imageapi.ImageStream { tevList := imageapi.TagEventList{} for _, imgName := range []string{ BaseImageWith1LayerDigest, BaseImageWith2LayersDigest, ChildImageWith2LayersDigest, ChildImageWith3LayersDigest, MiscImageDigest, } { tevList.Items = append(tevList.Items, imageapi.TagEvent{ DockerImageReference: MakeDockerImageReference("test", "is", imgName), Image: imgName, }) } sharedIS := imageapi.ImageStream{ ObjectMeta: kapi.ObjectMeta{ Namespace: namespace, Name: name, }, Status: imageapi.ImageStreamStatus{ Tags: map[string]imageapi.TagEventList{ "latest": tevList, }, }, } return &sharedIS }
// pruneStreams removes references from all image streams' status.tags entries // to prunable images, invoking streamPruner.PruneImageStream for each updated // stream. func pruneStreams(g graph.Graph, imageNodes []*imagegraph.ImageNode, streamPruner ImageStreamPruner) []error { errs := []error{} glog.V(4).Infof("Removing pruned image references from streams") for _, imageNode := range imageNodes { for _, n := range g.To(imageNode) { streamNode, ok := n.(*imagegraph.ImageStreamNode) if !ok { continue } stream := streamNode.ImageStream updatedTags := sets.NewString() glog.V(4).Infof("Checking if ImageStream %s/%s has references to image %s in status.tags", stream.Namespace, stream.Name, imageNode.Image.Name) for tag, history := range stream.Status.Tags { glog.V(4).Infof("Checking tag %q", tag) newHistory := imageapi.TagEventList{} for i, tagEvent := range history.Items { glog.V(4).Infof("Checking tag event %d with image %q", i, tagEvent.Image) if tagEvent.Image != imageNode.Image.Name { glog.V(4).Infof("Tag event doesn't match deleted image - keeping") newHistory.Items = append(newHistory.Items, tagEvent) } else { glog.V(4).Infof("Tag event matches deleted image - removing reference") updatedTags.Insert(tag) } } if len(newHistory.Items) == 0 { glog.V(4).Infof("Removing tag %q from status.tags of ImageStream %s/%s", tag, stream.Namespace, stream.Name) delete(stream.Status.Tags, tag) } else { stream.Status.Tags[tag] = newHistory } } updatedStream, err := streamPruner.PruneImageStream(stream, imageNode.Image, updatedTags.List()) if err != nil { errs = append(errs, fmt.Errorf("error pruning image from stream: %v", err)) continue } streamNode.ImageStream = updatedStream } } glog.V(4).Infof("Done removing pruned image references from streams") return errs }