goharbor/harbor · error · *errors.Error
PRECONDITION
PRECONDITION
Error message
the project contains repositories, can not be deleted
What it means
Error "the project contains repositories, can not be deleted" thrown in goharbor/harbor.
Source
Thrown at src/server/v2.0/handler/project.go:280
location = fmt.Sprintf("%s/%d", strings.TrimSuffix(params.HTTPRequest.URL.Path, "/"), projectID)
}
return operation.NewCreateProjectCreated().WithLocation(location)
}
func (a *projectAPI) DeleteProject(ctx context.Context, params operation.DeleteProjectParams) middleware.Responder {
projectNameOrID := parseProjectNameOrID(params.ProjectNameOrID, params.XIsResourceName)
if err := a.RequireProjectAccess(ctx, projectNameOrID, rbac.ActionDelete); err != nil {
return a.SendError(ctx, err)
}
p, result, err := a.deletable(ctx, projectNameOrID)
if err != nil {
return a.SendError(ctx, err)
}
if !result.Deletable {
return a.SendError(ctx, errors.PreconditionFailedError(errors.New(result.Message)))
}
if err := a.projectCtl.Delete(ctx, p.ProjectID); err != nil {
return a.SendError(ctx, err)
}
// remove the robot associated with the project
if err := a.robotMgr.DeleteByProjectID(ctx, p.ProjectID); err != nil {
return a.SendError(ctx, err)
}
referenceID := quota.ReferenceID(p.ProjectID)
q, err := a.quotaCtl.GetByRef(ctx, quota.ProjectReference, referenceID)
if err != nil {
log.Warningf("failed to get quota for project %s, error: %v", projectNameOrID, err)
} else {
if err := a.quotaCtl.Delete(ctx, q.ID); err != nil {
return a.SendError(ctx, fmt.Errorf("failed to delete quota for project: %v", err))View on GitHub (pinned to 7b2fd08cc5)
When it happens
Trigger: Thrown at src/server/v2.0/handler/project.go:280 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16).
Data as JSON: /api/errors/96d9d0879f84b5e2.
Report an issue: GitHub.