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
4 changes: 2 additions & 2 deletions .github/workflows/golangci-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ on:

jobs:
call-workflow-passing-data:
uses: cyverse-de/github-workflows/.github/workflows/golangci-lint.yml@v0.0.4
uses: cyverse-de/github-workflows/.github/workflows/golangci-lint.yml@v0.2.5
with:
go-version: 1.21
go-version: 1.26
3 changes: 2 additions & 1 deletion .github/workflows/skaffold-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+"
- "v[0-9]+.[0-9]+.[0-9]+-u[0-9]+"
- "v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+"

jobs:
call-workflow-passing-data:
uses: cyverse-de/github-workflows/.github/workflows/skaffold-build.yml@v0.0.7
uses: cyverse-de/github-workflows/.github/workflows/skaffold-build.yml@v0.2.5
with:
build-prerelease: ${{ contains(github.ref_name, '-rc') }}
secrets:
Expand Down
17 changes: 14 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
FROM golang:1.21
FROM golang:1.26 AS builder

WORKDIR /build

COPY go.mod go.sum ./
RUN go mod download

WORKDIR /go/src/github.com/cyverse-de/async-tasks
COPY . .

ENV CGO_ENABLED=0
RUN go install

RUN go build -o async-tasks .


FROM gcr.io/distroless/static-debian13:nonroot

COPY --from=builder /build/async-tasks /bin/async-tasks

ENTRYPOINT ["async-tasks"]
CMD ["--help"]
Expand Down
7 changes: 0 additions & 7 deletions Jenkinsfile

This file was deleted.

14 changes: 8 additions & 6 deletions app.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package main

