// parseImageSource converts image URL-like string to an ImageSource. func parseImageSource(c *cli.Context, name string) (types.ImageSource, error) { var ( certPath = c.GlobalString("cert-path") tlsVerify = c.GlobalBool("tls-verify") // FIXME!! defaults to false? ) switch { case strings.HasPrefix(name, dockerPrefix): return docker.NewDockerImageSource(strings.TrimPrefix(name, dockerPrefix), certPath, tlsVerify) case strings.HasPrefix(name, atomicPrefix): return openshift.NewOpenshiftImageSource(strings.TrimPrefix(name, atomicPrefix), certPath, tlsVerify) case strings.HasPrefix(name, directoryPrefix): return directory.NewDirImageSource(strings.TrimPrefix(name, directoryPrefix)), nil } return nil, fmt.Errorf("Unrecognized image reference %s", name) }
// ensureImageIsResolved sets up s.docker and s.imageStreamImageName func (s *openshiftImageSource) ensureImageIsResolved() error { if s.docker != nil { return nil } // FIXME: validate components per validation.IsValidPathSegmentName? path := fmt.Sprintf("/oapi/v1/namespaces/%s/imagestreams/%s", s.client.namespace, s.client.stream) body, err := s.client.doRequest("GET", path, nil) if err != nil { return err } // Note: This does absolutely no kind/version checking or conversions. var is imageStream if err := json.Unmarshal(body, &is); err != nil { return err } var te *tagEvent for _, tag := range is.Status.Tags { if tag.Tag != s.client.tag { continue } if len(tag.Items) > 0 { te = &tag.Items[0] break } } if te == nil { return fmt.Errorf("No matching tag found") } logrus.Debugf("tag event %#v", te) dockerRef, err := s.client.convertDockerImageReference(te.DockerImageReference) if err != nil { return err } logrus.Debugf("Resolved reference %#v", dockerRef) d, err := docker.NewDockerImageSource(dockerRef, s.certPath, s.tlsVerify) if err != nil { return err } s.docker = d s.imageStreamImageName = te.Image return nil }