// ResolveImagePullSpec resolves the provided source which can be "docker", "istag" or // "isimage" and returns the full Docker pull spec. func ResolveImagePullSpec(images client.ImageStreamImagesNamespacer, tags client.ImageStreamTagsNamespacer, source, name, defaultNamespace string) (string, error) { // for Docker source, just passtrough the image name if IsDocker(source) { return name, nil } // parse the namespace from the provided image namespace, image := splitNamespaceAndImage(name) if len(namespace) == 0 { namespace = defaultNamespace } dockerImageReference := "" if IsImageStreamTag(source) { name, tag, ok := imageapi.SplitImageStreamTag(image) if !ok { return "", fmt.Errorf("invalid image stream tag %q, must be of the form [NAMESPACE/]NAME:TAG", name) } if resolved, err := tags.ImageStreamTags(namespace).Get(name, tag); err != nil { return "", fmt.Errorf("failed to get image stream tag %q: %v", name, err) } else { dockerImageReference = resolved.Image.DockerImageReference } } if IsImageStreamImage(source) { name, digest, ok := imageapi.SplitImageStreamImage(image) if !ok { return "", fmt.Errorf("invalid image stream image %q, must be of the form [NAMESPACE/]NAME@DIGEST", name) } if resolved, err := images.ImageStreamImages(namespace).Get(name, digest); err != nil { return "", fmt.Errorf("failed to get image stream image %q: %v", name, err) } else { dockerImageReference = resolved.Image.DockerImageReference } } if len(dockerImageReference) == 0 { return "", fmt.Errorf("unable to resolve %s %q", source, name) } reference, err := imageapi.ParseDockerImageReference(dockerImageReference) if err != nil { return "", err } return reference.String(), nil }
// NewImageStreamTagEvaluator computes resource usage of ImageStreamsTags. Its sole purpose is to handle // UPDATE admission operations on imageStreamTags resource. func NewImageStreamTagEvaluator(istNamespacer osclient.ImageStreamTagsNamespacer, isNamespacer osclient.ImageStreamsNamespacer) kquota.Evaluator { computeResources := []kapi.ResourceName{ imageapi.ResourceImageStreams, } matchesScopeFunc := func(kapi.ResourceQuotaScope, runtime.Object) bool { return true } getFuncByNamespace := func(namespace, id string) (runtime.Object, error) { isName, tag, err := imageapi.ParseImageStreamTagName(id) if err != nil { return nil, err } obj, err := istNamespacer.ImageStreamTags(namespace).Get(isName, tag) if err != nil { if !kerrors.IsNotFound(err) { return nil, err } obj = &imageapi.ImageStreamTag{ ObjectMeta: kapi.ObjectMeta{ Namespace: namespace, Name: id, }, } } return obj, nil } return &generic.GenericEvaluator{ Name: imageStreamTagEvaluatorName, InternalGroupKind: imageapi.Kind("ImageStreamTag"), InternalOperationResources: map[admission.Operation][]kapi.ResourceName{ admission.Update: computeResources, admission.Create: computeResources, }, MatchedResourceNames: computeResources, MatchesScopeFunc: matchesScopeFunc, UsageFunc: makeImageStreamTagAdmissionUsageFunc(isNamespacer), GetFuncByNamespace: getFuncByNamespace, ListFuncByNamespace: func(namespace string, options kapi.ListOptions) (runtime.Object, error) { return &imageapi.ImageStreamTagList{}, nil }, ConstraintsFunc: imageStreamTagConstraintsFunc, } }