// parseNameAndID splits a string into its name component and ID component, and returns an error // if the string is not in the right form. func parseNameAndID(input string) (name string, id string, err error) { name, id, err = api.ParseImageStreamImageName(input) if err != nil { err = errors.NewBadRequest("ImageStreamImages must be retrieved with <name>@<id>") } return }
// GetImageLabels retrieves Docker labels from image from image repository name and // image reference func GetImageLabels(c client.ImageStreamImageInterface, imageRepoName, imageRef string) (map[string]string, error) { _, imageID, err := api.ParseImageStreamImageName(imageRef) image, err := c.Get(imageRepoName, imageID) if err != nil { return map[string]string{}, err } return image.Image.DockerImageMetadata.Config.Labels, nil }
// addBuildStrategyImageReferencesToGraph ads references from the build strategy's parent node to the image // the build strategy references. // // Edges are added to the graph from each predecessor (build or build config) // to the image specified by strategy.from, as long as the image is managed by // OpenShift. func addBuildStrategyImageReferencesToGraph(g graph.Graph, strategy buildapi.BuildStrategy, predecessor gonum.Node) { from := buildutil.GetInputReference(strategy) if from == nil { glog.V(4).Infof("Unable to determine 'from' reference - skipping") return } glog.V(4).Infof("Examining build strategy with from: %#v", from) var imageID string switch from.Kind { case "ImageStreamImage": _, id, err := imageapi.ParseImageStreamImageName(from.Name) if err != nil { glog.V(2).Infof("Error parsing ImageStreamImage name %q: %v - skipping", from.Name, err) return } imageID = id case "DockerImage": ref, err := imageapi.ParseDockerImageReference(from.Name) if err != nil { glog.V(2).Infof("Error parsing DockerImage name %q: %v - skipping", from.Name, err) return } imageID = ref.ID default: return } glog.V(4).Infof("Looking for image %q in graph", imageID) imageNode := imagegraph.FindImage(g, imageID) if imageNode == nil { glog.V(4).Infof("Unable to find image %q in graph - skipping", imageID) return } glog.V(4).Infof("Adding edge from %v to %v", predecessor, imageNode) g.AddEdge(predecessor, imageNode, ReferencedImageEdgeKind) }
// deleteTestImagesAndStreams deletes test images built in current and shared // namespaces. It also deletes shared projects. func deleteTestImagesAndStreams(oc *exutil.CLI) { for _, projectName := range []string{ oc.Namespace() + "-s2", oc.Namespace() + "-s1", oc.Namespace() + "-shared", oc.Namespace(), } { g.By(fmt.Sprintf("Deleting images and image streams in project %q", projectName)) iss, err := oc.AdminClient().ImageStreams(projectName).List(kapi.ListOptions{}) if err != nil { continue } for _, is := range iss.Items { for _, history := range is.Status.Tags { for i := range history.Items { oc.AdminClient().Images().Delete(history.Items[i].Image) } } for _, tagRef := range is.Spec.Tags { switch tagRef.From.Kind { case "ImageStreamImage": _, id, err := imageapi.ParseImageStreamImageName(tagRef.From.Name) if err != nil { continue } oc.AdminClient().Images().Delete(id) } } } // let the extended framework take care of the current namespace if projectName != oc.Namespace() { g.By(fmt.Sprintf("Deleting project %q", projectName)) oc.AdminClient().Projects().Delete(projectName) } } }