From 57046eaf65cba4a838f33c871b95f7a577bbc1b3 Mon Sep 17 00:00:00 2001 From: fiftin-quiz <157730881+fiftin-quiz@users.noreply.github.com> Date: Tue, 30 Jan 2024 20:42:56 +0500 Subject: [PATCH] refactor(app): add app factory --- db_lib/AppFactory.go | 21 +++++++++ db_lib/LocalApp.go | 12 ++++++ services/runners/JobPool.go | 9 +--- services/tasks/LocalJob.go | 86 ++++++++++++++++++++++++++++++++----- services/tasks/TaskPool.go | 11 +---- 5 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 db_lib/AppFactory.go create mode 100644 db_lib/LocalApp.go diff --git a/db_lib/AppFactory.go b/db_lib/AppFactory.go new file mode 100644 index 000000000..6c9dbb4ce --- /dev/null +++ b/db_lib/AppFactory.go @@ -0,0 +1,21 @@ +package db_lib + +import ( + "github.com/ansible-semaphore/semaphore/db" +) + +func CreateApp(template db.Template, repository db.Repository) LocalApp { + switch template.App { + case db.TemplateAnsible: + return &AnsibleApp{ + Template: template, + Repository: repository, + Playbook: &AnsiblePlaybook{ + TemplateID: template.ID, + Repository: repository, + }, + } + default: + panic("unknown app") + } +} diff --git a/db_lib/LocalApp.go b/db_lib/LocalApp.go new file mode 100644 index 000000000..a440d2f67 --- /dev/null +++ b/db_lib/LocalApp.go @@ -0,0 +1,12 @@ +package db_lib + +import ( + "github.com/ansible-semaphore/semaphore/lib" + "os" +) + +type LocalApp interface { + SetLogger(logger lib.Logger) + InstallRequirements() error + Run(args []string, environmentVars *[]string, cb func(*os.Process)) error +} diff --git a/services/runners/JobPool.go b/services/runners/JobPool.go index 9a85df5b1..d818b37cf 100644 --- a/services/runners/JobPool.go +++ b/services/runners/JobPool.go @@ -498,14 +498,7 @@ func (p *JobPool) checkNewJobs() { Inventory: newJob.Inventory, Repository: newJob.Repository, Environment: newJob.Environment, - App: &db_lib.AnsibleApp{ - Template: newJob.Template, - Repository: newJob.Repository, - Playbook: &db_lib.AnsiblePlaybook{ - TemplateID: newJob.Template.ID, - Repository: newJob.Repository, - }, - }, + App: db_lib.CreateApp(newJob.Template, newJob.Repository), }, } diff --git a/services/tasks/LocalJob.go b/services/tasks/LocalJob.go index f246e6349..c60a6ddcb 100644 --- a/services/tasks/LocalJob.go +++ b/services/tasks/LocalJob.go @@ -12,12 +12,6 @@ import ( "github.com/ansible-semaphore/semaphore/util" ) -type LocalApp interface { - SetLogger(logger lib.Logger) - InstallRequirements() error - Run(args []string, environmentVars *[]string, cb func(*os.Process)) error -} - type LocalJob struct { // Received constant fields Task db.Task @@ -27,7 +21,7 @@ type LocalJob struct { Environment db.Environment Logger lib.Logger - App LocalApp + App db_lib.LocalApp // Internal field Process *os.Process @@ -55,7 +49,45 @@ func (t *LocalJob) SetStatus(status lib.TaskStatus) { t.Logger.SetStatus(status) } -func (t *LocalJob) getEnvironmentExtraVars(username string, incomingVersion *string) (str string, err error) { +func (t *LocalJob) getEnvironmentExtraVars(username string, incomingVersion *string) (extraVars map[string]interface{}, err error) { + + extraVars = make(map[string]interface{}) + + if t.Environment.JSON != "" { + err = json.Unmarshal([]byte(t.Environment.JSON), &extraVars) + if err != nil { + return + } + } + + taskDetails := make(map[string]interface{}) + + taskDetails["id"] = t.Task.ID + + if t.Task.Message != "" { + taskDetails["message"] = t.Task.Message + } + + taskDetails["username"] = username + + if t.Template.Type != db.TemplateTask { + taskDetails["type"] = t.Template.Type + if incomingVersion != nil { + taskDetails["incoming_version"] = incomingVersion + } + if t.Template.Type == db.TemplateBuild { + taskDetails["target_version"] = t.Task.Version + } + } + + vars := make(map[string]interface{}) + vars["task_details"] = taskDetails + extraVars["semaphore_vars"] = vars + + return +} + +func (t *LocalJob) getEnvironmentExtraVarsJSON(username string, incomingVersion *string) (str string, err error) { extraVars := make(map[string]interface{}) if t.Environment.JSON != "" { @@ -116,6 +148,32 @@ func (t *LocalJob) getEnvironmentENV() (arr []string, err error) { return } +// nolint: gocyclo +func (t *LocalJob) getTerraformArgs(username string, incomingVersion *string) (args []string, err error) { + + args = []string{} + + if t.Task.DryRun { + args = append(args, "plan") + } else { + args = append(args, "apply") + } + + extraVars, err := t.getEnvironmentExtraVars(username, incomingVersion) + + if err != nil { + t.Log(err.Error()) + t.Log("Could not remove command environment, if existant it will be passed to --extra-vars. This is not fatal but be aware of side effects") + return + } + + for v := range extraVars { + args = append(args, "-var", v) + } + + return +} + // nolint: gocyclo func (t *LocalJob) getPlaybookArgs(username string, incomingVersion *string) (args []string, err error) { playbookName := t.Task.Playbook @@ -184,7 +242,7 @@ func (t *LocalJob) getPlaybookArgs(username string, incomingVersion *string) (ar args = append(args, "--vault-password-file", t.vaultFileInstallation.GetPath()) } - extraVars, err := t.getEnvironmentExtraVars(username, incomingVersion) + extraVars, err := t.getEnvironmentExtraVarsJSON(username, incomingVersion) if err != nil { t.Log(err.Error()) t.Log("Could not remove command environment, if existant it will be passed to --extra-vars. This is not fatal but be aware of side effects") @@ -235,7 +293,15 @@ func (t *LocalJob) Run(username string, incomingVersion *string) (err error) { t.destroyKeys() }() - args, err := t.getPlaybookArgs(username, incomingVersion) + var args []string + + switch t.Template.App { + case db.TemplateAnsible: + args, err = t.getPlaybookArgs(username, incomingVersion) + default: + panic("unknown template app") + } + if err != nil { return } diff --git a/services/tasks/TaskPool.go b/services/tasks/TaskPool.go index 79c263832..47eaa319f 100644 --- a/services/tasks/TaskPool.go +++ b/services/tasks/TaskPool.go @@ -361,16 +361,7 @@ func (p *TaskPool) AddTask(taskObj db.Task, userID *int, projectID int) (newTask Repository: taskRunner.Repository, Environment: taskRunner.Environment, Logger: &taskRunner, - App: &db_lib.AnsibleApp{ - Template: taskRunner.Template, - Repository: taskRunner.Repository, - Logger: &taskRunner, - Playbook: &db_lib.AnsiblePlaybook{ - Logger: &taskRunner, - TemplateID: taskRunner.Template.ID, - Repository: taskRunner.Repository, - }, - }, + App: db_lib.CreateApp(taskRunner.Template, taskRunner.Repository), } }