import (
"database/sql"
"encoding/json"
"fmt"
"io"
"net/http"
"time"

"github.com/cyverse-de/async-tasks/database"
"github.com/cyverse-de/async-tasks/internal/logutil"
"github.com/cyverse-de/async-tasks/model"
"github.com/gorilla/mux"
)
Expand Down Expand Up @@ -73,7 +75,7 @@ func (a *AsyncTasksApp) GetByIdRequest(writer http.ResponseWriter, r *http.Reque
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

task, err := tx.GetTask(ctx, id, false)
if err != nil {
Expand Down Expand Up @@ -116,7 +118,7 @@ func (a *AsyncTasksApp) DeleteByIdRequest(writer http.ResponseWriter, r *http.Re
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

task, err := tx.GetTask(ctx, id, true)
if err != nil {
Expand Down Expand Up @@ -206,7 +208,7 @@ func (a *AsyncTasksApp) GetByFilterRequest(writer http.ResponseWriter, r *http.R
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

tasks, err := tx.GetTasksByFilter(ctx, filters, "")
if err != nil {
Expand Down Expand Up @@ -271,7 +273,7 @@ func (a *AsyncTasksApp) CreateTaskRequest(writer http.ResponseWriter, r *http.Re
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

id, err := tx.InsertTask(ctx, rawtask)
if err != nil {
Expand Down Expand Up @@ -315,7 +317,7 @@ func (a *AsyncTasksApp) AddStatusRequest(writer http.ResponseWriter, r *http.Req
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

task, err := tx.GetTask(ctx, id, true)
if err != nil {
Expand Down Expand Up @@ -387,7 +389,7 @@ func (a *AsyncTasksApp) AddBehaviorRequest(writer http.ResponseWriter, r *http.R
errored(writer, err.Error())
return
}
defer tx.Rollback() // nolint:errcheck
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

task, err := tx.GetTask(ctx, id, true)
if err != nil {
Expand Down
17 changes: 6 additions & 11 deletions behaviors/statuschangetimeout/statuschangetimeout.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package statuschangetimeout

import (
"context"
"database/sql"
"time"

"github.com/cyverse-de/async-tasks/database"
"github.com/cyverse-de/async-tasks/internal/logutil"
"github.com/cyverse-de/async-tasks/model"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
Expand All @@ -19,13 +21,6 @@ type StatusChangeTimeoutData struct {
Delete bool `mapstructure:"delete"`
}

func rollbackLogError(tx *database.DBTx, log *logrus.Entry) {
err := tx.Rollback()
if err != nil {
log.Error(err)
}
}

func processSingleTask(ctx context.Context, log *logrus.Entry, db *database.DBConnection, ID string) error {
select {
// If the context is cancelled, don't bother
Expand All @@ -38,7 +33,7 @@ func processSingleTask(ctx context.Context, log *logrus.Entry, db *database.DBCo
if err != nil {
return err
}
defer rollbackLogError(tx, log)
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

fullTask, err := tx.GetTask(ctx, ID, true)
if err != nil {
Expand All @@ -65,7 +60,7 @@ func processSingleTask(ctx context.Context, log *logrus.Entry, db *database.DBCo
for _, behavior := range fullTask.Behaviors {
// only one of each type because of the DB FK
if behavior.BehaviorType == "statuschangetimeout" {
data, ok := behavior.Data["statuses"].([]interface{})
data, ok := behavior.Data["statuses"].([]any)
if !ok {
err = errors.New("Behavior data is not an array")
log.Error(err)
Expand Down Expand Up @@ -139,14 +134,14 @@ func Processor(ctx context.Context, log *logrus.Entry, _ time.Time, db *database
if err != nil {
return err
}
defer rollbackLogError(tx, log)
defer logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

tasks, err := tx.GetTasksByFilter(ctx, filter, "end_date IS NOT NULL DESC")
if err != nil {
return err
}

rollbackLogError(tx, log)
logutil.LogIfError(log, tx.Rollback, sql.ErrTxDone)

log.Infof("Tasks with statuschangetimeout behavior: %d", len(tasks))

Expand Down
23 changes: 12 additions & 11 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"database/sql"

"github.com/Masterminds/squirrel"
"github.com/cyverse-de/async-tasks/internal/logutil"
"github.com/cyverse-de/async-tasks/model"
"github.com/cyverse-de/dbutil"
"github.com/lib/pq"
Expand Down Expand Up @@ -109,7 +110,7 @@ func (t *DBTx) getBaseTask(ctx context.Context, id string, forUpdate bool) (*mod
if err != nil {
return nil, err
}
defer rows.Close()
defer logutil.LogIfError(t.log, rows.Close)

var dbtask model.DBTask
for rows.Next() {
Expand All @@ -134,7 +135,7 @@ func makeTask(dbtask model.DBTask) (*model.AsyncTask, error) {
}

if dbtask.Data.Valid {
jsonData := make(map[string]interface{})
jsonData := make(map[string]any)

err = json.Unmarshal([]byte(dbtask.Data.String), &jsonData)
if err != nil {
Expand Down Expand Up @@ -225,7 +226,7 @@ func (t *DBTx) getTaskBehaviors(ctx context.Context, id string, forUpdate bool)
if err != nil {
return nil, err
}
defer rows.Close()
defer logutil.LogIfError(t.log, rows.Close)

var behaviors []model.AsyncTaskBehavior
for rows.Next() {
Expand All @@ -236,7 +237,7 @@ func (t *DBTx) getTaskBehaviors(ctx context.Context, id string, forUpdate bool)

behavior := model.AsyncTaskBehavior{BehaviorType: dbbehavior.BehaviorType}
if dbbehavior.Data.Valid {
jsonData := make(map[string]interface{})
jsonData := make(map[string]any)

err = json.Unmarshal([]byte(dbbehavior.Data.String), &jsonData)
if err != nil {
Expand Down Expand Up @@ -268,7 +269,7 @@ func (t *DBTx) getTaskStatuses(ctx context.Context, id string, forUpdate bool) (
if err != nil {
return nil, err
}
defer rows.Close()
defer logutil.LogIfError(t.log, rows.Close)

var statuses []model.AsyncTaskStatus
for rows.Next() {
Expand Down Expand Up @@ -366,7 +367,7 @@ func (t *DBTx) GetTasksByFilter(ctx context.Context, filters TaskFilter, order s
if err != nil {
return nil, err
}
defer rows.Close()
defer logutil.LogIfError(t.log, rows.Close)

for rows.Next() {
var dbtask model.DBTask
Expand All @@ -392,13 +393,13 @@ func (t *DBTx) GetTasksByFilter(ctx context.Context, filters TaskFilter, order s
// InsertTask inserts a provided AsyncTask into the DB and returns the task's generated ID as a string
func (t *DBTx) InsertTask(ctx context.Context, task model.AsyncTask) (string, error) {
if task.Type == "" {
return "", errors.New("Task type must be provided")
return "", errors.New("task type must be provided")
}

query := psql.Insert("async_tasks").Suffix("RETURNING id::text")

var columns []string
var args []interface{}
var args []any

columns = append(columns, "type")
args = append(args, task.Type)
Expand Down Expand Up @@ -437,7 +438,7 @@ func (t *DBTx) InsertTask(ctx context.Context, task model.AsyncTask) (string, er
if err != nil {
return "", err
}
defer rows.Close()
defer logutil.LogIfError(t.log, rows.Close)

var id string
for rows.Next() {
Expand Down Expand Up @@ -472,7 +473,7 @@ func (t *DBTx) InsertTask(ctx context.Context, task model.AsyncTask) (string, er
// InsertTaskStatus inserts a provided AsyncTaskStatus into the DB for the provided async task ID
func (t *DBTx) InsertTaskStatus(ctx context.Context, status model.AsyncTaskStatus, taskID string) error {
if status.Status == "" {
return errors.New("Status type must be provided")
return errors.New("status type must be provided")
}

query := psql.Insert("async_task_status").Columns("async_task_id", "status", "detail", "created_date")
Expand Down Expand Up @@ -500,7 +501,7 @@ func (t *DBTx) InsertTaskStatus(ctx context.Context, status model.AsyncTaskStatu
// InsertTaskBehavior inserts a provided AsyncTaskBehavior into the DB for the provided async task ID
func (t *DBTx) InsertTaskBehavior(ctx context.Context, behavior model.AsyncTaskBehavior, taskID string) error {
if behavior.BehaviorType == "" {
return errors.New("Behavior type must be provided")
return errors.New("behavior type must be provided")
}

query := psql.Insert("async_task_behavior")
Expand Down
53 changes: 28 additions & 25 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,51 +1,54 @@
module github.com/cyverse-de/async-tasks

go 1.25.0
go 1.26.0

require (
github.com/Masterminds/squirrel v1.5.4
github.com/cyverse-de/configurate v0.0.0-20220113221928-13d34aae3f0f
github.com/cyverse-de/configurate v0.0.0-20260305004742-e3d1c1150f1e
github.com/cyverse-de/dbutil v1.0.1
github.com/cyverse-de/go-mod/otelutils v0.0.3
github.com/cyverse-de/go-mod/otelutils v0.0.6
github.com/gorilla/mux v1.8.1
github.com/lib/pq v1.10.9
github.com/lib/pq v1.12.3
github.com/mitchellh/mapstructure v1.5.0
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.9.3
github.com/spf13/viper v1.18.2
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.49.0
github.com/sirupsen/logrus v1.9.4
github.com/spf13/viper v1.21.0
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.68.0
go.opentelemetry.io/otel v1.43.0
go.opentelemetry.io/otel/trace v1.43.0
)

require (
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fsnotify/fsnotify v1.10.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/pelletier/go-toml/v2 v2.3.1 // indirect
github.com/sagikazarmark/locafero v0.12.0 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.3 // indirect
github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect
go.opentelemetry.io/otel/metric v1.43.0 // indirect
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
golang.org/x/sys v0.42.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.54.0 // indirect
golang.org/x/sys v0.44.0 // indirect
golang.org/x/text v0.37.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect
google.golang.org/grpc v1.81.1 // indirect
google.golang.org/protobuf v1.36.11 // indirect
)
Loading