Skip to content

Commit 4cb2b03

Browse files
authored
mpg(attach): allow creating user/db when running interactively (#4655)
Signed-off-by: Akshit Garg <[email protected]>
1 parent 30f4653 commit 4cb2b03

File tree

1 file changed

+77
-14
lines changed

1 file changed

+77
-14
lines changed

internal/command/mpg/attach.go

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,58 @@ func runAttach(ctx context.Context) error {
107107
return fmt.Errorf("failed to list users: %w", err)
108108
}
109109

110-
if len(usersResponse.Data) > 0 {
111-
var userOptions []string
112-
for _, user := range usersResponse.Data {
113-
userOptions = append(userOptions, fmt.Sprintf("%s [%s]", user.Name, user.Role))
110+
var userOptions []string
111+
for _, user := range usersResponse.Data {
112+
userOptions = append(userOptions, fmt.Sprintf("%s [%s]", user.Name, user.Role))
113+
}
114+
// Add option to create new user
115+
userOptions = append(userOptions, "Create new user...")
116+
117+
var userIndex int
118+
err = prompt.Select(ctx, &userIndex, "Select user:", "", userOptions...)
119+
if err != nil {
120+
return err
121+
}
122+
123+
if userIndex == len(userOptions)-1 {
124+
// Create new user option selected
125+
var userName string
126+
err = prompt.String(ctx, &userName, "Enter username:", "", true)
127+
if err != nil {
128+
return err
129+
}
130+
if userName == "" {
131+
return fmt.Errorf("username cannot be empty")
114132
}
115133

116-
var userIndex int
117-
err = prompt.Select(ctx, &userIndex, "Select user:", "", userOptions...)
134+
// Prompt for role selection
135+
var roleIndex int
136+
roleOptions := []string{"schema_admin", "writer", "reader"}
137+
err = prompt.Select(ctx, &roleIndex, "Select user role:", "", roleOptions...)
118138
if err != nil {
119139
return err
120140
}
141+
userRole := roleOptions[roleIndex]
142+
143+
fmt.Fprintf(io.Out, "Creating user %s with role %s...\n", userName, userRole)
144+
145+
input := uiex.CreateUserWithRoleInput{
146+
UserName: userName,
147+
Role: userRole,
148+
}
149+
150+
createResponse, err := uiexClient.CreateUserWithRole(ctx, cluster.Id, input)
151+
if err != nil {
152+
return fmt.Errorf("failed to create user: %w", err)
153+
}
121154

155+
fmt.Fprintf(io.Out, "User created successfully!\n")
156+
username = createResponse.Data.Name
157+
} else if len(usersResponse.Data) > 0 {
122158
username = usersResponse.Data[userIndex].Name
123159
}
124-
// If no users found, username remains empty and will use default credentials
160+
// If no users found and create wasn't selected, username remains empty and will use default credentials.
161+
// This shouldn't be hit as fly-db and fly-user always exist and can't be deleted.
125162
}
126163

127164
// Database selection priority: flag > prompt result (if interactive) > credentials.DBName
@@ -135,18 +172,44 @@ func runAttach(ctx context.Context) error {
135172
return fmt.Errorf("failed to list databases: %w", err)
136173
}
137174

138-
if len(databasesResponse.Data) > 0 {
139-
var dbOptions []string
140-
for _, database := range databasesResponse.Data {
141-
dbOptions = append(dbOptions, database.Name)
142-
}
175+
var dbOptions []string
176+
for _, database := range databasesResponse.Data {
177+
dbOptions = append(dbOptions, database.Name)
178+
}
179+
// Add option to create new database
180+
dbOptions = append(dbOptions, "Create new database...")
143181

144-
var dbIndex int
145-
err = prompt.Select(ctx, &dbIndex, "Select database:", "", dbOptions...)
182+
var dbIndex int
183+
err = prompt.Select(ctx, &dbIndex, "Select database:", "", dbOptions...)
184+
if err != nil {
185+
return err
186+
}
187+
188+
if dbIndex == len(dbOptions)-1 {
189+
// Create new database option selected
190+
var dbName string
191+
err = prompt.String(ctx, &dbName, "Enter database name:", "", true)
146192
if err != nil {
147193
return err
148194
}
195+
if dbName == "" {
196+
return fmt.Errorf("database name cannot be empty")
197+
}
198+
199+
fmt.Fprintf(io.Out, "Creating database %s...\n", dbName)
200+
201+
input := uiex.CreateDatabaseInput{
202+
Name: dbName,
203+
}
204+
205+
createResponse, err := uiexClient.CreateDatabase(ctx, cluster.Id, input)
206+
if err != nil {
207+
return fmt.Errorf("failed to create database: %w", err)
208+
}
149209

210+
fmt.Fprintf(io.Out, "Database created successfully!\n")
211+
db = createResponse.Data.Name
212+
} else if len(databasesResponse.Data) > 0 {
150213
db = databasesResponse.Data[dbIndex].Name
151214
}
152215
}

0 commit comments

Comments
 (0)