diff --git a/cmd/instance_pause.go b/cmd/instance_pause.go new file mode 100644 index 0000000..28a9e01 --- /dev/null +++ b/cmd/instance_pause.go @@ -0,0 +1,47 @@ +package cmd + +import ( + wisski_distillery "github.com/FAU-CDI/wisski-distillery" + "github.com/FAU-CDI/wisski-distillery/internal/cli" +) + +// InstancePause is the 'instance_pause' command +var InstancePause wisski_distillery.Command = instancepause{} + +type instancepause struct { + Stop bool `short:"d" long:"stop" description:"stop instance"` + Start bool `short:"u" long:"start" description:"start (or restart) instance"` + Positionals struct { + Slug string `positional-arg-name:"slug" required:"1-1" description:"name of instance to purge"` + } `positional-args:"true"` +} + +func (instancepause) Description() wisski_distillery.Description { + return wisski_distillery.Description{ + Requirements: cli.Requirements{ + NeedsDistillery: true, + }, + Command: "instance_pause", + Description: "stops or starts a single instance", + } +} + +func (i instancepause) AfterParse() error { + if i.Stop == i.Start { + return errStopStartExcluded + } + return nil +} + +func (i instancepause) Run(context wisski_distillery.Context) error { + instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug) + if err != nil { + return err + } + + if i.Stop { + return instance.Barrel().Stack().Down(context.Context, context.Stdout) + } else { + return instance.Barrel().Stack().Up(context.Context, context.Stdout) + } +} diff --git a/cmd/wdcli/main.go b/cmd/wdcli/main.go index 0db0d1c..a2b85ad 100644 --- a/cmd/wdcli/main.go +++ b/cmd/wdcli/main.go @@ -39,6 +39,7 @@ func init() { wdcli.Register(cmd.Ls) wdcli.Register(cmd.Info) wdcli.Register(cmd.InstanceLock) + wdcli.Register(cmd.InstancePause) // instance tasks wdcli.Register(cmd.Shell) diff --git a/internal/dis/component/control/admin/html/instance.html b/internal/dis/component/control/admin/html/instance.html index bedca9c..3b21665 100644 --- a/internal/dis/component/control/admin/html/instance.html +++ b/internal/dis/component/control/admin/html/instance.html @@ -48,6 +48,15 @@ {{ .Info.Running }} +
+ + +
+ diff --git a/internal/dis/component/control/admin/socket.go b/internal/dis/component/control/admin/socket.go index 1918282..f858f4f 100644 --- a/internal/dis/component/control/admin/socket.go +++ b/internal/dis/component/control/admin/socket.go @@ -50,6 +50,16 @@ var socketInstanceActions = map[string]InstanceAction{ return instance.Drush().Cron(ctx, str) }, }, + "start": { + HandleInteractive: func(ctx context.Context, _ *Admin, instance *wisski.WissKI, out io.Writer, params ...string) error { + return instance.Barrel().Stack().Up(ctx, out) + }, + }, + "stop": { + HandleInteractive: func(ctx context.Context, _ *Admin, instance *wisski.WissKI, out io.Writer, params ...string) error { + return instance.Barrel().Stack().Down(ctx, out) + }, + }, } func (admin *Admin) serveSocket(conn httpx.WebSocketConnection) {