Skip to content

Commit 3afbaad

Browse files
authored
Autocomplete flags (#107)
* Add Autocomplete to flags * Generic cache * Add Application autocompletion to all commands * Fix Application autocompletion to all commands, Add Component autocomplete * Add Component autocomplete * remove appName pointer to cleanup code * Add autocomplete of Deployments * Add autocomplete of Variables and Secrets * better failsafe * Set n to shorthand for component everywhere * Add Jobs autocompletion * revert "n" as shortcut for component * remove RADIX_ from available variables * use slice.FindAll() instead of slices.Filter()
1 parent c0ab9f4 commit 3afbaad

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+843
-190
lines changed

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ push:
1616
lint: bootstrap
1717
golangci-lint run --max-same-issues 0
1818

19+
install:
20+
go build ./cli/rx/
21+
mv rx $$(go env GOPATH)/bin/rx
22+
1923
HAS_SWAGGER := $(shell command -v swagger;)
2024
HAS_GOLANGCI_LINT := $(shell command -v golangci-lint;)
2125
HAS_GORELEASER := $(shell command -v goreleaser;)

cmd/createApplication.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/equinor/radix-cli/generated-client/client/platform"
2525
"github.com/equinor/radix-cli/generated-client/models"
2626
"github.com/equinor/radix-cli/pkg/client"
27+
"github.com/equinor/radix-cli/pkg/config"
2728
"github.com/equinor/radix-cli/pkg/flagnames"
2829
"github.com/spf13/cobra"
2930
)
@@ -35,7 +36,7 @@ var createApplicationCmd = &cobra.Command{
3536
Long: "Creates a Radix application in the cluster",
3637
Example: `rx create application --application your-application-name --repository https://github.com/your-repository --config-branch main --ad-groups abcdef-1234-5678-9aaa-abcdefgf --reader-ad-groups=23456789--9123-4567-8901-23456701 --shared-secret someSecretPhrase12345 --acknowledge-warnings --configuration-item "YOUR PROJECT CONFIG ITEM" --context playground`,
3738
RunE: func(cmd *cobra.Command, args []string) error {
38-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
39+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
3940
if err != nil {
4041
return err
4142
}
@@ -51,7 +52,7 @@ var createApplicationCmd = &cobra.Command{
5152
return err
5253
}
5354

54-
if appName == nil || *appName == "" || repository == "" || configBranch == "" || configurationItem == "" {
55+
if appName == "" || repository == "" || configBranch == "" || configurationItem == "" {
5556
return errors.New("application name, repository, configuration item and config branch are required fields")
5657
}
5758

@@ -67,7 +68,7 @@ var createApplicationCmd = &cobra.Command{
6768
AdGroups: adGroups,
6869
ConfigBranch: &configBranch,
6970
ConfigurationItem: configurationItem,
70-
Name: appName,
71+
Name: &appName,
7172
RadixConfigFullName: configFile,
7273
ReaderAdGroups: readerAdGroups,
7374
Repository: &repository,
@@ -98,7 +99,7 @@ var createApplicationCmd = &cobra.Command{
9899

99100
}
100101
deployKeyAndSecretParams := application.NewGetDeployKeyAndSecretParams()
101-
deployKeyAndSecretParams.SetAppName(*appName)
102+
deployKeyAndSecretParams.SetAppName(appName)
102103
getRadixRegistrationNoAccessErrorCount := 3
103104
getRadixRegistrationNoAccessErrorPause := 2 * time.Second
104105
for {

cmd/createApplyConfigPipelineJob.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import (
2020
"github.com/equinor/radix-cli/generated-client/client/application"
2121
"github.com/equinor/radix-cli/generated-client/models"
2222
"github.com/equinor/radix-cli/pkg/client"
23+
"github.com/equinor/radix-cli/pkg/config"
2324
"github.com/equinor/radix-cli/pkg/flagnames"
25+
"github.com/equinor/radix-cli/pkg/utils/completion"
2426
log "github.com/sirupsen/logrus"
2527
"github.com/spf13/cobra"
2628
)
@@ -37,7 +39,7 @@ Currently applied changes in properties DNS alias, build secrets, create new or
3739
rx create job apply-config -a radix-test`,
3840
RunE: func(cmd *cobra.Command, args []string) error {
3941
var errs []error
40-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
42+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
4143
if err != nil {
4244
errs = append(errs, err)
4345
}
@@ -52,7 +54,7 @@ Currently applied changes in properties DNS alias, build secrets, create new or
5254
if len(errs) > 0 {
5355
return errors.Join(errs...)
5456
}
55-
if appName == nil || *appName == "" {
57+
if appName == "" {
5658
return errors.New("application name is required")
5759
}
5860

@@ -64,7 +66,7 @@ Currently applied changes in properties DNS alias, build secrets, create new or
6466
}
6567

6668
triggerPipelineParams := application.NewTriggerPipelineApplyConfigParams()
67-
triggerPipelineParams.SetAppName(*appName)
69+
triggerPipelineParams.SetAppName(appName)
6870
parametersApplyConfig := models.PipelineParametersApplyConfig{
6971
TriggeredBy: triggeredByUser,
7072
}
@@ -80,7 +82,7 @@ Currently applied changes in properties DNS alias, build secrets, create new or
8082
if !follow {
8183
return nil
8284
}
83-
return getLogsJob(cmd, apiClient, *appName, jobName)
85+
return getLogsJob(cmd, apiClient, appName, jobName)
8486
},
8587
}
8688

@@ -89,5 +91,6 @@ func init() {
8991
createApplyConfigPipelineJobCmd.Flags().StringP(flagnames.Application, "a", "", "Name of the application to apply-config")
9092
createApplyConfigPipelineJobCmd.Flags().StringP(flagnames.User, "u", "", "The user who triggered the apply-config")
9193
createApplyConfigPipelineJobCmd.Flags().BoolP(flagnames.Follow, "f", false, "Follow applyConfig")
94+
_ = createApplyConfigPipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
9295
setContextSpecificPersistentFlags(createApplyConfigPipelineJobCmd)
9396
}

cmd/createBuildDeployPipelineJob.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ package cmd
1717
import (
1818
"errors"
1919

20+
"github.com/equinor/radix-cli/pkg/config"
2021
"github.com/equinor/radix-cli/pkg/model"
22+
"github.com/equinor/radix-cli/pkg/utils/completion"
2123
log "github.com/sirupsen/logrus"
2224

2325
"github.com/equinor/radix-cli/generated-client/client/application"
@@ -35,7 +37,7 @@ var createBuildDeployApplicationCmd = &cobra.Command{
3537
Short: "Will trigger build-deploy of a Radix application",
3638
Long: `Triggers build-deploy of Radix application, if branch to environment map exists for the branch in the Radix config`,
3739
RunE: func(cmd *cobra.Command, args []string) error {
38-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
40+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
3941
if err != nil {
4042
return err
4143
}
@@ -44,7 +46,7 @@ var createBuildDeployApplicationCmd = &cobra.Command{
4446
commitID, _ := cmd.Flags().GetString(flagnames.CommitID)
4547
follow, _ := cmd.Flags().GetBool(flagnames.Follow)
4648

47-
if appName == nil || *appName == "" || branch == "" {
49+
if appName == "" || branch == "" {
4850
return errors.New("application name and branch are required")
4951
}
5052
cmd.SilenceUsage = true
@@ -55,7 +57,7 @@ var createBuildDeployApplicationCmd = &cobra.Command{
5557
}
5658

5759
triggerPipelineParams := application.NewTriggerPipelineBuildDeployParams()
58-
triggerPipelineParams.SetAppName(*appName)
60+
triggerPipelineParams.SetAppName(appName)
5961
triggerPipelineParams.SetPipelineParametersBuild(&models.PipelineParametersBuild{
6062
Branch: branch,
6163
CommitID: commitID,
@@ -72,7 +74,7 @@ var createBuildDeployApplicationCmd = &cobra.Command{
7274
if !follow {
7375
return nil
7476
}
75-
return getLogsJob(cmd, apiClient, *appName, jobName)
77+
return getLogsJob(cmd, apiClient, appName, jobName)
7678
},
7779
}
7880

@@ -84,5 +86,6 @@ func init() {
8486
createBuildDeployApplicationCmd.Flags().BoolP(flagnames.Follow, "f", false, "Follow build-deploy")
8587
createBuildDeployApplicationCmd.Flags().Var(&overrideUseBuildCache, flagnames.UseBuildCache, "Optional. Overrides configured or default useBuildCache option. It is applicable when the useBuildKit option is set as true.")
8688

89+
_ = createBuildDeployApplicationCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
8790
setContextSpecificPersistentFlags(createBuildDeployApplicationCmd)
8891
}

cmd/createDeployPipelineJob.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"fmt"
2020
"regexp"
2121

22+
"github.com/equinor/radix-cli/pkg/config"
23+
"github.com/equinor/radix-cli/pkg/utils/completion"
2224
log "github.com/sirupsen/logrus"
2325

2426
"github.com/equinor/radix-cli/generated-client/client/application"
@@ -48,7 +50,7 @@ var createDeployPipelineJobCmd = &cobra.Command{
4850
rx create job deploy -a radix-test -e dev --component web-app --component api-server`,
4951
RunE: func(cmd *cobra.Command, args []string) error {
5052
var errs []error
51-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
53+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
5254
if err != nil {
5355
errs = append(errs, err)
5456
}
@@ -71,7 +73,7 @@ var createDeployPipelineJobCmd = &cobra.Command{
7173
if len(errs) > 0 {
7274
return errors.Join(errs...)
7375
}
74-
if appName == nil || *appName == "" || targetEnvironment == "" {
76+
if appName == "" || targetEnvironment == "" {
7577
return errors.New("application name and target environment are required")
7678
}
7779
commitID, _ := cmd.Flags().GetString(flagnames.CommitID)
@@ -92,7 +94,7 @@ var createDeployPipelineJobCmd = &cobra.Command{
9294
}
9395

9496
triggerPipelineParams := application.NewTriggerPipelineDeployParams()
95-
triggerPipelineParams.SetAppName(*appName)
97+
triggerPipelineParams.SetAppName(appName)
9698
parametersDeploy := models.PipelineParametersDeploy{
9799
ToEnvironment: targetEnvironment,
98100
ImageTagNames: imageTagNames,
@@ -112,7 +114,7 @@ var createDeployPipelineJobCmd = &cobra.Command{
112114
if !follow {
113115
return nil
114116
}
115-
return getLogsJob(cmd, apiClient, *appName, jobName)
117+
return getLogsJob(cmd, apiClient, appName, jobName)
116118
},
117119
}
118120

@@ -137,7 +139,10 @@ func init() {
137139
createDeployPipelineJobCmd.Flags().StringP(flagnames.User, "u", "", "The user who triggered the deploy")
138140
createDeployPipelineJobCmd.Flags().StringToStringP(flagnames.ImageTagName, "t", map[string]string{}, "Image tag name for a component: component-name=tag-name. Multiple pairs can be specified.")
139141
createDeployPipelineJobCmd.Flags().StringP(flagnames.CommitID, "i", "", "An optional 40 character commit id to tag the new pipeline job")
140-
createDeployPipelineJobCmd.Flags().StringSlice(flagnames.Component, []string{}, "Optional component to deploy, when only specific component need to be deployed. Multiple components can be specified.")
142+
createDeployPipelineJobCmd.Flags().StringSliceP(flagnames.Component, "n", []string{}, "Optional component to deploy, when only specific component need to be deployed. Multiple components can be specified.")
141143
createDeployPipelineJobCmd.Flags().BoolP(flagnames.Follow, "f", false, "Follow deploy")
144+
_ = createDeployPipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
145+
_ = createDeployPipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Environment, completion.EnvironmentCompletion)
146+
_ = createDeployPipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Component, completion.ComponentCompletion)
142147
setContextSpecificPersistentFlags(createDeployPipelineJobCmd)
143148
}

cmd/createEnvironment.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import (
1919

2020
"github.com/equinor/radix-cli/generated-client/client/environment"
2121
"github.com/equinor/radix-cli/pkg/client"
22+
"github.com/equinor/radix-cli/pkg/config"
2223
"github.com/equinor/radix-cli/pkg/flagnames"
24+
"github.com/equinor/radix-cli/pkg/utils/completion"
2325
"github.com/spf13/cobra"
2426
)
2527

@@ -29,21 +31,21 @@ var createEnvironmentCmd = &cobra.Command{
2931
Short: "Create environment",
3032
Long: `Creates a Radix environment for the application`,
3133
RunE: func(cmd *cobra.Command, args []string) error {
32-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
34+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
3335
if err != nil {
3436
return err
3537
}
3638

3739
envName, err := cmd.Flags().GetString(flagnames.Environment)
3840

39-
if err != nil || appName == nil || *appName == "" {
41+
if err != nil || appName == "" {
4042
return errors.New("environment name and application name are required fields")
4143
}
4244

4345
cmd.SilenceUsage = true
4446

4547
parameters := environment.NewCreateEnvironmentParams().
46-
WithAppName(*appName).
48+
WithAppName(appName).
4749
WithEnvName(envName)
4850

4951
apiClient, err := client.GetForCommand(cmd)
@@ -60,5 +62,7 @@ func init() {
6062
createCmd.AddCommand(createEnvironmentCmd)
6163
createEnvironmentCmd.Flags().StringP(flagnames.Application, "a", "", "Name of the application namespace")
6264
createEnvironmentCmd.Flags().StringP(flagnames.Environment, "e", "", "Name of the environment to create")
65+
_ = createEnvironmentCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
66+
_ = createEnvironmentCmd.RegisterFlagCompletionFunc(flagnames.Environment, completion.EnvironmentCompletion)
6367
setContextSpecificPersistentFlags(createEnvironmentCmd)
6468
}

cmd/createPromotePipelineJob.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020

2121
apiclient "github.com/equinor/radix-cli/generated-client/client"
2222
"github.com/equinor/radix-cli/generated-client/client/environment"
23+
"github.com/equinor/radix-cli/pkg/config"
24+
"github.com/equinor/radix-cli/pkg/utils/completion"
2325

2426
log "github.com/sirupsen/logrus"
2527

@@ -36,7 +38,7 @@ var createPromotePipelineJobCmd = &cobra.Command{
3638
Short: "Will trigger promote of a Radix application",
3739
Long: `Triggers promote of a Radix application deployment`,
3840
RunE: func(cmd *cobra.Command, args []string) error {
39-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
41+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
4042
if err != nil {
4143
return err
4244
}
@@ -55,7 +57,7 @@ var createPromotePipelineJobCmd = &cobra.Command{
5557
return errors.New("you cannot set use-active-deployment and specify deployment name at the same time")
5658
}
5759

58-
if appName == nil || *appName == "" || fromEnvironment == "" || toEnvironment == "" {
60+
if appName == "" || fromEnvironment == "" || toEnvironment == "" {
5961
return errors.New("application name, from and to environments are required")
6062
}
6163

@@ -67,7 +69,7 @@ var createPromotePipelineJobCmd = &cobra.Command{
6769
}
6870

6971
if useActiveDeployment {
70-
d, err := getActiveDeploymentName(apiClient, *appName, fromEnvironment)
72+
d, err := getActiveDeploymentName(apiClient, appName, fromEnvironment)
7173
if err != nil {
7274
return err
7375
}
@@ -76,7 +78,7 @@ var createPromotePipelineJobCmd = &cobra.Command{
7678
}
7779

7880
triggerPipelineParams := application.NewTriggerPipelinePromoteParams()
79-
triggerPipelineParams.SetAppName(*appName)
81+
triggerPipelineParams.SetAppName(appName)
8082
triggerPipelineParams.SetPipelineParametersPromote(&models.PipelineParametersPromote{
8183
DeploymentName: deploymentName,
8284
FromEnvironment: fromEnvironment,
@@ -95,7 +97,7 @@ var createPromotePipelineJobCmd = &cobra.Command{
9597
return nil
9698
}
9799

98-
return getLogsJob(cmd, apiClient, *appName, jobName)
100+
return getLogsJob(cmd, apiClient, appName, jobName)
99101
},
100102
}
101103

@@ -125,5 +127,9 @@ func init() {
125127
createPromotePipelineJobCmd.Flags().StringP(flagnames.User, "u", "", "The user who triggered the promote pipeline job")
126128
createPromotePipelineJobCmd.Flags().BoolP(flagnames.Follow, "f", false, "Follow the promote pipeline job log")
127129
createPromotePipelineJobCmd.Flags().BoolP(flagnames.UseActiveDeployment, "", false, "Promote the active deployment")
130+
_ = createPromotePipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
131+
_ = createPromotePipelineJobCmd.RegisterFlagCompletionFunc(flagnames.FromEnvironment, completion.EnvironmentCompletion)
132+
_ = createPromotePipelineJobCmd.RegisterFlagCompletionFunc(flagnames.ToEnvironment, completion.EnvironmentCompletion)
133+
_ = createPromotePipelineJobCmd.RegisterFlagCompletionFunc(flagnames.Deployment, completion.CreateDeploymentCompletion(flagnames.FromEnvironment, true))
128134
setContextSpecificPersistentFlags(createPromotePipelineJobCmd)
129135
}

cmd/deleteApplication.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import (
1919

2020
"github.com/equinor/radix-cli/generated-client/client/application"
2121
"github.com/equinor/radix-cli/pkg/client"
22+
"github.com/equinor/radix-cli/pkg/config"
2223
"github.com/equinor/radix-cli/pkg/flagnames"
24+
"github.com/equinor/radix-cli/pkg/utils/completion"
2325
"github.com/spf13/cobra"
2426
)
2527

@@ -29,19 +31,19 @@ var deleteApplicationCmd = &cobra.Command{
2931
Short: "Delete application",
3032
Long: `Will delete an application from the cluster`,
3133
RunE: func(cmd *cobra.Command, args []string) error {
32-
appName, err := getAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
34+
appName, err := config.GetAppNameFromConfigOrFromParameter(cmd, flagnames.Application)
3335
if err != nil {
3436
return err
3537
}
3638

37-
if appName == nil || *appName == "" {
39+
if appName == "" {
3840
return errors.New("application name is a required field")
3941
}
4042

4143
cmd.SilenceUsage = true
4244

4345
deleteApplicationParams := application.NewDeleteApplicationParams()
44-
deleteApplicationParams.SetAppName(*appName)
46+
deleteApplicationParams.SetAppName(appName)
4547

4648
apiClient, err := client.GetForCommand(cmd)
4749
if err != nil {
@@ -55,6 +57,7 @@ var deleteApplicationCmd = &cobra.Command{
5557

5658
func init() {
5759
deleteCmd.AddCommand(deleteApplicationCmd)
58-
deleteApplicationCmd.Flags().StringP(flagnames.Application, "a", "", "Name of the application to create")
60+
deleteApplicationCmd.Flags().StringP(flagnames.Application, "a", "", "Name of the application to delete")
61+
_ = deleteApplicationCmd.RegisterFlagCompletionFunc(flagnames.Application, completion.ApplicationCompletion)
5962
setContextSpecificPersistentFlags(deleteApplicationCmd)
6063
}

0 commit comments

Comments
 (0)