Skip to content

Commit

Permalink
refactor(app): add app factory
Browse files Browse the repository at this point in the history
  • Loading branch information
fiftin-quiz committed Jan 30, 2024
1 parent 3c5aaac commit 57046ea
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 28 deletions.
21 changes: 21 additions & 0 deletions db_lib/AppFactory.go
Original file line number Diff line number Diff line change
@@ -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")
}
}
12 changes: 12 additions & 0 deletions db_lib/LocalApp.go
Original file line number Diff line number Diff line change
@@ -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
}
9 changes: 1 addition & 8 deletions services/runners/JobPool.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
},
}

Expand Down
86 changes: 76 additions & 10 deletions services/tasks/LocalJob.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -27,7 +21,7 @@ type LocalJob struct {
Environment db.Environment
Logger lib.Logger

App LocalApp
App db_lib.LocalApp

// Internal field
Process *os.Process
Expand Down Expand Up @@ -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 != "" {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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
}
Expand Down
11 changes: 1 addition & 10 deletions services/tasks/TaskPool.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
}
}

Expand Down

0 comments on commit 57046ea

Please sign in to comment.