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
64 changes: 34 additions & 30 deletions cmd/tk/args.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"errors"
"os"
"path/filepath"
Expand All @@ -12,37 +13,40 @@ import (
"github.com/grafana/tanka/pkg/tanka"
)

var workflowArgs = cli.Args{
Validator: cli.ValidateExact(1),
Predictor: cli.PredictFunc(func(args complete.Args) []string {
pwd, err := os.Getwd()
if err != nil {
return nil
}

root, err := jpath.FindRoot(pwd)
if err != nil {
return nil
}

envs, err := tanka.FindEnvs(pwd, tanka.FindOpts{})
if err != nil && !errors.As(err, &tanka.ErrParallel{}) {
return nil
}

var reldirs []string
for _, env := range envs {
path := filepath.Join(root, env.Metadata.Namespace) // namespace == path on disk
reldir, err := filepath.Rel(pwd, path)
if err == nil {
reldirs = append(reldirs, reldir)
func generateWorkflowArgs(ctx context.Context) cli.Args {
var workflowArgs = cli.Args{
Validator: cli.ValidateExact(1),
Predictor: cli.PredictFunc(func(args complete.Args) []string {
pwd, err := os.Getwd()
if err != nil {
return nil
}
}

if len(reldirs) != 0 {
return reldirs
}
root, err := jpath.FindRoot(pwd)
if err != nil {
return nil
}

envs, err := tanka.FindEnvs(ctx, pwd, tanka.FindOpts{})
if err != nil && !errors.As(err, &tanka.ErrParallel{}) {
return nil
}

var reldirs []string
for _, env := range envs {
path := filepath.Join(root, env.Metadata.Namespace) // namespace == path on disk
reldir, err := filepath.Rel(pwd, path)
if err == nil {
reldirs = append(reldirs, reldir)
}
}

if len(reldirs) != 0 {
return reldirs
}

return complete.PredictFiles("*").Predict(args)
}),
return complete.PredictFiles("*").Predict(args)
}),
}
return workflowArgs
}
44 changes: 29 additions & 15 deletions cmd/tk/env.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"encoding/json"
"fmt"
"os"
Expand All @@ -14,14 +15,15 @@ import (
"github.com/pkg/errors"
"github.com/posener/complete"

"github.com/grafana/tanka/internal/telemetry"
"github.com/grafana/tanka/pkg/jsonnet/jpath"
"github.com/grafana/tanka/pkg/kubernetes/client"
"github.com/grafana/tanka/pkg/spec/v1alpha1"
"github.com/grafana/tanka/pkg/tanka"
"github.com/grafana/tanka/pkg/term"
)

func envCmd() *cli.Command {
func envCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Use: "env [action]",
Short: "manipulate environments",
Expand All @@ -30,10 +32,10 @@ func envCmd() *cli.Command {

addCommandsWithLogLevelOption(
cmd,
envAddCmd(),
envSetCmd(),
envListCmd(),
envRemoveCmd(),
envAddCmd(ctx),
envSetCmd(ctx),
envListCmd(ctx),
envRemoveCmd(ctx),
)

return cmd
Expand All @@ -46,11 +48,11 @@ var kubectlContexts = cli.PredictFunc(
},
)

func envSetCmd() *cli.Command {
func envSetCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Use: "set <path>",
Short: "update properties of an environment",
Args: workflowArgs,
Args: generateWorkflowArgs(ctx),
Predictors: complete.Flags{
"server-from-context": kubectlContexts,
},
Expand All @@ -65,6 +67,8 @@ func envSetCmd() *cli.Command {
_ = cmd.Flags().MarkHidden("name")

cmd.Run = func(cmd *cli.Command, args []string) error {
_, span := tracer.Start(ctx, "envSetCmd")
defer span.End()
if *name != "" {
return fmt.Errorf("it looks like you attempted to rename the environment using `--name`. However, this is not possible with Tanka, because the environments name is inferred from the directories name. To rename the environment, rename its directory instead")
}
Expand All @@ -82,7 +86,7 @@ func envSetCmd() *cli.Command {
tmp.Spec.APIServer = server
}

cfg, err := tanka.Peek(path, tanka.Opts{})
cfg, err := tanka.Peek(ctx, path, tanka.Opts{})
if err != nil {
return err
}
Expand Down Expand Up @@ -119,7 +123,7 @@ func envSetCmd() *cli.Command {
return cmd
}

func envAddCmd() *cli.Command {
func envAddCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Use: "add <path>",
Short: "create a new environment",
Expand All @@ -130,6 +134,8 @@ func envAddCmd() *cli.Command {
inline := cmd.Flags().BoolP("inline", "i", false, "create an inline environment")

cmd.Run = func(cmd *cli.Command, args []string) error {
_, span := tracer.Start(ctx, "envAddCmd")
defer span.End()
if cmd.Flags().Changed("server-from-context") {
server, err := client.IPFromContext(cfg.Spec.APIServer)
if err != nil {
Expand Down Expand Up @@ -200,13 +206,15 @@ func addEnv(dir string, cfg *v1alpha1.Environment, inline bool) error {
return nil
}

func envRemoveCmd() *cli.Command {
func envRemoveCmd(ctx context.Context) *cli.Command {
return &cli.Command{
Use: "remove <path>",
Aliases: []string{"rm"},
Short: "delete an environment",
Args: workflowArgs,
Args: generateWorkflowArgs(ctx),
Run: func(_ *cli.Command, args []string) error {
_, span := tracer.Start(ctx, "envRemoveCmd")
defer span.End()
for _, arg := range args {
path, err := filepath.Abs(arg)
if err != nil {
Expand All @@ -225,8 +233,8 @@ func envRemoveCmd() *cli.Command {
}
}

func envListCmd() *cli.Command {
args := workflowArgs
func envListCmd(ctx context.Context) *cli.Command {
args := generateWorkflowArgs(ctx)
args.Validator = cli.ArgsRange(0, 1)

cmd := &cli.Command{
Expand All @@ -246,6 +254,9 @@ func envListCmd() *cli.Command {
getJsonnetOpts := jsonnetFlags(cmd.Flags())

cmd.Run = func(_ *cli.Command, args []string) error {
ctx, span := tracer.Start(ctx, "envListCmd")
defer span.End()

var path string
var err error
if len(args) == 1 {
Expand All @@ -257,16 +268,19 @@ func envListCmd() *cli.Command {
}
}

envs, err := tanka.FindEnvs(path, tanka.FindOpts{JsonnetImplementation: jsonnetImplementation, Selector: getLabelSelector(), JsonnetOpts: getJsonnetOpts()})
envs, err := tanka.FindEnvs(ctx, path, tanka.FindOpts{JsonnetImplementation: jsonnetImplementation, Selector: getLabelSelector(), JsonnetOpts: getJsonnetOpts()})
if err != nil {
telemetry.FailSpanWithError(span, err)
return err
}
sort.SliceStable(envs, func(i, j int) bool { return envs[i].Metadata.Name < envs[j].Metadata.Name })

if *useJSON {
j, err := json.Marshal(envs)
if err != nil {
return fmt.Errorf("formatting as json: %s", err)
err = fmt.Errorf("formatting as json: %s", err)
telemetry.FailSpanWithError(span, err)
return err
}
fmt.Println(string(j))
return nil
Expand Down
14 changes: 9 additions & 5 deletions cmd/tk/export.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"errors"
"fmt"
"regexp"
Expand All @@ -13,8 +14,8 @@ import (
"github.com/grafana/tanka/pkg/tanka"
)

func exportCmd() *cli.Command {
args := workflowArgs
func exportCmd(ctx context.Context) *cli.Command {
args := generateWorkflowArgs(ctx)
args.Validator = cli.ArgsMin(2)

cmd := &cli.Command{
Expand Down Expand Up @@ -49,6 +50,9 @@ func exportCmd() *cli.Command {
recursive := cmd.Flags().BoolP("recursive", "r", false, "Look recursively for Tanka environments")

cmd.Run = func(_ *cli.Command, args []string) error {
ctx, span := tracer.Start(ctx, "exportCmd")
defer span.End()

// Allocate a block of memory to alter GC behaviour. See https://github.com/golang/go/issues/23044
ballast := make([]byte, *ballastBytes)
defer runtime.KeepAlive(ballast)
Expand Down Expand Up @@ -89,7 +93,7 @@ func exportCmd() *cli.Command {
// find possible environments
if *recursive {
// get absolute path to Environment
envs, err := tanka.FindEnvsFromPaths(args[1:], tanka.FindOpts{Selector: opts.Selector, Parallelism: opts.Parallelism, JsonnetOpts: opts.Opts.JsonnetOpts})
envs, err := tanka.FindEnvsFromPaths(ctx, args[1:], tanka.FindOpts{Selector: opts.Selector, Parallelism: opts.Parallelism, JsonnetOpts: opts.Opts.JsonnetOpts})
if err != nil {
return err
}
Expand All @@ -106,7 +110,7 @@ func exportCmd() *cli.Command {
}

// validate environment
env, err := tanka.Peek(args[1], opts.Opts)
env, err := tanka.Peek(ctx, args[1], opts.Opts)
if err != nil {
switch err.(type) {
case tanka.ErrMultipleEnvs:
Expand All @@ -121,7 +125,7 @@ func exportCmd() *cli.Command {
}

// export them
return tanka.ExportEnvironments(exportEnvs, args[0], &opts)
return tanka.ExportEnvironments(ctx, exportEnvs, args[0], &opts)
}
return cmd
}
Expand Down
5 changes: 4 additions & 1 deletion cmd/tk/fmt.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"fmt"
"io"
"os"
Expand All @@ -15,7 +16,7 @@ import (
// ArgStdin is the "magic" argument for reading from stdin
const ArgStdin = "-"

func fmtCmd() *cli.Command {
func fmtCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Use: "fmt <FILES|DIRECTORIES>",
Short: "format Jsonnet code",
Expand All @@ -31,6 +32,8 @@ func fmtCmd() *cli.Command {
verbose := cmd.Flags().BoolP("verbose", "v", false, "print each checked file")

cmd.Run = func(_ *cli.Command, args []string) error {
_, span := tracer.Start(ctx, "fmtCmd")
defer span.End()
if len(args) == 1 && args[0] == ArgStdin {
return fmtStdin(*test)
}
Expand Down
5 changes: 4 additions & 1 deletion cmd/tk/init.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"errors"
"fmt"
"os"
Expand All @@ -15,7 +16,7 @@ import (
const defaultK8sVersion = "1.29"

// initCmd creates a new application
func initCmd() *cli.Command {
func initCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Use: "init",
Short: "Create the directory structure",
Expand All @@ -27,6 +28,8 @@ func initCmd() *cli.Command {
inline := cmd.Flags().BoolP("inline", "i", false, "create an inline environment")

cmd.Run = func(_ *cli.Command, _ []string) error {
_, span := tracer.Start(ctx, "initCmd")
defer span.End()
failed := false

files, err := os.ReadDir(".")
Expand Down
7 changes: 4 additions & 3 deletions cmd/tk/jsonnet.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package main

import (
"context"
"encoding/json"

"github.com/go-clix/cli"

"github.com/grafana/tanka/pkg/tanka"
)

func evalCmd() *cli.Command {
func evalCmd(ctx context.Context) *cli.Command {
cmd := &cli.Command{
Short: "evaluate the jsonnet to json",
Use: "eval <path>",
Args: workflowArgs,
Args: generateWorkflowArgs(ctx),
}

var jsonnetImplementation string
Expand All @@ -29,7 +30,7 @@ func evalCmd() *cli.Command {
if *evalPattern != "" {
jsonnetOpts.EvalScript = tanka.PatternEvalScript(*evalPattern)
}
raw, err := tanka.Eval(args[0], jsonnetOpts)
raw, err := tanka.Eval(ctx, args[0], jsonnetOpts)

if raw == nil && err != nil {
return err
Expand Down
4 changes: 3 additions & 1 deletion cmd/tk/lint.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package main

import (
"context"

"github.com/go-clix/cli"
"github.com/gobwas/glob"
"github.com/posener/complete"

"github.com/grafana/tanka/pkg/jsonnet"
)

func lintCmd() *cli.Command {
func lintCmd(_ context.Context) *cli.Command {
cmd := &cli.Command{
Use: "lint <FILES|DIRECTORIES>",
Short: "lint Jsonnet code",
Expand Down
Loading
Loading