Skip to content

Commit b8df93d

Browse files
author
David Gamero
committed
add selectors and azclient cleanup
1 parent f6c230c commit b8df93d

File tree

9 files changed

+256
-277
lines changed

9 files changed

+256
-277
lines changed

cmd/setup-gh.go

Lines changed: 72 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"os"
8+
"path/filepath"
79
"strings"
810

9-
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v3"
10-
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
11+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
1112
"github.com/Azure/draft/pkg/cred"
1213
"github.com/Azure/draft/pkg/prompts"
1314
"github.com/manifoldco/promptui"
@@ -34,23 +35,11 @@ application and service principle, and will configure that application to trust
3435
providers.EnsureGhCli()
3536

3637
azCred, err := cred.GetCred()
38+
az, err := providers.NewAzClient(azCred)
3739
if err != nil {
3840
return fmt.Errorf("getting credentials: %w", err)
3941
}
40-
41-
client, err := armsubscription.NewTenantsClient(azCred, nil)
42-
if err != nil {
43-
return fmt.Errorf("creating tenants client: %w", err)
44-
}
45-
46-
sc.AzClient.AzTenantClient = client
47-
48-
roleAssignmentClient, err := armauthorization.NewRoleAssignmentsClient(sc.SubscriptionID, azCred, nil)
49-
if err != nil {
50-
return fmt.Errorf("getting role assignment client: %w", err)
51-
}
52-
53-
sc.AzClient.RoleAssignClient = roleAssignmentClient
42+
sc.AzClient = az
5443

5544
err = fillSetUpConfig(sc)
5645
if err != nil {
@@ -82,8 +71,26 @@ application and service principle, and will configure that application to trust
8271
}
8372

