Skip to content

Commit

Permalink
feat(tasks): add a tasks.lastSuccess function (#3144)
Browse files Browse the repository at this point in the history
This patch adds a `lastSuccess` function that can be used to return the
last successful time a task ran. This patch only provides the interface,
and will error if called directly, and will be overridden/implemented
on the server first.

Fixes #3080
  • Loading branch information
rockstar authored Aug 25, 2020
1 parent 0c46252 commit 15ebe46
Show file tree
Hide file tree
Showing 7 changed files with 268 additions and 1 deletion.
3 changes: 2 additions & 1 deletion libflux/go/libflux/buildinfo.gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ var sourceHashes = map[string]string{
"libflux/src/core/scanner/unicode.rl": "f923f3b385ddfa65c74427b11971785fc25ea806ca03d547045de808e16ef9a1",
"libflux/src/core/scanner/unicode.rl.COPYING": "6cf2d5d26d52772ded8a5f0813f49f83dfa76006c5f398713be3854fe7bc4c7e",
"libflux/src/core/semantic/bootstrap.rs": "6bc5eb694d5c2f439c02942ce55cee3dac5a10761d375e5276031522598fc2e0",
"libflux/src/core/semantic/builtins.rs": "4ad03ce65a6dd746e63449e8d5d7a6f0c8fd2bb02d4d797b11a5ae613e85eda0",
"libflux/src/core/semantic/builtins.rs": "1b9f4313bf472fe4f88f4777d29fec0094168b892b0db72d7b21d926e5e72bf9",
"libflux/src/core/semantic/check.rs": "acb29602ee01f636818ba3522b3f110018abca3e7b4a6b75c29eec97856a324e",
"libflux/src/core/semantic/convert.rs": "d4b1b98565c931742a2294ad7eadd864a11be4d5011e8e86240c5a7b645982b8",
"libflux/src/core/semantic/env.rs": "e031d5b752d207a8f93bacd8515639e832735d5a85e90db76690aaeee8168127",
Expand Down Expand Up @@ -165,6 +165,7 @@ var sourceHashes = map[string]string{
"stdlib/influxdata/influxdb/monitor/state_changes_test.flux": "a2e17c3aa24d37b007b1f04e23dffc839b012fe9e697360df10d3056a3b1f152",
"stdlib/influxdata/influxdb/secrets/secrets.flux": "6bde1ad9b1d0007cb5167c82a68409e64204e4080f6fa7aad1483df759bf7af7",
"stdlib/influxdata/influxdb/secrets/secrets_test.flux": "bda0415e808407a82551fd01304ed28ff109cf705264a8d47932a971e866f829",
"stdlib/influxdata/influxdb/tasks/tasks.flux": "40c1151bd9ea852f020ff27a15e64f084508397a97068f11dd0cae2788b1ecf1",
"stdlib/influxdata/influxdb/v1/influxFieldsAsCols_test.flux": "ac40aa200b7434f752b9bfea346b8ecde3f3657d7acdc2383023d7024650ace1",
"stdlib/influxdata/influxdb/v1/influxRawQuery_test.flux": "0f28de51d0c30f231e059fe104f49d7d58b22a44700ae363542cb1a4e0b1c0e7",
"stdlib/influxdata/influxdb/v1/measurement_field_keys_test.flux": "7b0c2b6ab8509f3f96524498d1b4a615c403a72cae724e747205650d02e761f8",
Expand Down
3 changes: 3 additions & 0 deletions libflux/src/core/semantic/builtins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ pub fn builtins() -> Builtins<'static> {
"influxdata/influxdb/secrets" => semantic_map! {
"get" => "(key: string) => string",
},
"influxdata/influxdb/tasks" => semantic_map! {
"lastSuccess" => "(orTime: time) => time",
},
"influxdata/influxdb/v1" => semantic_map! {
// exactly one of json and file must be specified
// https://github.com/influxdata/flux/issues/2250
Expand Down
181 changes: 181 additions & 0 deletions stdlib/influxdata/influxdb/tasks/flux_gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
// DO NOT EDIT: This file is autogenerated via the builtin command.

package tasks

import (
ast "github.com/influxdata/flux/ast"
parser "github.com/influxdata/flux/internal/parser"
runtime "github.com/influxdata/flux/runtime"
)

func init() {
runtime.RegisterPackage(pkgAST)
}

var pkgAST = &ast.Package{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: nil,
},
Files: []*ast.File{&ast.File{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 20,
Line: 10,
},
File: "tasks.flux",
Source: "package tasks\n\noption lastSuccessTime = 0000-01-01T00:00:00Z\n\n// This is currently a noop, as its implementation is meant to be\n// overridden elsewhere.\n// As this function currently only returns an unimplemented error, and \n// flux has no support for doing this natively, this function is a builtin.\n// When fully implemented, it should be able to be implemented in pure flux.\nbuiltin lastSuccess",
Start: ast.Position{
Column: 1,
Line: 1,
},
},
},
Body: []ast.Statement{&ast.OptionStatement{
Assignment: &ast.VariableAssignment{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 46,
Line: 3,
},
File: "tasks.flux",
Source: "lastSuccessTime = 0000-01-01T00:00:00Z",
Start: ast.Position{
Column: 8,
Line: 3,
},
},
},
ID: &ast.Identifier{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 23,
Line: 3,
},
File: "tasks.flux",
Source: "lastSuccessTime",
Start: ast.Position{
Column: 8,
Line: 3,
},
},
},
Name: "lastSuccessTime",
},
Init: &ast.DateTimeLiteral{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 46,
Line: 3,
},
File: "tasks.flux",
Source: "0000-01-01T00:00:00Z",
Start: ast.Position{
Column: 26,
Line: 3,
},
},
},
Value: parser.MustParseTime("0000-01-01T00:00:00Z"),
},
},
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 46,
Line: 3,
},
File: "tasks.flux",
Source: "option lastSuccessTime = 0000-01-01T00:00:00Z",
Start: ast.Position{
Column: 1,
Line: 3,
},
},
},
}, &ast.BuiltinStatement{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 20,
Line: 10,
},
File: "tasks.flux",
Source: "builtin lastSuccess",
Start: ast.Position{
Column: 1,
Line: 10,
},
},
},
ID: &ast.Identifier{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 20,
Line: 10,
},
File: "tasks.flux",
Source: "lastSuccess",
Start: ast.Position{
Column: 9,
Line: 10,
},
},
},
Name: "lastSuccess",
},
}},
Imports: nil,
Metadata: "parser-type=rust",
Name: "tasks.flux",
Package: &ast.PackageClause{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 14,
Line: 1,
},
File: "tasks.flux",
Source: "package tasks",
Start: ast.Position{
Column: 1,
Line: 1,
},
},
},
Name: &ast.Identifier{
BaseNode: ast.BaseNode{
Errors: nil,
Loc: &ast.SourceLocation{
End: ast.Position{
Column: 14,
Line: 1,
},
File: "tasks.flux",
Source: "tasks",
Start: ast.Position{
Column: 9,
Line: 1,
},
},
},
Name: "tasks",
},
},
}},
Package: "tasks",
Path: "influxdata/influxdb/tasks",
}
34 changes: 34 additions & 0 deletions stdlib/influxdata/influxdb/tasks/lastSuccess_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package tasks_test

