diff --git a/job/replication/transfer.go b/job/replication/transfer.go index 82d986cad..9365f932c 100644 --- a/job/replication/transfer.go +++ b/job/replication/transfer.go @@ -186,112 +186,29 @@ func (c *Checker) Enter() (string, error) { } func (c *Checker) enter() (string, error) { -enter: - exist, canWrite, err := c.projectExist() + project, err := dao.GetProjectByName(c.project) if err != nil { - c.logger.Errorf("an error occurred while checking existence of project %s on %s with user %s : %v", c.project, c.dstURL, c.dstUsr, err) + c.logger.Errorf("an error occurred while getting project %s in DB: %v", c.project, err) return "", err } - if !exist { - project, err := dao.GetProjectByName(c.project) - if err != nil { - c.logger.Errorf("an error occurred while getting project %s on %s: %v", c.project, c.srcURL, err) - return "", err - } - err = c.createProject(project.Public == 1) - if err != nil { - // other job may be also doing the same thing when the current job - // is creating project, so when the response code is 409, re-check - // the existence of project - if err == ErrConflict { - goto enter - } else { - c.logger.Errorf("an error occurred while creating project %s on %s with user %s : %v", c.project, c.dstURL, c.dstUsr, err) - return "", err - } - } + err = c.createProject(project.Public == 1) + if err == nil { c.logger.Infof("project %s is created on %s with user %s", c.project, c.dstURL, c.dstUsr) return StatePullManifest, nil } - c.logger.Infof("project %s already exists on %s", c.project, c.dstURL) - - if !canWrite { - err = fmt.Errorf("the user %s is unauthorized to write to project %s on %s", c.dstUsr, c.project, c.dstURL) - c.logger.Errorf("%v", err) - return "", err - } - c.logger.Infof("the user %s has write privilege to project %s on %s", c.dstUsr, c.project, c.dstURL) - - return StatePullManifest, nil -} - -// check the existence of project, if it exists, returning whether the user has write privilege to it -func (c *Checker) projectExist() (exist, canWrite bool, err error) { - url := strings.TrimRight(c.dstURL, "/") + "/api/projects/?project_name=" + c.project - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return + // other job may be also doing the same thing when the current job + // is creating project, so when the response code is 409, continue + // to do next step + if err == ErrConflict { + c.logger.Warningf("the status code is 409 when creating project %s on %s with user %s, try to do next step", c.project, c.dstURL, c.dstUsr) + return StatePullManifest, nil } - req.SetBasicAuth(c.dstUsr, c.dstPwd) + c.logger.Errorf("an error occurred while creating project %s on %s with user %s : %v", c.project, c.dstURL, c.dstUsr, err) - client := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: c.insecure, - }, - }, - } - - resp, err := client.Do(req) - if err != nil { - return - } - - defer resp.Body.Close() - - if resp.StatusCode == http.StatusNotFound { - return - } - - if resp.StatusCode == http.StatusForbidden { - exist = true - return - } - - data, err := ioutil.ReadAll(resp.Body) - if err != nil { - return - } - - if resp.StatusCode == http.StatusOK { - var projects []models.Project - if err = json.Unmarshal(data, &projects); err != nil { - return - } - - if len(projects) == 0 { - return - } - - for _, project := range projects { - if project.Name == c.project { - exist = true - canWrite = (project.Role == models.PROJECTADMIN || - project.Role == models.DEVELOPER) - break - } - } - - return - } - - err = fmt.Errorf("an error occurred while checking existen of project %s on %s with user %s: %d %s", - c.project, c.dstURL, c.dstUsr, resp.StatusCode, string(data)) - - return + return "", err } func (c *Checker) createProject(isPublic bool) error {