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

Method DispatchWorkflowJob

runner/runner.go:835–901  ·  view source on GitHub ↗
(hookTargetType, signature string, forgeType params.EndpointType, jobData []byte)

Source from the content-addressed store, hash-verified

833}
834
835func (r *Runner) DispatchWorkflowJob(hookTargetType, signature string, forgeType params.EndpointType, jobData []byte) error {
836 if len(jobData) == 0 {
837 slog.ErrorContext(r.ctx, "missing job data")
838 return runnerErrors.NewBadRequestError("missing job data")
839 }
840
841 var job params.WorkflowJob
842 if err := json.Unmarshal(jobData, &job); err != nil {
843 slog.ErrorContext(r.ctx, "failed to unmarshal job data", "error", err)
844 return fmt.Errorf("invalid job data %s: %w", err, runnerErrors.ErrBadRequest)
845 }
846
847 endpoint, err := r.findEndpointForJob(job, forgeType)
848 if err != nil {
849 slog.ErrorContext(r.ctx, "failed to find endpoint for job", "error", err)
850 return fmt.Errorf("error finding endpoint for job: %w", err)
851 }
852
853 var poolManager common.PoolManager
854
855 switch HookTargetType(hookTargetType) {
856 case RepoHook:
857 slog.DebugContext(
858 r.ctx, "got hook for repo",
859 "repo_owner", util.SanitizeLogEntry(job.Repository.Owner.Login),
860 "repo_name", util.SanitizeLogEntry(job.Repository.Name),
861 "endpoint", endpoint.Name)
862 poolManager, err = r.findRepoPoolManager(job.Repository.Owner.Login, job.Repository.Name, endpoint.Name)
863 case OrganizationHook:
864 slog.DebugContext(
865 r.ctx, "got hook for organization",
866 "organization", util.SanitizeLogEntry(job.GetOrgName(forgeType)),
867 "endpoint", endpoint.Name)
868 poolManager, err = r.findOrgPoolManager(job.GetOrgName(forgeType), endpoint.Name)
869 case EnterpriseHook:
870 slog.DebugContext(
871 r.ctx, "got hook for enterprise",
872 "enterprise", util.SanitizeLogEntry(job.Enterprise.Slug),
873 "endpoint", endpoint.Name)
874 poolManager, err = r.findEnterprisePoolManager(job.Enterprise.Slug, endpoint.Name)
875 default:
876 return runnerErrors.NewBadRequestError("cannot handle hook target type %s", hookTargetType)
877 }
878
879 slog.DebugContext(r.ctx, "found pool manager", "pool_manager", poolManager.ID())
880 if err != nil {
881 slog.ErrorContext(r.ctx, "failed to find pool manager", "error", err, "hook_target_type", hookTargetType)
882 // We don't have a repository or organization configured that
883 // can handle this workflow job.
884 return fmt.Errorf("error fetching poolManager: %w", err)
885 }
886
887 // We found a pool. Validate the webhook job. If a secret is configured,
888 // we make sure that the source of this workflow job is valid.
889 secret := poolManager.WebhookSecret()
890 if err := r.validateHookBody(signature, secret, jobData); err != nil {
891 slog.ErrorContext(r.ctx, "failed to validate webhook data", "error", err)
892 return fmt.Errorf("error validating webhook data: %w", err)

Callers 1

Calls 10

findEndpointForJobMethod · 0.95
findRepoPoolManagerMethod · 0.95
GetOrgNameMethod · 0.95
findOrgPoolManagerMethod · 0.95
IDMethod · 0.95
WebhookSecretMethod · 0.95
validateHookBodyMethod · 0.95
HandleWorkflowJobMethod · 0.95
HookTargetTypeTypeAlias · 0.85

Tested by

no test coverage detected