MCPcopy Create free account
hub / github.com/cloudbase/garm / CreateRepository

Method CreateRepository

runner/repositories.go:32–94  ·  view source on GitHub ↗
(ctx context.Context, param params.CreateRepoParams)

Source from the content-addressed store, hash-verified

30)
31
32func (r *Runner) CreateRepository(ctx context.Context, param params.CreateRepoParams) (repo params.Repository, err error) {
33 if !auth.IsAdmin(ctx) {
34 return repo, runnerErrors.ErrUnauthorized
35 }
36
37 if err := param.Validate(); err != nil {
38 return params.Repository{}, fmt.Errorf("error validating params: %w", err)
39 }
40
41 var creds params.ForgeCredentials
42 switch param.ForgeType {
43 case params.GithubEndpointType:
44 creds, err = r.store.GetGithubCredentialsByName(ctx, param.CredentialsName, true)
45 case params.GiteaEndpointType:
46 creds, err = r.store.GetGiteaCredentialsByName(ctx, param.CredentialsName, true)
47 default:
48 creds, err = r.ResolveForgeCredentialByName(ctx, param.CredentialsName)
49 }
50
51 if err != nil {
52 return params.Repository{}, runnerErrors.NewBadRequestError("credentials %s not defined", param.CredentialsName)
53 }
54
55 _, err = r.store.GetRepository(ctx, param.Owner, param.Name, creds.Endpoint.Name)
56 if err != nil {
57 if !errors.Is(err, runnerErrors.ErrNotFound) {
58 return params.Repository{}, fmt.Errorf("error fetching repo: %w", err)
59 }
60 } else {
61 return params.Repository{}, runnerErrors.NewConflictError("repository %s/%s already exists", param.Owner, param.Name)
62 }
63
64 repo, err = r.store.CreateRepository(ctx, param.Owner, param.Name, creds, param.WebhookSecret, param.PoolBalancerType, param.AgentMode)
65 if err != nil {
66 return params.Repository{}, fmt.Errorf("error creating repository: %w", err)
67 }
68
69 defer func() {
70 if err != nil {
71 if deleteErr := r.store.DeleteRepository(ctx, repo.ID); deleteErr != nil {
72 slog.With(slog.Any("error", deleteErr)).ErrorContext(
73 ctx, "failed to delete repository",
74 "repository_id", repo.ID)
75 }
76 }
77 }()
78
79 // Use the admin context in the pool manager. Any access control is already done above when
80 // updating the store.
81 poolMgr, err := r.poolManagerCtrl.CreateRepoPoolManager(r.ctx, repo, r.providers, r.store)
82 if err != nil {
83 return params.Repository{}, fmt.Errorf("error creating repo pool manager: %w", err)
84 }
85 if err := poolMgr.Start(); err != nil {
86 if deleteErr := r.poolManagerCtrl.DeleteRepoPoolManager(repo); deleteErr != nil {
87 slog.With(slog.Any("error", deleteErr)).ErrorContext(
88 ctx, "failed to cleanup pool manager for repo",
89 "repository_id", repo.ID)

Callers

nothing calls this directly

Calls 11

IsAdminFunction · 0.92
GetRepositoryMethod · 0.65
CreateRepositoryMethod · 0.65
DeleteRepositoryMethod · 0.65
CreateRepoPoolManagerMethod · 0.65
StartMethod · 0.65
DeleteRepoPoolManagerMethod · 0.65
ValidateMethod · 0.45

Tested by

no test coverage detected