Skip to content

Commit ef47533

Browse files
committed
refactor: move ansible parser to pro
1 parent 7418be3 commit ef47533

File tree

18 files changed

+348
-548
lines changed

18 files changed

+348
-548
lines changed

cli/cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ func runService() {
119119
fmt.Printf("Port %v\n", util.Config.Port)
120120

121121
subscriptionService.StartValidationCron()
122+
122123
go sockets.StartWS()
123124
go schedulePool.Run()
124125
go taskPool.Run()

db/Store.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -375,16 +375,19 @@ type TaskManager interface {
375375
CreateTaskStage(stage TaskStage) (TaskStage, error)
376376
EndTaskStage(taskID int, stageID int, end time.Time, endOutputID int) error
377377
CreateTaskStageResult(taskID int, stageID int, result map[string]any) error
378-
CreateAnsibleTaskHost(host AnsibleTaskHost) error
379-
CreateAnsibleTaskError(error AnsibleTaskError) error
380-
GetAnsibleTaskHosts(projectID int, taskID int) ([]AnsibleTaskHost, error)
381-
GetAnsibleTaskErrors(projectID int, taskID int) ([]AnsibleTaskError, error)
382378
GetTaskStages(projectID int, taskID int) ([]TaskStageWithResult, error)
383379
GetTaskStageResult(projectID int, taskID int, stageID int) (TaskStageResult, error)
384380
GetTaskStageOutputs(projectID int, taskID int, stageID int) ([]TaskOutput, error)
385381
GetTaskStats(projectID int, templateID *int, unit TaskStatUnit, filter TaskFilter) ([]TaskStat, error)
386382
}
387383

384+
type AnsibleTaskRepository interface {
385+
CreateAnsibleTaskHost(host AnsibleTaskHost) error
386+
CreateAnsibleTaskError(error AnsibleTaskError) error
387+
GetAnsibleTaskHosts(projectID int, taskID int) ([]AnsibleTaskHost, error)
388+
GetAnsibleTaskErrors(projectID int, taskID int) ([]AnsibleTaskError, error)
389+
}
390+
388391
// ScheduleManager handles schedule-related operations
389392
type ScheduleManager interface {
390393
GetSchedules() ([]Schedule, error)
@@ -456,6 +459,7 @@ type Store interface {
456459
SessionManager
457460
TokenManager
458461
TaskManager
462+
AnsibleTaskRepository
459463
ScheduleManager
460464
ViewManager
461465
RunnerManager

db/Template_alias.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
package db
44

55
func (t TemplateApp) NeedTaskAlias() bool {
6-
return false
6+
return t.IsTerraform()
77
}

db/bolt/ansible_pro.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//go:build pro
2+
3+
package bolt
4+
5+
import (
6+
"github.com/pkg/errors"
7+
"github.com/semaphoreui/semaphore/db"
8+
)
9+
10+
func (d *BoltDb) CreateAnsibleTaskHost(host db.AnsibleTaskHost) error {
11+
return errors.New("not implemented")
12+
}
13+
14+
func (d *BoltDb) CreateAnsibleTaskError(error db.AnsibleTaskError) error {
15+
return errors.New("not implemented")
16+
}
17+
18+
func (d *BoltDb) GetAnsibleTaskHosts(projectID int, taskID int) (res []db.AnsibleTaskHost, err error) {
19+
err = errors.New("not implemented")
20+
return
21+
}
22+
23+
func (d *BoltDb) GetAnsibleTaskErrors(projectID int, taskID int) (res []db.AnsibleTaskError, err error) {
24+
err = errors.New("not implemented")
25+
return
26+
}

db/bolt/runner_pro.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//go:build pro
2+
3+
package bolt
4+
5+
import (
6+
"fmt"
7+
"github.com/semaphoreui/semaphore/db"
8+
"go.etcd.io/bbolt"
9+
)
10+
11+
func (d *BoltDb) GetRunner(projectID int, runnerID int) (runner db.Runner, err error) {
12+
err = d.getObject(0, db.GlobalRunnerProps, intObjectID(runnerID), &runner)
13+
if err != nil {
14+
return
15+
}
16+
17+
if runner.ProjectID == nil || *runner.ProjectID != projectID {
18+
err = db.ErrNotFound
19+
}
20+
21+
return
22+
}
23+
24+
func validateTag(tag string) error {
25+
if tag == "" {
26+
return fmt.Errorf("tag cannot be empty")
27+
}
28+
29+
return nil
30+
}
31+
32+
func (d *BoltDb) GetRunners(projectID int, activeOnly bool, tag *string) (runners []db.Runner, err error) {
33+
if tag != nil {
34+
err = validateTag(*tag)
35+
if err != nil {
36+
return
37+
}
38+
}
39+
40+
runners = make([]db.Runner, 0)
41+
err = d.getObjects(0, db.GlobalRunnerProps, db.RetrieveQueryParams{}, func(i interface{}) bool {
42+
runner := i.(db.Runner)
43+
44+
if runner.ProjectID == nil || *runner.ProjectID != projectID {
45+
return false
46+
}
47+
48+
if tag != nil && runner.Tag != *tag {
49+
return false
50+
}
51+
52+
if activeOnly {
53+
return runner.Active
54+
}
55+
56+
return true
57+
}, &runners)
58+
return
59+
}
60+
61+
func (d *BoltDb) DeleteRunner(projectID int, runnerID int) error {
62+
return d.db.Update(func(tx *bbolt.Tx) error {
63+
runner, err := d.GetRunner(projectID, runnerID)
64+
if err != nil {
65+
return err
66+
}
67+
if runner.ProjectID == nil || *runner.ProjectID != projectID {
68+
return db.ErrNotFound
69+
}
70+
return d.deleteObject(0, db.GlobalRunnerProps, intObjectID(runnerID), tx)
71+
})
72+
}
73+
74+
func (d *BoltDb) GetRunnerTags(projectID int) ([]db.RunnerTag, error) {
75+
return []db.RunnerTag{
76+
{
77+
Tag: "tag1",
78+
NumberOfRunners: 1,
79+
},
80+
}, nil
81+
}

db/bolt/runner_pro_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package bolt
2+
3+
import (
4+
"github.com/semaphoreui/semaphore/db"
5+
"github.com/stretchr/testify/assert"
6+
"testing"
7+
)
8+
9+
func Test_DeleteRunner_DeletesProjectRunner(t *testing.T) {
10+
store := CreateTestStore()
11+
12+
project, err := store.CreateProject(db.Project{})
13+
assert.NoError(t, err)
14+
15+
testRunner, err := store.CreateRunner(db.Runner{ProjectID: &project.ID})
16+
assert.NoError(t, err)
17+
18+
err = store.DeleteRunner(project.ID, testRunner.ID)
19+
assert.NoError(t, err)
20+
21+
_, err = store.GetRunner(project.ID, testRunner.ID)
22+
assert.ErrorIs(t, err, db.ErrNotFound)
23+
}

db/sql/ansible_pro.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//go:build pro
2+
3+
package sql
4+
5+
import (
6+
"github.com/Masterminds/squirrel"
7+
"github.com/semaphoreui/semaphore/db"
8+
)
9+
10+
func (d *SqlDb) CreateAnsibleTaskHost(host db.AnsibleTaskHost) error {
11+
_, err := d.exec(
12+
"insert into task__ansible_host (project_id, task_id, host, failed, changed, ignored, ok, rescued, skipped, unreachable) "+
13+
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
14+
host.ProjectID,
15+
host.TaskID,
16+
host.Host,
17+
host.Failed,
18+
host.Changed,
19+
host.Ignored,
20+
host.Ok,
21+
host.Rescued,
22+
host.Skipped,
23+
host.Unreachable,
24+
)
25+
if err != nil {
26+
return err
27+
}
28+
return nil
29+
}
30+
31+
func (d *SqlDb) CreateAnsibleTaskError(error db.AnsibleTaskError) error {
32+
_, err := d.exec(
33+
"insert into task__ansible_error (project_id, task_id, host, task, error) "+
34+
"values (?, ?, ?, ?, ?)",
35+
error.ProjectID,
36+
error.TaskID,
37+
error.Host,
38+
error.Task,
39+
error.Error,
40+
)
41+
if err != nil {
42+
return err
43+
}
44+
return nil
45+
}
46+
47+
func (d *SqlDb) GetAnsibleTaskHosts(projectID int, taskID int) (res []db.AnsibleTaskHost, err error) {
48+
q := squirrel.Select("*").
49+
From("task__ansible_host").
50+
Where("project_id=? and task_id=?", projectID, taskID)
51+
52+
query, args, err := q.ToSql()
53+
54+
if err != nil {
55+
return
56+
}
57+
58+
_, err = d.selectAll(&res, query, args...)
59+
return
60+
}
61+
62+
func (d *SqlDb) GetAnsibleTaskErrors(projectID int, taskID int) (res []db.AnsibleTaskError, err error) {
63+
q := squirrel.Select("*").
64+
From("task__ansible_error").
65+
Where("project_id=? and task_id=?", projectID, taskID)
66+
67+
query, args, err := q.ToSql()
68+
69+
if err != nil {
70+
return
71+
}
72+
73+
_, err = d.selectAll(&res, query, args...)
74+
return
75+
}

db/sql/runner.go

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,56 @@
1-
//go:build !pro
2-
31
package sql
42

53
import (
4+
"fmt"
65
"github.com/Masterminds/squirrel"
76
"github.com/semaphoreui/semaphore/db"
87
)
98

9+
func validateTag(tag string) error {
10+
if tag == "" {
11+
return fmt.Errorf("Tag cannot be empty")
12+
}
13+
14+
return nil
15+
}
16+
17+
func makePropsNonGlobal(props db.ObjectProps) (res db.ObjectProps) {
18+
res = props
19+
res.IsGlobal = false
20+
return
21+
}
22+
23+
var runnerProps = makePropsNonGlobal(db.GlobalRunnerProps)
24+
1025
func (d *SqlDb) GetRunner(projectID int, runnerID int) (runner db.Runner, err error) {
11-
err = db.ErrNotFound
26+
err = d.getObject(projectID, runnerProps, runnerID, &runner)
1227
return
1328
}
1429

1530
func (d *SqlDb) GetRunners(projectID int, activeOnly bool, tag *string) (runners []db.Runner, err error) {
16-
runners = make([]db.Runner, 0)
31+
if tag != nil {
32+
err = validateTag(*tag)
33+
if err != nil {
34+
return
35+
}
36+
}
37+
38+
err = d.getObjects(projectID, runnerProps, db.RetrieveQueryParams{}, func(builder squirrel.SelectBuilder) squirrel.SelectBuilder {
39+
if tag != nil {
40+
builder = builder.Where("tag=?", *tag)
41+
}
42+
43+
if activeOnly {
44+
builder = builder.Where("active=?", activeOnly)
45+
}
46+
47+
return builder
48+
}, &runners)
1749
return
1850
}
1951

2052
func (d *SqlDb) DeleteRunner(projectID int, runnerID int) (err error) {
21-
err = db.ErrNotFound
53+
err = d.deleteObject(projectID, runnerProps, runnerID)
2254
return
2355
}
2456

0 commit comments

Comments
 (0)