Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions apps/workspace-engine/pkg/workspace/jobagents/argo/argoapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,6 @@ func (a *ArgoApplication) Type() string {
return "argo-cd"
}

func (a *ArgoApplication) Supports() types.Capabilities {
return types.Capabilities{
Workflows: true,
Deployments: true,
}
}

func (a *ArgoApplication) Dispatch(ctx context.Context, dispatchCtx types.DispatchContext) error {
jobAgentConfig := dispatchCtx.JobAgentConfig
serverAddr, apiKey, template, err := a.parseJobAgentConfig(jobAgentConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,6 @@ func (a *GithubAction) Type() string {
return "github-app"
}

func (a *GithubAction) Supports() types.Capabilities {
return types.Capabilities{
Workflows: true,
Deployments: true,
}
}

// Dispatch implements types.Dispatchable.
func (a *GithubAction) Dispatch(ctx context.Context, dispatchCtx types.DispatchContext) error {
cfg, err := a.parseJobAgentConfig(dispatchCtx.JobAgentConfig)
Expand Down
108 changes: 76 additions & 32 deletions apps/workspace-engine/pkg/workspace/jobagents/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,72 @@ func (r *Registry) Register(dispatcher types.Dispatchable) {
r.dispatchers[dispatcher.Type()] = dispatcher
}

func (r *Registry) fillReleaseContext(job *oapi.Job, ctx *types.DispatchContext) error {
releaseId := job.ReleaseId
if releaseId == "" {
return nil
}

jobWithRelease, err := r.store.Jobs.GetWithRelease(job.Id)
if err != nil {
return fmt.Errorf("failed to get job with release: %w", err)
}

ctx.Release = &jobWithRelease.Release
ctx.Deployment = jobWithRelease.Deployment
ctx.Environment = jobWithRelease.Environment
ctx.Resource = jobWithRelease.Resource
ctx.Version = &jobWithRelease.Release.Version

return nil
}

func (r *Registry) fillWorkflowContext(job *oapi.Job, ctx *types.DispatchContext) error {
if job.WorkflowJobId == "" {
return nil
}

workflowJob, ok := r.store.WorkflowJobs.Get(job.WorkflowJobId)
if !ok {
return fmt.Errorf("workflow job not found: %s", job.WorkflowJobId)
}

workflowRun, ok := r.store.WorkflowRuns.Get(workflowJob.WorkflowRunId)
if !ok {
return fmt.Errorf("workflow run not found: %s", workflowJob.WorkflowRunId)
}

ctx.WorkflowJob = workflowJob
ctx.WorkflowRun = workflowRun
return nil
}

func (r *Registry) getMergedJobAgentConfig(jobAgent *oapi.JobAgent, ctx *types.DispatchContext) (oapi.JobAgentConfig, error) {
agentConfig := jobAgent.Config

var workflowJobConfig oapi.JobAgentConfig
if ctx.WorkflowJob != nil {
workflowJobConfig = ctx.WorkflowJob.Config
}

var deploymentConfig oapi.JobAgentConfig
if ctx.Deployment != nil {
deploymentConfig = ctx.Deployment.JobAgentConfig
}

var versionConfig oapi.JobAgentConfig
if ctx.Version != nil {
versionConfig = ctx.Version.JobAgentConfig
}

mergedConfig, err := mergeJobAgentConfig(agentConfig, deploymentConfig, workflowJobConfig, versionConfig)
if err != nil {
return oapi.JobAgentConfig{}, fmt.Errorf("failed to merge job agent configs: %w", err)
}

return mergedConfig, nil
}

func (r *Registry) Dispatch(ctx context.Context, job *oapi.Job) error {
jobAgent, ok := r.store.JobAgents.Get(job.JobAgentId)
if !ok {
Expand All @@ -52,42 +118,20 @@ func (r *Registry) Dispatch(ctx context.Context, job *oapi.Job) error {
dispatchContext.Job = job
dispatchContext.JobAgent = jobAgent

isWorkflow := job.WorkflowJobId != ""
caps := dispatcher.Supports()

if isWorkflow && !caps.Workflows {
return fmt.Errorf("job agent type %s does not support workflows", jobAgent.Type)
if err := r.fillReleaseContext(job, &dispatchContext); err != nil {
return fmt.Errorf("failed to get release context: %w", err)
}

if !isWorkflow && !caps.Deployments {
return fmt.Errorf("job agent type %s does not support deployments", jobAgent.Type)
if err := r.fillWorkflowContext(job, &dispatchContext); err != nil {
return fmt.Errorf("failed to get workflow context: %w", err)
}

if jobWithRelease, _ := r.store.Jobs.GetWithRelease(job.Id); jobWithRelease != nil {
dispatchContext.Release = &jobWithRelease.Release
dispatchContext.Deployment = jobWithRelease.Deployment
dispatchContext.Environment = jobWithRelease.Environment
dispatchContext.Resource = jobWithRelease.Resource
jobAgentConfig, err := mergeJobAgentConfig(
jobAgent.Config,
jobWithRelease.Deployment.JobAgentConfig,
jobWithRelease.Release.Version.JobAgentConfig,
)
if err != nil {
return fmt.Errorf("failed to merge job agent config: %w", err)
}
dispatchContext.JobAgentConfig = jobAgentConfig
}

if workflowJob, ok := r.store.WorkflowJobs.Get(job.WorkflowJobId); ok {
dispatchContext.WorkflowJob = workflowJob
if workflowRun, ok := r.store.WorkflowRuns.Get(workflowJob.WorkflowRunId); ok {
dispatchContext.WorkflowRun = workflowRun
}
dispatchContext.JobAgent = jobAgent
dispatchContext.JobAgentConfig = job.JobAgentConfig
mergedConfig, err := r.getMergedJobAgentConfig(jobAgent, &dispatchContext)
if err != nil {
return fmt.Errorf("failed to merge all job agent configs: %w", err)
}
dispatchContext.JobAgentConfig = mergedConfig

job.JobAgentConfig = mergedConfig
r.store.Jobs.Upsert(ctx, job)
return dispatcher.Dispatch(ctx, dispatchContext)
}

Expand Down
Loading
Loading