2022-08-26 09:28:38 +00:00
package cli
import (
"fmt"
"golang.org/x/xerrors"
2023-09-07 21:28:22 +00:00
"github.com/coder/pretty"
2024-03-15 16:24:38 +00:00
"github.com/coder/serpent"
2023-09-07 21:28:22 +00:00
2023-08-18 18:55:43 +00:00
"github.com/coder/coder/v2/cli/cliui"
"github.com/coder/coder/v2/codersdk"
2022-08-26 09:28:38 +00:00
)
2024-03-17 14:45:26 +00:00
func ( r * RootCmd ) rename ( ) * serpent . Command {
2023-03-23 22:42:20 +00:00
client := new ( codersdk . Client )
2024-03-17 14:45:26 +00:00
cmd := & serpent . Command {
2022-08-26 09:28:38 +00:00
Annotations : workspaceCommand ,
Use : "rename <workspace> <new name>" ,
Short : "Rename a workspace" ,
2024-03-15 16:24:38 +00:00
Middleware : serpent . Chain (
serpent . RequireNArgs ( 2 ) ,
2023-03-23 22:42:20 +00:00
r . InitClient ( client ) ,
) ,
2024-03-15 16:24:38 +00:00
Handler : func ( inv * serpent . Invocation ) error {
2023-03-23 22:42:20 +00:00
workspace , err := namedWorkspace ( inv . Context ( ) , client , inv . Args [ 0 ] )
2022-08-26 09:28:38 +00:00
if err != nil {
return xerrors . Errorf ( "get workspace: %w" , err )
}
2023-03-23 22:42:20 +00:00
_ , _ = fmt . Fprintf ( inv . Stdout , "%s\n\n" ,
2023-09-07 21:28:22 +00:00
pretty . Sprint ( cliui . DefaultStyles . Wrap , "WARNING: A rename can result in data loss if a resource references the workspace name in the template (e.g volumes). Please backup any data before proceeding." ) ,
2022-08-26 09:28:38 +00:00
)
2023-03-23 22:42:20 +00:00
_ , _ = fmt . Fprintf ( inv . Stdout , "See: %s\n\n" , "https://coder.com/docs/coder-oss/latest/templates/resource-persistence#%EF%B8%8F-persistence-pitfalls" )
_ , err = cliui . Prompt ( inv , cliui . PromptOptions {
2022-08-26 09:28:38 +00:00
Text : fmt . Sprintf ( "Type %q to confirm rename:" , workspace . Name ) ,
Validate : func ( s string ) error {
if s == workspace . Name {
return nil
}
return xerrors . Errorf ( "Input %q does not match %q" , s , workspace . Name )
} ,
} )
if err != nil {
return err
}
2023-03-23 22:42:20 +00:00
err = client . UpdateWorkspace ( inv . Context ( ) , workspace . ID , codersdk . UpdateWorkspaceRequest {
Name : inv . Args [ 1 ] ,
2022-08-26 09:28:38 +00:00
} )
if err != nil {
return xerrors . Errorf ( "rename workspace: %w" , err )
}
2023-03-23 22:42:20 +00:00
_ , _ = fmt . Fprintf ( inv . Stdout , "Workspace %q renamed to %q\n" , workspace . Name , inv . Args [ 1 ] )
2022-08-26 09:28:38 +00:00
return nil
} ,
}
2023-03-23 22:42:20 +00:00
cmd . Options = append ( cmd . Options , cliui . SkipPromptOption ( ) )
2022-08-26 09:28:38 +00:00
return cmd
}