import (
"context"
"testing"

"github.com/google/go-cmp/cmp"
"github.com/influxdata/flux"
"github.com/influxdata/flux/codes"
"github.com/influxdata/flux/dependencies/dependenciestest"
"github.com/influxdata/flux/stdlib/influxdata/influxdb/tasks"
"github.com/influxdata/flux/values"
)

func TestLastSuccess(t *testing.T) {
t.Run("lastSuccess test", func(t *testing.T) {
fluxArg := values.NewObjectWithValues(map[string]values.Value{"orTime": values.NewTime(100)})

_, got := tasks.LastSuccessFunction.Call(dependenciestest.Default().Inject(context.Background()), fluxArg)

if got == nil {
t.Fatal("lastSuccess should produce an error")
}

want := &flux.Error{
Code: codes.Unimplemented,
Msg: "This function is not yet implemented.",
}

if !cmp.Equal(want, got) {
t.Fatalf("unexpected result -want/+got\n\n%s\n\n", cmp.Diff(want, got))
}
})
}
10 changes: 10 additions & 0 deletions stdlib/influxdata/influxdb/tasks/tasks.flux
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package tasks

option lastSuccessTime = 0000-01-01T00:00:00Z

// This is currently a noop, as its implementation is meant to be
// overridden elsewhere.
// As this function currently only returns an unimplemented error, and
// flux has no support for doing this natively, this function is a builtin.
// When fully implemented, it should be able to be implemented in pure flux.
builtin lastSuccess
37 changes: 37 additions & 0 deletions stdlib/influxdata/influxdb/tasks/tasks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package tasks

import (
"context"

"github.com/influxdata/flux/codes"
"github.com/influxdata/flux/internal/errors"
"github.com/influxdata/flux/interpreter"
"github.com/influxdata/flux/runtime"
"github.com/influxdata/flux/values"
)

const LastSuccessKind = "lastSuccess"

func init() {
runtime.RegisterPackageValue("influxdata/influxdb/tasks", LastSuccessKind, LastSuccessFunction)
}

// LastSuccessFunction is a function that calls LastSuccess.
var LastSuccessFunction = makeLastSuccessFunc()

func makeLastSuccessFunc() values.Function {
sig := runtime.MustLookupBuiltinType("influxdata/influxdb/tasks", "lastSuccess")
return values.NewFunction("lastSuccess", sig, LastSuccess, false)
}

// LastSuccess retrieves the last successful run of the task, or returns the value of the
// orTime parameter if the task has never successfully run.
func LastSuccess(ctx context.Context, args values.Object) (values.Value, error) {
fargs := interpreter.NewArguments(args)
_, err := fargs.GetRequired("orTime")
if err != nil {
return nil, err
}

return nil, errors.Newf(codes.Unimplemented, "This function is not yet implemented.")
}
1 change: 1 addition & 0 deletions stdlib/packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
_ "github.com/influxdata/flux/stdlib/influxdata/influxdb"
_ "github.com/influxdata/flux/stdlib/influxdata/influxdb/monitor"
_ "github.com/influxdata/flux/stdlib/influxdata/influxdb/secrets"
_ "github.com/influxdata/flux/stdlib/influxdata/influxdb/tasks"
_ "github.com/influxdata/flux/stdlib/influxdata/influxdb/v1"
_ "github.com/influxdata/flux/stdlib/internal/debug"
_ "github.com/influxdata/flux/stdlib/internal/gen"
Expand Down

0 comments on commit 15ebe46

Please sign in to comment.