8473
func fillSetUpConfig(sc *providers.SetUpCmd) error {
74+
if sc.TenantId == "" {
75+
tenandId, err := providers.PromptTenantId(sc.AzClient, context.Background())
76+
if err != nil {
77+
return fmt.Errorf("prompting tenant ID: %w", err)
78+
}
79+
sc.TenantId = tenandId
80+
}
81+
8582
if sc.AppName == "" {
86-
sc.AppName = getAppName()
83+
// make the default app name the current directory name plus "workflow" and a string
84+
85+
// get the current directory name
86+
dir, err := os.Getwd()
87+
if err != nil {
88+
return fmt.Errorf("getting current directory: %w", err)
89+
}
90+
dirBase := filepath.Base(dir)
91+
defaultAppName := dirBase + "-workflow"
92+
93+
sc.AppName = PromptAppName(sc.AzClient, defaultAppName)
8794
}
8895

8996
if sc.SubscriptionID == "" {
@@ -108,7 +115,11 @@ func fillSetUpConfig(sc *providers.SetUpCmd) error {
108115
}
109116

110117
if sc.ResourceGroupName == "" {
111-
sc.ResourceGroupName = getResourceGroup()
118+
rg, err := getResourceGroup(sc.AzClient, sc.SubscriptionID)
119+
if err != nil {
120+
return fmt.Errorf("getting resource group: %w", err)
121+
}
122+
sc.ResourceGroupName = *rg.Name
112123
}
113124

114125
if sc.Repo == "" {
@@ -132,26 +143,37 @@ func runProviderSetUp(ctx context.Context, sc *providers.SetUpCmd, s spinner.Spi
132143
return nil
133144
}
134145

135-
func getAppName() string {
146+
func PromptAppName(az providers.AzClientInterface, defaultAppName string) string {
136147
validate := func(input string) error {
137148
if input == "" {
138149
return errors.New("Invalid app name")
139150
}
140151
return nil
141152
}
142153

143-
prompt := promptui.Prompt{
154+
appNamePrompt := &promptui.Prompt{
144155
Label: "Enter app registration name",
145156
Validate: validate,
157+
Default: defaultAppName,
146158
}
147-
148-
result, err := prompt.Run()
159+
appName, err := appNamePrompt.Run()
149160

150161
if err != nil {
151162
return err.Error()
152163
}
153164

154-
return result
165+
if providers.AzAppExists(appName) {
166+
confirmAppExistsPrompt := promptui.Prompt{
167+
Label: "An app with this name already exists. Would you like to use it?",
168+
IsConfirm: true,
169+
}
170+
_, err := confirmAppExistsPrompt.Run()
171+
if err != nil {
172+
appName = PromptAppName(az, defaultAppName)
173+
}
174+
}
175+
176+
return appName
155177
}
156178

157179
func getSubscriptionID() string {
@@ -176,47 +198,57 @@ func getSubscriptionID() string {
176198
return result
177199
}
178200

179-
func getResourceGroup() string {
180-
validate := func(input string) error {
181-
if input == "" {
182-
return errors.New("Invalid resource group name")
183-
}
184-
return nil
185-
}
186-
187-
prompt := promptui.Prompt{
188-
Label: "Enter resource group name",
189-
Validate: validate,
190-
}
191-
192-
result, err := prompt.Run()
201+
func getResourceGroup(az providers.AzClientInterface, subscriptionID string) (armresources.ResourceGroup, error) {
202+
var rg armresources.ResourceGroup
203+
log.Print("Fetching resource groups...")
204+
rgs, err := az.ListResourceGroups(context.Background(), subscriptionID)
193205

206+
rg, err = prompts.Select("Please choose the resource group you would like to use", rgs, &prompts.SelectOpt[armresources.ResourceGroup]{
207+
Field: func(rg armresources.ResourceGroup) string {
208+
return *rg.Name + " (" + *rg.Location + ")"
209+
},
210+
})
194211
if err != nil {
195-
return err.Error()
212+
return rg, fmt.Errorf("selecting resource group: %w", err)
196213
}
197214

198-
return result
215+
return rg, nil
199216
}
200217

201218
func getGhRepo() string {
202219
validate := func(input string) error {
203220
if !strings.Contains(input, "/") {
204-
return errors.New("Github repo cannot be empty")
221+
return errors.New("github repo cannot be empty")
205222
}
206223

207224
return nil
208225
}
209226

227+
defaultRepoNameWithOwner, err := providers.GetRepoNameWithOwner()
228+
if err != nil {
229+
return err.Error()
230+
}
210231
repoPrompt := promptui.Prompt{
211232
Label: "Enter github organization and repo (organization/repoName)",
212233
Validate: validate,
234+
Default: defaultRepoNameWithOwner,
213235
}
214236

215237
repo, err := repoPrompt.Run()
216238
if err != nil {
217239
return err.Error()
218240
}
219241

242+
if err := providers.IsValidGhRepo(repo); err != nil {
243+
confirmMissingRepoPrompt := promptui.Prompt{
244+
Label: "Unable to confirm this repo exists. Do you want to proceed anyway?",
245+
IsConfirm: true,
246+
}
247+
_, err := confirmMissingRepoPrompt.Run()
248+
if err != nil {
249+
repo = getGhRepo()
250+
}
251+
}
220252
return repo
221253
}
222254

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0
77
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0
88
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v3 v3.0.0-beta.2
9+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0
910
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0
1011
github.com/blang/semver/v4 v4.0.0
1112
github.com/briandowns/spinner v1.23.1
@@ -24,7 +25,6 @@ require (
2425
github.com/stretchr/testify v1.9.0
2526
github.com/yannh/kubeconform v0.6.7
2627
go.uber.org/mock v0.4.0
27-
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f
2828
golang.org/x/mod v0.20.0
2929
gopkg.in/yaml.v2 v2.4.0
3030
gopkg.in/yaml.v3 v3.0.1
@@ -142,6 +142,7 @@ require (
142142
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
143143
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
144144
golang.org/x/crypto v0.28.0 // indirect
145+
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect
145146
golang.org/x/net v0.30.0 // indirect
146147
golang.org/x/oauth2 v0.19.0 // indirect
147148
golang.org/x/sync v0.8.0 // indirect

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP
99
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
1010
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v3 v3.0.0-beta.2 h1:qiir/pptnHqp6hV8QwV+IExYIf6cPsXBfUDUXQ27t2Y=
1111
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v3 v3.0.0-beta.2/go.mod h1:jVRrRDLCOuif95HDYC23ADTMlvahB7tMdl519m9Iyjc=
12+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
13+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
14+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o=
15+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0=
16+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
17+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
1218
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 h1:UrGzkHueDwAWDdjQxC+QaXHd4tVCkISYE9j7fSSXF8k=
1319
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0/go.mod h1:qskvSQeW+cxEE2bcKYyKimB1/KiQ9xpJ99bcHY0BX6c=
1420
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
@@ -507,8 +513,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
507513
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
508514
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
509515
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
510-
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
511-
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
512516
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
513517
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
514518
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -544,8 +548,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
544548
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
545549
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
546550
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
547-
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
548-
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
549551
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
550552
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
551553
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=

pkg/prompts/prompts.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,14 @@ func Select[T any](label string, items []T, opt *SelectOpt[T]) (T, error) {
250250
selection := strings.ToLower(str)
251251
search = strings.ToLower(search)
252252

253-
return strings.Contains(selection, search)
253+
searchWords := strings.Split(search, " ")
254+
255+
for _, word := range searchWords {
256+
if !strings.Contains(selection, word) {
257+
return false
258+
}
259+
}
260+
return true
254261
}
255262

256263
// sort the default selection to top if exists

0 commit comments

Comments
 (0)