Skip to content
15 changes: 5 additions & 10 deletions internal/activity/command/command.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package command

import (
"context"

"github.com/nais/cli/internal/activity/command/flag"
"github.com/nais/cli/internal/flags"
"github.com/nais/cli/internal/validation"
Expand All @@ -11,15 +9,12 @@ import (

func Activity(parentFlags *flags.GlobalFlags) *naistrix.Command {
f := &flag.Activity{GlobalFlags: parentFlags}

return &naistrix.Command{
Name: "activity",
Title: "List team activity.",
Description: "View recent activity across all resources in a team, such as deployments, configuration changes, and other events.",
StickyFlags: f,
ValidateFunc: func(context.Context, *naistrix.Arguments) error {
return validation.CheckTeam(f.Team)
},
Name: "activity",
Title: "List team activity.",
Description: "View recent activity across all resources in a team, such as deployments, configuration changes, and other events.",
StickyFlags: f,
ValidateFunc: validation.RequireTeam(f),
SubCommands: []*naistrix.Command{
list(f),
},
Expand Down
16 changes: 6 additions & 10 deletions internal/app/command/command.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package command

import (
"context"

"github.com/nais/cli/internal/app/command/flag"
"github.com/nais/cli/internal/flags"
"github.com/nais/cli/internal/validation"
Expand All @@ -12,14 +10,12 @@ import (
func App(parentFlags *flags.GlobalFlags) *naistrix.Command {
flags := &flag.App{GlobalFlags: parentFlags}
return &naistrix.Command{
Name: "app",
Aliases: []string{"apps", "application", "applications"},
Title: "Interact with applications.",
Description: "Commands for managing and inspecting your team's applications, including listing, viewing activity and issues, restarting, and tailing logs.",
ValidateFunc: func(context.Context, *naistrix.Arguments) error {
return validation.CheckTeam(flags.Team)
},
StickyFlags: flags,
Name: "app",
Aliases: []string{"apps", "application", "applications"},
Title: "Interact with applications.",
Description: "Commands for managing and inspecting your team's applications, including listing, viewing activity and issues, restarting, and tailing logs.",
ValidateFunc: validation.RequireTeam(flags),
StickyFlags: flags,
SubCommands: []*naistrix.Command{
list(flags),
activity(flags),
Expand Down
24 changes: 9 additions & 15 deletions internal/apply/command/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,15 @@ func Apply(parentFlags *alpha.Alpha) *naistrix.Command {
},
AutoCompleteExtensions: []string{"yaml", "yml"},
Flags: flags,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if args.Get("file") == "" {
return fmt.Errorf("file cannot be empty")
}

if err := validation.CheckEnvironment(string(flags.Environment)); err != nil {
return err
}

if err := validation.CheckTeam(flags.Team); err != nil {
return err
}

return nil
},
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireTeamAndEnvironment(flags),
func(ctx context.Context, args *naistrix.Arguments) error {
if args.Get("file") == "" {
return fmt.Errorf("file cannot be empty")
}
return nil
},
),
RunFunc: func(ctx context.Context, args *naistrix.Arguments, out *naistrix.OutputWriter) error {
return apply.Run(ctx, string(flags.Environment), args.Get("file"), flags, out)
},
Expand Down
10 changes: 5 additions & 5 deletions internal/config/command/activity.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
activityutil "github.com/nais/cli/internal/activity"
"github.com/nais/cli/internal/config"
"github.com/nais/cli/internal/config/command/flag"
"github.com/nais/cli/internal/validation"
"github.com/nais/naistrix"
"github.com/nais/naistrix/output"
)
Expand All @@ -16,18 +17,17 @@ func activity(parentFlags *flag.Config) *naistrix.Command {
Output: "table",
Limit: 20,
}

return &naistrix.Command{
Name: "activity",
Title: "Show activity for a config.",
Description: "Show the activity log for a specific configuration, including creation, updates, and deletions. Optionally filter by activity type.",
Args: defaultArgs,
Flags: f,
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireTeamAndEnvironment(f),
validateArgs,
),
RunFunc: func(ctx context.Context, args *naistrix.Arguments, out *naistrix.OutputWriter) error {
if err := validateArgs(args); err != nil {
return err
}

activityTypes, err := activityutil.ParseActivityTypes(f.ActivityType)
if err != nil {
return err
Expand Down
14 changes: 6 additions & 8 deletions internal/config/command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@ import (
func Config(parentFlags *flags.GlobalFlags) *naistrix.Command {
f := &flag.Config{GlobalFlags: parentFlags}
return &naistrix.Command{
Name: "config",
Title: "Manage config for a team.",
Description: "Commands for listing, creating, viewing, updating, and deleting configuration values for a team across environments.",
StickyFlags: f,
ValidateFunc: func(context.Context, *naistrix.Arguments) error {
return validation.CheckTeam(f.Team)
},
Name: "config",
Title: "Manage config for a team.",
Description: "Commands for listing, creating, viewing, updating, and deleting configuration values for a team across environments.",
StickyFlags: f,
ValidateFunc: validation.RequireTeam(f),
SubCommands: []*naistrix.Command{
list(f),
activity(f),
Expand All @@ -38,7 +36,7 @@ var defaultArgs = []naistrix.Argument{
{Name: "name"},
}

func validateArgs(args *naistrix.Arguments) error {
func validateArgs(_ context.Context, args *naistrix.Arguments) error {
if args.Len() != 1 {
return fmt.Errorf("expected 1 argument, got %d", args.Len())
}
Expand Down
10 changes: 4 additions & 6 deletions internal/config/command/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,10 @@ func create(parentFlags *flag.Config) *naistrix.Command {
Description: "This command creates a new empty config in a team environment.",
Flags: f,
Args: defaultArgs,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if err := validation.CheckEnvironment(string(f.Environment)); err != nil {
return err
}
return validateArgs(args)
},
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireEnvironment(f),
validateArgs,
),
Examples: []naistrix.Example{
{
Description: "Create a config named my-config in environment dev.",
Expand Down
13 changes: 4 additions & 9 deletions internal/config/command/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,10 @@ func deleteConfig(parentFlags *flag.Config) *naistrix.Command {
Description: "This command deletes a config and all its values.",
Flags: f,
Args: defaultArgs,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if err := validateSingleEnvironmentFlagUsage(); err != nil {
return err
}
if err := validation.CheckEnvironment(string(f.Environment)); err != nil {
return err
}
return validateArgs(args)
},
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireEnvironment(f),
validateArgs,
),
AutoCompleteFunc: autoCompleteConfigNames(parentFlags),
Examples: []naistrix.Example{
{
Expand Down
13 changes: 0 additions & 13 deletions internal/config/command/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@ package command
import (
"context"
"fmt"
"os"
"slices"
"sort"
"strings"

"github.com/nais/cli/internal/cliflags"
"github.com/nais/cli/internal/config"
)

Expand Down Expand Up @@ -45,14 +43,3 @@ func selectConfigEnvironment(team, name, provided string, envs []string) (string
return "", fmt.Errorf("config %q exists in multiple environments (%s); specify -e, --environment", name, strings.Join(envs, ", "))
}
}

func validateSingleEnvironmentFlagUsage() error {
if countEnvironmentFlagsInCLIArgs() > 1 {
return fmt.Errorf("only one -e, --environment flag may be provided")
}
return nil
}

func countEnvironmentFlagsInCLIArgs() int {
return cliflags.CountFlagOccurrences(os.Args, "-e", "--environment")
}
31 changes: 12 additions & 19 deletions internal/config/command/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,26 +38,19 @@ func get(parentFlags *flag.Config) *naistrix.Command {
Description: "This command shows details about a config, including its key-value pairs, workloads using it, and last modification info.",
Flags: f,
Args: defaultArgs,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if err := validateSingleEnvironmentFlagUsage(); err != nil {
return err
}
if providedEnvironment := string(f.Environment); providedEnvironment != "" {
if err := validation.CheckEnvironment(providedEnvironment); err != nil {
return err
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireEnvironment(f),
validateArgs,
func(_ context.Context, args *naistrix.Arguments) error {
if f.ToFile != "" && f.Key == "" {
return fmt.Errorf("--to-file requires --key to specify which key to extract")
}
}
if err := validateArgs(args); err != nil {
return err
}
if f.ToFile != "" && f.Key == "" {
return fmt.Errorf("--to-file requires --key to specify which key to extract")
}
if f.Key != "" && f.ToFile == "" {
return fmt.Errorf("--key is only used with --to-file")
}
return nil
},
if f.Key != "" && f.ToFile == "" {
return fmt.Errorf("--key is only used with --to-file")
}
return nil
},
),
AutoCompleteFunc: autoCompleteConfigNames(parentFlags),
Examples: []naistrix.Example{
{
Expand Down
59 changes: 27 additions & 32 deletions internal/config/command/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,39 +24,34 @@ func set(parentFlags *flag.Config) *naistrix.Command {
Description: "Set a key-value pair in a config. If the key already exists, its value is updated. If the key does not exist, it is added. Updating a value will cause a restart of workloads referencing the config.",
Flags: f,
Args: defaultArgs,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if err := validateSingleEnvironmentFlagUsage(); err != nil {
return err
}
if err := validation.CheckEnvironment(string(f.Environment)); err != nil {
return err
}
if err := validateArgs(args); err != nil {
return err
}
if f.Key == "" {
return fmt.Errorf("--key is required")
}
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireEnvironment(f),
validateArgs,
func(_ context.Context, args *naistrix.Arguments) error {
if f.Key == "" {
return fmt.Errorf("--key is required")
}

// Count the number of value sources provided
sources := 0
if f.Value != "" {
sources++
}
if f.ValueFromStdin {
sources++
}
if f.ValueFromFile != "" {
sources++
}
if sources == 0 {
return fmt.Errorf("--value, --value-from-stdin, or --value-from-file is required")
}
if sources > 1 {
return fmt.Errorf("--value, --value-from-stdin, and --value-from-file are mutually exclusive")
}
return nil
},
// Count the number of value sources provided
sources := 0
if f.Value != "" {
sources++
}
if f.ValueFromStdin {
sources++
}
if f.ValueFromFile != "" {
sources++
}
if sources == 0 {
return fmt.Errorf("--value, --value-from-stdin, or --value-from-file is required")
}
if sources > 1 {
return fmt.Errorf("--value, --value-from-stdin, and --value-from-file are mutually exclusive")
}
return nil
},
),
AutoCompleteFunc: autoCompleteConfigNames(parentFlags),
Examples: []naistrix.Example{
{
Expand Down
25 changes: 10 additions & 15 deletions internal/config/command/unset.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,16 @@ func unset(parentFlags *flag.Config) *naistrix.Command {
Description: "This command removes a key-value pair from a config.",
Flags: f,
Args: defaultArgs,
ValidateFunc: func(_ context.Context, args *naistrix.Arguments) error {
if err := validateSingleEnvironmentFlagUsage(); err != nil {
return err
}
if err := validation.CheckEnvironment(string(f.Environment)); err != nil {
return err
}
if err := validateArgs(args); err != nil {
return err
}
if f.Key == "" {
return fmt.Errorf("--key is required")
}
return nil
},
ValidateFunc: naistrix.ValidateFuncs(
validation.RequireEnvironment(f),
validateArgs,
func(_ context.Context, args *naistrix.Arguments) error {
if f.Key == "" {
return fmt.Errorf("--key is required")
}
return nil
},
),
AutoCompleteFunc: autoCompleteConfigNames(parentFlags),
Examples: []naistrix.Example{
{
Expand Down
16 changes: 5 additions & 11 deletions internal/debug/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import (

const debugImageDefault = "europe-north1-docker.pkg.dev/nais-io/nais/images/debug:latest"

func Run(workloadName string, flags *flag.Debug, out *naistrix.OutputWriter) error {
clientSet, err := SetupClient(flags.DebugSticky)
func Run(workloadName, team, environment string, flags *flag.Debug, out *naistrix.OutputWriter) error {
clientSet, err := SetupClient(team, environment)
if err != nil {
return err
}
Expand All @@ -25,16 +25,10 @@ func Run(workloadName string, flags *flag.Debug, out *naistrix.OutputWriter) err
return nil
}

func SetupClient(flags *flag.DebugSticky) (kubernetes.Interface, error) {
client := k8s.SetupControllerRuntimeClient(k8s.WithKubeContext(string(flags.Environment)))

team, err := flags.RequiredTeam()
if err != nil {
return nil, err
}
func SetupClient(team, environment string) (kubernetes.Interface, error) {
client := k8s.SetupControllerRuntimeClient(k8s.WithKubeContext(environment))
client.CurrentNamespace = team

clientSet, err := k8s.SetupClientGo(string(flags.Environment))
clientSet, err := k8s.SetupClientGo(environment)
if err != nil {
return nil, err
}
Expand Down
Loading
Loading