2023-01-19 21:56:41 +00:00
package cli
import (
"fmt"
2023-10-19 22:16:15 +00:00
"net/http"
2023-01-19 21:56:41 +00:00
"time"
2023-08-09 11:00:25 +00:00
"golang.org/x/xerrors"
2023-08-18 18:55:43 +00:00
"github.com/coder/coder/v2/cli/cliui"
"github.com/coder/coder/v2/codersdk"
2023-10-19 22:16:15 +00:00
"github.com/coder/pretty"
2024-03-15 16:24:38 +00:00
"github.com/coder/serpent"
2023-01-19 21:56:41 +00:00
)
2024-03-17 14:45:26 +00:00
func ( r * RootCmd ) restart ( ) * serpent . Command {
2023-07-13 10:56:02 +00:00
var parameterFlags workspaceParameterFlags
2023-03-23 22:42:20 +00:00
client := new ( codersdk . Client )
2024-03-17 14:45:26 +00:00
cmd := & serpent . Command {
2023-01-19 21:56:41 +00:00
Annotations : workspaceCommand ,
Use : "restart <workspace>" ,
Short : "Restart a workspace" ,
2024-03-15 16:24:38 +00:00
Middleware : serpent . Chain (
serpent . RequireNArgs ( 1 ) ,
2023-03-23 22:42:20 +00:00
r . InitClient ( client ) ,
) ,
2024-03-15 16:24:38 +00:00
Options : serpent . OptionSet { cliui . SkipPromptOption ( ) } ,
Handler : func ( inv * serpent . Invocation ) error {
2023-03-23 22:42:20 +00:00
ctx := inv . Context ( )
out := inv . Stdout
2023-01-19 21:56:41 +00:00
2023-07-13 10:56:02 +00:00
workspace , err := namedWorkspace ( inv . Context ( ) , client , inv . Args [ 0 ] )
if err != nil {
return err
}
2023-11-02 19:41:34 +00:00
startReq , err := buildWorkspaceStartRequest ( inv , client , workspace , parameterFlags , WorkspaceRestart )
2023-01-19 21:56:41 +00:00
if err != nil {
return err
}
2023-07-13 10:56:02 +00:00
_ , err = cliui . Prompt ( inv , cliui . PromptOptions {
2024-01-29 20:56:43 +00:00
Text : "Restart workspace?" ,
2023-07-13 10:56:02 +00:00
IsConfirm : true ,
} )
2023-01-19 21:56:41 +00:00
if err != nil {
return err
}
build , err := client . CreateWorkspaceBuild ( ctx , workspace . ID , codersdk . CreateWorkspaceBuildRequest {
Transition : codersdk . WorkspaceTransitionStop ,
} )
if err != nil {
return err
}
2023-11-02 19:41:34 +00:00
2023-01-19 21:56:41 +00:00
err = cliui . WorkspaceBuild ( ctx , out , client , build . ID )
if err != nil {
return err
}
2023-11-02 19:41:34 +00:00
build , err = client . CreateWorkspaceBuild ( ctx , workspace . ID , startReq )
2023-10-19 22:16:15 +00:00
// It's possible for a workspace build to fail due to the template requiring starting
// workspaces with the active version.
2023-12-09 05:03:46 +00:00
if cerr , ok := codersdk . AsError ( err ) ; ok && cerr . StatusCode ( ) == http . StatusForbidden {
2024-01-23 17:01:44 +00:00
_ , _ = fmt . Fprintln ( inv . Stdout , "Unable to restart the workspace with the template version from the last build. Policy may require you to restart with the current active template version." )
2023-11-02 19:41:34 +00:00
build , err = startWorkspace ( inv , client , workspace , parameterFlags , WorkspaceUpdate )
2023-10-19 22:16:15 +00:00
if err != nil {
return xerrors . Errorf ( "start workspace with active template version: %w" , err )
}
} else if err != nil {
2023-01-19 21:56:41 +00:00
return err
}
2023-10-19 22:16:15 +00:00
2023-01-19 21:56:41 +00:00
err = cliui . WorkspaceBuild ( ctx , out , client , build . ID )
if err != nil {
return err
}
2023-09-07 21:28:22 +00:00
_ , _ = fmt . Fprintf ( out ,
"\nThe %s workspace has been restarted at %s!\n" ,
pretty . Sprint ( cliui . DefaultStyles . Keyword , workspace . Name ) , cliui . Timestamp ( time . Now ( ) ) ,
)
2023-01-19 21:56:41 +00:00
return nil
} ,
}
2023-11-02 19:41:34 +00:00
cmd . Options = append ( cmd . Options , parameterFlags . allOptions ( ) ... )
2023-01-19 21:56:41 +00:00
return cmd
}