From efd725ea94cf0594dd20c322536bf9b0c5234a52 Mon Sep 17 00:00:00 2001 From: Christopher Homberger Date: Thu, 29 May 2025 18:00:19 +0200 Subject: [PATCH] Create Repo / Org make --forge-type optional * This makes gitea garm usage unnessary complex Signed-off-by: Christopher Homberger --- cmd/garm-cli/cmd/organization.go | 2 +- cmd/garm-cli/cmd/repository.go | 2 +- doc/gitea.md | 3 +-- params/params.go | 1 + params/requests.go | 32 ++++++++++++++------------------ runner/common.go | 31 +++++++++++++++++++++++++++++++ runner/organizations.go | 4 ++-- runner/repositories.go | 4 ++-- 8 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 runner/common.go diff --git a/cmd/garm-cli/cmd/organization.go b/cmd/garm-cli/cmd/organization.go index 58110053..a95f912f 100644 --- a/cmd/garm-cli/cmd/organization.go +++ b/cmd/garm-cli/cmd/organization.go @@ -308,7 +308,7 @@ func init() { orgAddCmd.Flags().StringVar(&orgName, "name", "", "The name of the organization") orgAddCmd.Flags().StringVar(&poolBalancerType, "pool-balancer-type", string(params.PoolBalancerTypeRoundRobin), "The balancing strategy to use when creating runners in pools matching requested labels.") orgAddCmd.Flags().StringVar(&orgWebhookSecret, "webhook-secret", "", "The webhook secret for this organization") - orgAddCmd.Flags().StringVar(&forgeType, "forge-type", string(params.GithubEndpointType), "The forge type of the organization. Supported values: github, gitea.") + orgAddCmd.Flags().StringVar(&forgeType, "forge-type", "", "The forge type of the organization. Supported values: github, gitea.") orgAddCmd.Flags().StringVar(&orgCreds, "credentials", "", "Credentials name. See credentials list.") orgAddCmd.Flags().BoolVar(&orgRandomWebhookSecret, "random-webhook-secret", false, "Generate a random webhook secret for this organization.") orgAddCmd.Flags().BoolVar(&installOrgWebhook, "install-webhook", false, "Install the webhook as part of the add operation.") diff --git a/cmd/garm-cli/cmd/repository.go b/cmd/garm-cli/cmd/repository.go index 96f214fd..5bf588c5 100644 --- a/cmd/garm-cli/cmd/repository.go +++ b/cmd/garm-cli/cmd/repository.go @@ -312,7 +312,7 @@ func init() { repoAddCmd.Flags().StringVar(&repoOwner, "owner", "", "The owner of this repository") repoAddCmd.Flags().StringVar(&poolBalancerType, "pool-balancer-type", string(params.PoolBalancerTypeRoundRobin), "The balancing strategy to use when creating runners in pools matching requested labels.") repoAddCmd.Flags().StringVar(&repoName, "name", "", "The name of the repository") - repoAddCmd.Flags().StringVar(&forgeType, "forge-type", string(params.GithubEndpointType), "The forge type of the repository. Supported values: github, gitea.") + repoAddCmd.Flags().StringVar(&forgeType, "forge-type", "", "The forge type of the repository. Supported values: github, gitea.") repoAddCmd.Flags().StringVar(&repoWebhookSecret, "webhook-secret", "", "The webhook secret for this repository") repoAddCmd.Flags().StringVar(&repoCreds, "credentials", "", "Credentials name. See credentials list.") repoAddCmd.Flags().BoolVar(&randomWebhookSecret, "random-webhook-secret", false, "Generate a random webhook secret for this repository.") diff --git a/doc/gitea.md b/doc/gitea.md index 215a51ba..e7833a32 100644 --- a/doc/gitea.md +++ b/doc/gitea.md @@ -295,8 +295,7 @@ garm-cli repo add \ --name testrepo \ --owner testorg \ --random-webhook-secret \ - --install-webhook \ - --forge-type gitea + --install-webhook ``` Make a note of the repo UUID. You will need it when adding a pool. diff --git a/params/params.go b/params/params.go index a127d760..a680fda4 100644 --- a/params/params.go +++ b/params/params.go @@ -78,6 +78,7 @@ const ( ) const ( + AutoEndpointType EndpointType = "" GithubEndpointType EndpointType = "github" GiteaEndpointType EndpointType = "gitea" ) diff --git a/params/requests.go b/params/requests.go index 82cbf113..5be0e3a1 100644 --- a/params/requests.go +++ b/params/requests.go @@ -48,15 +48,6 @@ type CreateRepoParams struct { ForgeType EndpointType `json:"forge_type,omitempty"` } -func (c CreateRepoParams) GetForgeType() EndpointType { - switch c.ForgeType { - case GithubEndpointType, GiteaEndpointType: - return c.ForgeType - default: - return GithubEndpointType - } -} - func (c *CreateRepoParams) Validate() error { if c.Owner == "" { return runnerErrors.NewBadRequestError("missing owner") @@ -73,6 +64,13 @@ func (c *CreateRepoParams) Validate() error { return runnerErrors.NewMissingSecretError("missing secret") } + switch c.ForgeType { + case GithubEndpointType, GiteaEndpointType, AutoEndpointType: + break + default: + return runnerErrors.NewBadRequestError("invalid forge type") + } + switch c.PoolBalancerType { case PoolBalancerTypeRoundRobin, PoolBalancerTypePack, PoolBalancerTypeNone: default: @@ -90,15 +88,6 @@ type CreateOrgParams struct { ForgeType EndpointType `json:"forge_type,omitempty"` } -func (c CreateOrgParams) GetForgeType() EndpointType { - switch c.ForgeType { - case GithubEndpointType, GiteaEndpointType: - return c.ForgeType - default: - return GithubEndpointType - } -} - func (c *CreateOrgParams) Validate() error { if c.Name == "" { return runnerErrors.NewBadRequestError("missing org name") @@ -111,6 +100,13 @@ func (c *CreateOrgParams) Validate() error { return runnerErrors.NewMissingSecretError("missing secret") } + switch c.ForgeType { + case GithubEndpointType, GiteaEndpointType, AutoEndpointType: + break + default: + return runnerErrors.NewBadRequestError("invalid forge type") + } + switch c.PoolBalancerType { case PoolBalancerTypeRoundRobin, PoolBalancerTypePack, PoolBalancerTypeNone: default: diff --git a/runner/common.go b/runner/common.go new file mode 100644 index 00000000..63d4887c --- /dev/null +++ b/runner/common.go @@ -0,0 +1,31 @@ +package runner + +import ( + "context" + + "github.com/pkg/errors" + + runnerErrors "github.com/cloudbase/garm-provider-common/errors" + "github.com/cloudbase/garm/params" +) + +func (r *Runner) ResolveForgeCredentialByName(ctx context.Context, credentialsName string) (params.ForgeCredentials, error) { + githubCred, err := r.store.GetGithubCredentialsByName(ctx, credentialsName, false) + if err != nil && !errors.Is(err, runnerErrors.ErrNotFound) { + return params.ForgeCredentials{}, errors.Wrap(err, "fetching github credentials") + } + giteaCred, err := r.store.GetGiteaCredentialsByName(ctx, credentialsName, false) + if err != nil && !errors.Is(err, runnerErrors.ErrNotFound) { + return params.ForgeCredentials{}, errors.Wrap(err, "fetching gitea credentials") + } + if githubCred.ID != 0 && giteaCred.ID != 0 { + return params.ForgeCredentials{}, runnerErrors.NewBadRequestError("credentials %s are defined for both GitHub and Gitea, please specify the forge type", credentialsName) + } + if githubCred.ID != 0 { + return githubCred, nil + } + if giteaCred.ID != 0 { + return giteaCred, nil + } + return params.ForgeCredentials{}, runnerErrors.NewBadRequestError("credentials %s not found", credentialsName) +} diff --git a/runner/organizations.go b/runner/organizations.go index bddab87c..26d4f6e9 100644 --- a/runner/organizations.go +++ b/runner/organizations.go @@ -39,7 +39,7 @@ func (r *Runner) CreateOrganization(ctx context.Context, param params.CreateOrgP } var creds params.ForgeCredentials - switch param.GetForgeType() { + switch param.ForgeType { case params.GithubEndpointType: slog.DebugContext(ctx, "getting github credentials") creds, err = r.store.GetGithubCredentialsByName(ctx, param.CredentialsName, true) @@ -47,7 +47,7 @@ func (r *Runner) CreateOrganization(ctx context.Context, param params.CreateOrgP slog.DebugContext(ctx, "getting gitea credentials") creds, err = r.store.GetGiteaCredentialsByName(ctx, param.CredentialsName, true) default: - return params.Organization{}, runnerErrors.NewBadRequestError("invalid forge type: %s", param.GetForgeType()) + creds, err = r.ResolveForgeCredentialByName(ctx, param.CredentialsName) } if err != nil { diff --git a/runner/repositories.go b/runner/repositories.go index 058e1a02..d5118e96 100644 --- a/runner/repositories.go +++ b/runner/repositories.go @@ -39,13 +39,13 @@ func (r *Runner) CreateRepository(ctx context.Context, param params.CreateRepoPa } var creds params.ForgeCredentials - switch param.GetForgeType() { + switch param.ForgeType { case params.GithubEndpointType: creds, err = r.store.GetGithubCredentialsByName(ctx, param.CredentialsName, true) case params.GiteaEndpointType: creds, err = r.store.GetGiteaCredentialsByName(ctx, param.CredentialsName, true) default: - return params.Repository{}, runnerErrors.NewBadRequestError("invalid forge type: %s", param.GetForgeType()) + creds, err = r.ResolveForgeCredentialByName(ctx, param.CredentialsName) } if err != nil {