Skip to content

Commit

Permalink
Merge pull request #323 from sgotti/gateway_make_runs_api_related_to_…
Browse files Browse the repository at this point in the history
…project_user

*: change gateway runs api
  • Loading branch information
sgotti authored Mar 17, 2022
2 parents 0c8d973 + 788554a commit 95e67a3
Show file tree
Hide file tree
Showing 17 changed files with 1,044 additions and 287 deletions.
46 changes: 35 additions & 11 deletions cmd/agola/cmd/logdelete.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,36 +36,43 @@ var cmdLogDelete = &cobra.Command{
}

type logDeleteOptions struct {
runid string
taskname string
taskid string
step int
setup bool
projectRef string
username string
runNumber uint64
taskname string
taskid string
step int
setup bool
}

var logDeleteOpts logDeleteOptions

func init() {
flags := cmdLogDelete.Flags()

flags.StringVar(&logDeleteOpts.runid, "runid", "", "Run Id")
flags.StringVar(&logDeleteOpts.projectRef, "project", "", "project id or full path")
flags.StringVar(&logDeleteOpts.username, "username", "", "user name for user direct runs")
flags.Uint64Var(&logDeleteOpts.runNumber, "runnumber", 0, "run number")
flags.StringVar(&logDeleteOpts.taskname, "taskname", "", "Task name")
flags.StringVar(&logDeleteOpts.taskid, "taskid", "", "Task Id")
flags.IntVar(&logDeleteOpts.step, "step", 0, "Step number")
flags.BoolVar(&logDeleteOpts.setup, "setup", false, "Setup step")

if err := cmdLogDelete.MarkFlagRequired("runid"); err != nil {
if err := cmdLogDelete.MarkFlagRequired("runnumber"); err != nil {
log.Fatal().Err(err).Send()
}

cmdLog.AddCommand(cmdLogDelete)
}

func logDelete(cmd *cobra.Command, args []string) error {

var taskid string

flags := cmd.Flags()

if flags.Changed("username") && flags.Changed("project") {
return errors.Errorf(`only one of "--username" or "--project" can be provided`)
}
if flags.Changed("taskname") && flags.Changed("taskid") {
return errors.Errorf(`only one of "--taskname" or "--taskid" can be provided`)
}
Expand All @@ -84,14 +91,22 @@ func logDelete(cmd *cobra.Command, args []string) error {

gwclient := gwclient.NewClient(gatewayURL, token)

isProject := !flags.Changed("username")

if flags.Changed("taskid") {
taskid = logDeleteOpts.taskid
}
if flags.Changed("taskname") {
var task *gwapitypes.RunResponseTask
var taskfound bool

run, _, err := gwclient.GetRun(context.TODO(), logDeleteOpts.runid)
var run *gwapitypes.RunResponse
var err error
if isProject {
run, _, err = gwclient.GetProjectRun(context.TODO(), logDeleteOpts.projectRef, logDeleteOpts.runNumber)
} else {
run, _, err = gwclient.GetUserRun(context.TODO(), logDeleteOpts.username, logDeleteOpts.runNumber)
}
if err != nil {
return errors.WithStack(err)
}
Expand All @@ -103,12 +118,21 @@ func logDelete(cmd *cobra.Command, args []string) error {
}
}
if !taskfound {
return errors.Errorf("task %q not found in run %q", logDeleteOpts.taskname, logDeleteOpts.runid)
return errors.Errorf("task %q not found in run %q", logDeleteOpts.taskname, logDeleteOpts.runNumber)
}
taskid = task.ID
}

log.Info().Msgf("deleting log")
if _, err := gwclient.DeleteLogs(context.TODO(), logDeleteOpts.runid, taskid, logDeleteOpts.setup, logDeleteOpts.step); err != nil {

var err error
if isProject {
_, err = gwclient.DeleteProjectLogs(context.TODO(), logDeleteOpts.projectRef, logDeleteOpts.runNumber, taskid, logDeleteOpts.setup, logDeleteOpts.step)
} else {
_, err = gwclient.DeleteUserLogs(context.TODO(), logDeleteOpts.username, logDeleteOpts.runNumber, taskid, logDeleteOpts.setup, logDeleteOpts.step)
}

if err != nil {
return errors.Errorf("failed to delete log: %v", err)
}

Expand Down
50 changes: 37 additions & 13 deletions cmd/agola/cmd/logget.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package cmd
import (
"context"
"io"
"net/http"
"os"

"agola.io/agola/internal/errors"
Expand All @@ -38,40 +39,47 @@ var cmdLogGet = &cobra.Command{
}

type logGetOptions struct {
runid string
taskname string
taskid string
step int
setup bool
follow bool
output string
projectRef string
username string
runNumber uint64
taskname string
taskid string
step int
setup bool
follow bool
output string
}

var logGetOpts logGetOptions

func init() {
flags := cmdLogGet.Flags()

flags.StringVar(&logGetOpts.runid, "runid", "", "Run Id")
flags.StringVar(&logGetOpts.projectRef, "project", "", "project id or full path")
flags.StringVar(&logGetOpts.username, "username", "", "user name for user direct runs")
flags.Uint64Var(&logGetOpts.runNumber, "runnumber", 0, "run number")
flags.StringVar(&logGetOpts.taskname, "taskname", "", "Task name")
flags.StringVar(&logGetOpts.taskid, "taskid", "", "Task Id")
flags.IntVar(&logGetOpts.step, "step", 0, "Step number")
flags.BoolVar(&logGetOpts.setup, "setup", false, "Setup step")
flags.BoolVar(&logGetOpts.follow, "follow", false, "Follow log stream")
flags.StringVar(&logGetOpts.output, "output", "", "Write output to file")

if err := cmdLogGet.MarkFlagRequired("runid"); err != nil {
if err := cmdLogGet.MarkFlagRequired("runnumber"); err != nil {
log.Fatal().Err(err).Send()
}

cmdLog.AddCommand(cmdLogGet)
}

func logGet(cmd *cobra.Command, args []string) error {

var taskid string

flags := cmd.Flags()

if flags.Changed("username") && flags.Changed("project") {
return errors.Errorf(`only one of "--username" or "--project" can be provided`)
}
if flags.Changed("taskname") && flags.Changed("taskid") {
return errors.Errorf(`only one of "--taskname" or "--taskid" can be provided`)
}
Expand All @@ -93,17 +101,26 @@ func logGet(cmd *cobra.Command, args []string) error {

gwclient := gwclient.NewClient(gatewayURL, token)

isProject := !flags.Changed("username")

if flags.Changed("taskid") {
taskid = logGetOpts.taskid
}
if flags.Changed("taskname") {
var task *gwapitypes.RunResponseTask
var taskfound bool

run, _, err := gwclient.GetRun(context.TODO(), logGetOpts.runid)
var run *gwapitypes.RunResponse
var err error
if isProject {
run, _, err = gwclient.GetProjectRun(context.TODO(), logGetOpts.projectRef, logGetOpts.runNumber)
} else {
run, _, err = gwclient.GetUserRun(context.TODO(), logGetOpts.username, logGetOpts.runNumber)
}
if err != nil {
return errors.WithStack(err)
}

for _, t := range run.Tasks {
if t.Name == logGetOpts.taskname {
task = t
Expand All @@ -112,13 +129,20 @@ func logGet(cmd *cobra.Command, args []string) error {
}
}
if !taskfound {
return errors.Errorf("task %q not found in run %q", logGetOpts.taskname, logGetOpts.runid)
return errors.Errorf("task %q not found in run %q", logGetOpts.taskname, logGetOpts.runNumber)
}
taskid = task.ID
}

log.Info().Msgf("getting log")
resp, err := gwclient.GetLogs(context.TODO(), logGetOpts.runid, taskid, logGetOpts.setup, logGetOpts.step, logGetOpts.follow)

var resp *http.Response
var err error
if isProject {
resp, err = gwclient.GetProjectLogs(context.TODO(), logGetOpts.projectRef, logGetOpts.runNumber, taskid, logGetOpts.setup, logGetOpts.step, logGetOpts.follow)
} else {
resp, err = gwclient.GetUserLogs(context.TODO(), logGetOpts.username, logGetOpts.runNumber, taskid, logGetOpts.setup, logGetOpts.step, logGetOpts.follow)
}
if err != nil {
return errors.Errorf("failed to get log: %v", err)
}
Expand Down
52 changes: 36 additions & 16 deletions cmd/agola/cmd/runlist.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package cmd
import (
"context"
"fmt"
"path"
"sort"

"agola.io/agola/internal/errors"
Expand All @@ -35,14 +34,15 @@ var cmdRunList = &cobra.Command{
log.Fatal().Err(err).Send()
}
},
Short: "list",
Short: "list runs for a specific project or user (direct runs)",
}

type runListOptions struct {
projectRef string
username string
phaseFilter []string
limit int
start string
start uint64
}

type runDetails struct {
Expand All @@ -63,20 +63,17 @@ func init() {
flags := cmdRunList.Flags()

flags.StringVar(&runListOpts.projectRef, "project", "", "project id or full path")
flags.StringVar(&runListOpts.username, "username", "", "User name for user direct runs")
flags.StringSliceVarP(&runListOpts.phaseFilter, "phase", "s", nil, "filter runs matching the provided phase. This option can be repeated multiple times")
flags.IntVar(&runListOpts.limit, "limit", 10, "max number of runs to show")
flags.StringVar(&runListOpts.start, "start", "", "starting run id (excluded) to fetch")

if err := cmdRunList.MarkFlagRequired("project"); err != nil {
log.Fatal().Err(err).Send()
}
flags.Uint64Var(&runListOpts.start, "start", 0, "starting run number (excluded) to fetch")

cmdRun.AddCommand(cmdRunList)
}

func printRuns(runs []*runDetails) {
for _, run := range runs {
fmt.Printf("%s: Phase: %s, Result: %s\n", run.runResponse.ID, run.runResponse.Phase, run.runResponse.Result)
fmt.Printf("%d: Phase: %s, Result: %s\n", run.runResponse.Number, run.runResponse.Phase, run.runResponse.Result)
for _, task := range run.tasks {
fmt.Printf("\tTaskName: %s, TaskID: %s, Status: %s\n", task.runTaskResponse.Name, task.runTaskResponse.ID, task.runTaskResponse.Status)
if task.retrieveError != nil {
Expand All @@ -95,28 +92,51 @@ func printRuns(runs []*runDetails) {
}

func runList(cmd *cobra.Command, args []string) error {
flags := cmd.Flags()

if flags.Changed("username") && flags.Changed("project") {
return errors.Errorf(`only one of "--username" or "--project" can be provided`)
}
if !flags.Changed("username") && !flags.Changed("project") {
return errors.Errorf(`one of "--username" or "--project" must be provided`)
}

gwclient := gwclient.NewClient(gatewayURL, token)

project, _, err := gwclient.GetProject(context.TODO(), runListOpts.projectRef)
if err != nil {
return errors.Errorf("failed to get project %s: %v", runListOpts.projectRef, err)
isProject := !flags.Changed("username")

var runsResp []*gwapitypes.RunsResponse
var err error
if isProject {
runsResp, _, err = gwclient.GetProjectRuns(context.TODO(), runListOpts.projectRef, runListOpts.phaseFilter, nil, runListOpts.start, runListOpts.limit, false)
} else {
runsResp, _, err = gwclient.GetUserRuns(context.TODO(), runListOpts.username, runListOpts.phaseFilter, nil, runListOpts.start, runListOpts.limit, false)
}
groups := []string{path.Join("/project", project.ID)}
runsResp, _, err := gwclient.GetRuns(context.TODO(), runListOpts.phaseFilter, nil, groups, nil, runListOpts.start, runListOpts.limit, false)
if err != nil {
return errors.WithStack(err)
}

runs := make([]*runDetails, len(runsResp))
for i, runResponse := range runsResp {
run, _, err := gwclient.GetRun(context.TODO(), runResponse.ID)
var err error
var run *gwapitypes.RunResponse
if isProject {
run, _, err = gwclient.GetProjectRun(context.TODO(), runListOpts.projectRef, runResponse.Number)
} else {
run, _, err = gwclient.GetUserRun(context.TODO(), runListOpts.username, runResponse.Number)
}
if err != nil {
return errors.WithStack(err)
}

tasks := []*taskDetails{}
for _, task := range run.Tasks {
runTaskResponse, _, err := gwclient.GetRunTask(context.TODO(), run.ID, task.ID)
var runTaskResponse *gwapitypes.RunTaskResponse
if isProject {
runTaskResponse, _, err = gwclient.GetUserRunTask(context.TODO(), runListOpts.projectRef, run.Number, task.ID)
} else {
runTaskResponse, _, err = gwclient.GetProjectRunTask(context.TODO(), runListOpts.username, run.Number, task.ID)
}
t := &taskDetails{
name: task.Name,
level: task.Level,
Expand Down
6 changes: 5 additions & 1 deletion internal/services/common/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,14 @@ func WebHookEventToRunRefType(we types.WebhookEvent) types.RunRefType {
panic(errors.Errorf("invalid webhook event type: %q", we))
}

func GenBaseRunGroup(baseGroupType GroupType, baseGroupID string) string {
return path.Join("/", string(baseGroupType), baseGroupID)
}

func GenRunGroup(baseGroupType GroupType, baseGroupID string, groupType GroupType, group string) string {
// we pathescape the branch name to handle branches with slashes and make the
// branch a single path entry
return path.Join("/", string(baseGroupType), baseGroupID, string(groupType), url.PathEscape(group))
return path.Join(GenBaseRunGroup(baseGroupType, baseGroupID), string(groupType), url.PathEscape(group))
}

func GroupTypeIDFromRunGroup(group string) (GroupType, string, error) {
Expand Down
Loading

0 comments on commit 95e67a3

Please sign in to comment.