func (ra *RepositoryAPI) initRepositoryClient(repoName string) (r *registry.Repository, err error) { endpoint := os.Getenv("REGISTRY_URL") username, password, ok := ra.Ctx.Request.BasicAuth() if ok { return newRepositoryClient(endpoint, api.GetIsInsecure(), username, password, repoName, "repository", repoName, "pull", "push", "*") } username, err = ra.getUsername() if err != nil { return nil, err } return cache.NewRepositoryClient(endpoint, api.GetIsInsecure(), username, repoName, "repository", repoName, "pull", "push", "*") }
// Ping validates whether the target is reachable and whether the credential is valid func (t *TargetAPI) Ping() { var endpoint, username, password string idStr := t.GetString("id") if len(idStr) != 0 { id, err := strconv.ParseInt(idStr, 10, 64) if err != nil { t.CustomAbort(http.StatusBadRequest, fmt.Sprintf("id %s is invalid", idStr)) } target, err := dao.GetRepTarget(id) if err != nil { log.Errorf("failed to get target %d: %v", id, err) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } if target == nil { t.CustomAbort(http.StatusNotFound, http.StatusText(http.StatusNotFound)) } endpoint = target.URL username = target.Username password = target.Password if len(password) != 0 { password, err = utils.ReversibleDecrypt(password, t.secretKey) if err != nil { log.Errorf("failed to decrypt password: %v", err) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } } } else { endpoint = t.GetString("endpoint") if len(endpoint) == 0 { t.CustomAbort(http.StatusBadRequest, "id or endpoint is needed") } username = t.GetString("username") password = t.GetString("password") } registry, err := newRegistryClient(endpoint, api.GetIsInsecure(), username, password, "", "", "") if err != nil { // timeout, dns resolve error, connection refused, etc. if urlErr, ok := err.(*url.Error); ok { if netErr, ok := urlErr.Err.(net.Error); ok { t.CustomAbort(http.StatusBadRequest, netErr.Error()) } t.CustomAbort(http.StatusBadRequest, urlErr.Error()) } log.Errorf("failed to create registry client: %#v", err) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } if err = registry.Ping(); err != nil { if regErr, ok := err.(*registry_error.Error); ok { t.CustomAbort(regErr.StatusCode, regErr.Detail) } log.Errorf("failed to ping registry %s: %v", registry.Endpoint.String(), err) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } }